mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-02 22:17:06 +08:00
660 lines
196 KiB
Go
660 lines
196 KiB
Go
//
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
//
|
|
// This is a commercial product and requires a license to operate.
|
|
// A trial license can be obtained at https://unidoc.io
|
|
//
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
//
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
package bitmap ;import (_ba "encoding/binary";_fg "github.com/stretchr/testify/require";_g "github.com/unidoc/unipdf/v3/common";_ee "github.com/unidoc/unipdf/v3/internal/bitwise";_a "github.com/unidoc/unipdf/v3/internal/imageutil";_e "github.com/unidoc/unipdf/v3/internal/jbig2/basic";
|
|
_b "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_ce "image";_ae "math";_dd "sort";_c "strings";_d "testing";);func NewWithUnpaddedData (width ,height int ,data []byte )(*Bitmap ,error ){const _gc ="\u004e\u0065\u0077\u0057it\u0068\u0055\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";
|
|
_bbc :=_dda (width ,height );_bbc .Data =data ;if _caca :=((width *height )+7)>>3;len (data )< _caca {return nil ,_b .Errorf (_gc ,"\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 ),_caca );
|
|
};if _dgb :=_bbc .addPadBits ();_dgb !=nil {return nil ,_b .Wrap (_dgb ,_gc ,"");};return _bbc ,nil ;};func (_fage *Bitmaps )String ()string {_eegeg :=_c .Builder {};for _ ,_bbge :=range _fage .Values {_eegeg .WriteString (_bbge .String ());_eegeg .WriteRune ('\n');
|
|
};return _eegeg .String ();};func _aa (_ada *Bitmap ,_gebe ...int )(_bde *Bitmap ,_bbg error ){const _acb ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0043\u0061\u0073\u0063\u0061\u0064\u0065";if _ada ==nil {return nil ,_b .Error (_acb ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if len (_gebe )==0||len (_gebe )> 4{return nil ,_b .Error (_acb ,"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 _gebe [0]<=0{_g .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");_bde ,_bbg =_daef (nil ,_ada );if _bbg !=nil {return nil ,_b .Wrap (_bbg ,_acb ,"l\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030");
|
|
};return _bde ,nil ;};_efa :=_aag ();_bde =_ada ;for _aaf ,_agf :=range _gebe {if _agf <=0{break ;};_bde ,_bbg =_cbf (_bde ,_agf ,_efa );if _bbg !=nil {return nil ,_b .Wrapf (_bbg ,_acb ,"\u006c\u0065\u0076\u0065\u006c\u0025\u0064\u0020\u0072\u0065\u0064\u0075c\u0074\u0069\u006f\u006e",_aaf );
|
|
};};return _bde ,nil ;};func Copy (d ,s *Bitmap )(*Bitmap ,error ){return _daef (d ,s )};func (_afgc *Bitmap )SetByte (index int ,v byte )error {if index > len (_afgc .Data )-1||index < 0{return _b .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 );
|
|
};_afgc .Data [index ]=v ;return nil ;};var (_ddge =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};_feba =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);type fillSegment struct{_gbdag int ;_fddc int ;_ecggb int ;_ccbb int ;};func CorrelationScoreThresholded (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab ,downcount []int ,scoreThreshold float32 )(bool ,error ){const _cba ="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 ,_b .Error (_cba ,"\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 ,_b .Error (_cba ,"\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 ,_b .Error (_cba ,"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 ,_b .Error (_cba ,"\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 ,_b .Error (_cba ,"p\u0072\u006f\u0076\u0069de\u0064 \u006e\u0069\u006c\u0020\u0027s\u0075\u006d\u0074\u0061\u0062\u0027");
|
|
};_fgfdf ,_efab :=bm1 .Width ,bm1 .Height ;_cedeb ,_gfgb :=bm2 .Width ,bm2 .Height ;if _e .Abs (_fgfdf -_cedeb )> maxDiffW {return false ,nil ;};if _e .Abs (_efab -_gfgb )> maxDiffH {return false ,nil ;};_gdgd :=int (delX +_e .Sign (delX )*0.5);_faaa :=int (delY +_e .Sign (delY )*0.5);
|
|
_cdadd :=int (_ae .Ceil (_ae .Sqrt (float64 (scoreThreshold )*float64 (area1 )*float64 (area2 ))));_gfgbf :=bm2 .RowStride ;_cbfa :=_fbfae (_faaa ,0);_gcab :=_dcagf (_gfgb +_faaa ,_efab );_ceaa :=bm1 .RowStride *_cbfa ;_gdffb :=bm2 .RowStride *(_cbfa -_faaa );
|
|
var _eaab int ;if _gcab <=_efab {_eaab =downcount [_gcab -1];};_bcab :=_fbfae (_gdgd ,0);_bebc :=_dcagf (_cedeb +_gdgd ,_fgfdf );var _fbaaf ,_eegc int ;if _gdgd >=8{_fbaaf =_gdgd >>3;_ceaa +=_fbaaf ;_bcab -=_fbaaf <<3;_bebc -=_fbaaf <<3;_gdgd &=7;}else if _gdgd <=-8{_eegc =-((_gdgd +7)>>3);
|
|
_gdffb +=_eegc ;_gfgbf -=_eegc ;_gdgd +=_eegc <<3;};var (_ccfg ,_cfcb ,_cfec int ;_eafe ,_fffd ,_gaag byte ;);if _bcab >=_bebc ||_cbfa >=_gcab {return false ,nil ;};_eacd :=(_bebc +7)>>3;switch {case _gdgd ==0:for _cfcb =_cbfa ;_cfcb < _gcab ;_cfcb ,_ceaa ,_gdffb =_cfcb +1,_ceaa +bm1 .RowStride ,_gdffb +bm2 .RowStride {for _cfec =0;
|
|
_cfec < _eacd ;_cfec ++{_eafe =bm1 .Data [_ceaa +_cfec ]&bm2 .Data [_gdffb +_cfec ];_ccfg +=tab [_eafe ];};if _ccfg >=_cdadd {return true ,nil ;};if _gae :=_ccfg +downcount [_cfcb ]-_eaab ;_gae < _cdadd {return false ,nil ;};};case _gdgd > 0&&_gfgbf < _eacd :for _cfcb =_cbfa ;
|
|
_cfcb < _gcab ;_cfcb ,_ceaa ,_gdffb =_cfcb +1,_ceaa +bm1 .RowStride ,_gdffb +bm2 .RowStride {_fffd =bm1 .Data [_ceaa ];_gaag =bm2 .Data [_gdffb ]>>uint (_gdgd );_eafe =_fffd &_gaag ;_ccfg +=tab [_eafe ];for _cfec =1;_cfec < _gfgbf ;_cfec ++{_fffd =bm1 .Data [_ceaa +_cfec ];
|
|
_gaag =bm2 .Data [_gdffb +_cfec ]>>uint (_gdgd )|bm2 .Data [_gdffb +_cfec -1]<<uint (8-_gdgd );_eafe =_fffd &_gaag ;_ccfg +=tab [_eafe ];};_fffd =bm1 .Data [_ceaa +_cfec ];_gaag =bm2 .Data [_gdffb +_cfec -1]<<uint (8-_gdgd );_eafe =_fffd &_gaag ;_ccfg +=tab [_eafe ];
|
|
if _ccfg >=_cdadd {return true ,nil ;}else if _ccfg +downcount [_cfcb ]-_eaab < _cdadd {return false ,nil ;};};case _gdgd > 0&&_gfgbf >=_eacd :for _cfcb =_cbfa ;_cfcb < _gcab ;_cfcb ,_ceaa ,_gdffb =_cfcb +1,_ceaa +bm1 .RowStride ,_gdffb +bm2 .RowStride {_fffd =bm1 .Data [_ceaa ];
|
|
_gaag =bm2 .Data [_gdffb ]>>uint (_gdgd );_eafe =_fffd &_gaag ;_ccfg +=tab [_eafe ];for _cfec =1;_cfec < _eacd ;_cfec ++{_fffd =bm1 .Data [_ceaa +_cfec ];_gaag =bm2 .Data [_gdffb +_cfec ]>>uint (_gdgd );_gaag |=bm2 .Data [_gdffb +_cfec -1]<<uint (8-_gdgd );
|
|
_eafe =_fffd &_gaag ;_ccfg +=tab [_eafe ];};if _ccfg >=_cdadd {return true ,nil ;}else if _ccfg +downcount [_cfcb ]-_eaab < _cdadd {return false ,nil ;};};case _eacd < _gfgbf :for _cfcb =_cbfa ;_cfcb < _gcab ;_cfcb ,_ceaa ,_gdffb =_cfcb +1,_ceaa +bm1 .RowStride ,_gdffb +bm2 .RowStride {for _cfec =0;
|
|
_cfec < _eacd ;_cfec ++{_fffd =bm1 .Data [_ceaa +_cfec ];_gaag =bm2 .Data [_gdffb +_cfec ]<<uint (-_gdgd );_gaag |=bm2 .Data [_gdffb +_cfec +1]>>uint (8+_gdgd );_eafe =_fffd &_gaag ;_ccfg +=tab [_eafe ];};if _ccfg >=_cdadd {return true ,nil ;}else if _dcgf :=_ccfg +downcount [_cfcb ]-_eaab ;
|
|
_dcgf < _cdadd {return false ,nil ;};};case _gfgbf >=_eacd :for _cfcb =_cbfa ;_cfcb < _gcab ;_cfcb ,_ceaa ,_gdffb =_cfcb +1,_ceaa +bm1 .RowStride ,_gdffb +bm2 .RowStride {for _cfec =0;_cfec < _eacd ;_cfec ++{_fffd =bm1 .Data [_ceaa +_cfec ];_gaag =bm2 .Data [_gdffb +_cfec ]<<uint (-_gdgd );
|
|
_gaag |=bm2 .Data [_gdffb +_cfec +1]>>uint (8+_gdgd );_eafe =_fffd &_gaag ;_ccfg +=tab [_eafe ];};_fffd =bm1 .Data [_ceaa +_cfec ];_gaag =bm2 .Data [_gdffb +_cfec ]<<uint (-_gdgd );_eafe =_fffd &_gaag ;_ccfg +=tab [_eafe ];if _ccfg >=_cdadd {return true ,nil ;
|
|
}else if _ccfg +downcount [_cfcb ]-_eaab < _cdadd {return false ,nil ;};};};_baaf :=float32 (_ccfg )*float32 (_ccfg )/(float32 (area1 )*float32 (area2 ));if _baaf >=scoreThreshold {_g .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",_ccfg ,_cdadd ,_baaf ,scoreThreshold );
|
|
};return false ,nil ;};func _becf (_adgg ,_cbcfe *Bitmap ,_cgcd *Selection )(*Bitmap ,error ){const _fcbg ="c\u006c\u006f\u0073\u0065\u0042\u0069\u0074\u006d\u0061\u0070";var _abadc error ;if _adgg ,_abadc =_adec (_adgg ,_cbcfe ,_cgcd );_abadc !=nil {return nil ,_abadc ;
|
|
};_afbe ,_abadc :=_cgbb (nil ,_cbcfe ,_cgcd );if _abadc !=nil {return nil ,_b .Wrap (_abadc ,_fcbg ,"");};if _ ,_abadc =_edab (_adgg ,_afbe ,_cgcd );_abadc !=nil {return nil ,_b .Wrap (_abadc ,_fcbg ,"");};return _adgg ,nil ;};func _fbfae (_adg ,_fge int )int {if _adg > _fge {return _adg ;
|
|
};return _fge ;};func CorrelationScoreSimple (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_gged float64 ,_aee error ){const _bdefc ="\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 _gged ,_b .Error (_bdefc ,"n\u0069l\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0073 \u0070\u0072\u006f\u0076id\u0065\u0064");};if tab ==nil {return _gged ,_b .Error (_bdefc ,"\u0074\u0061\u0062\u0020\u0075\u006e\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if area1 ==0||area2 ==0{return _gged ,_b .Error (_bdefc ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0061\u0072e\u0061\u0073\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u003e\u0020\u0030");};_debd ,_baeb :=bm1 .Width ,bm1 .Height ;_bcba ,_fgbb :=bm2 .Width ,bm2 .Height ;
|
|
if _cdecg (_debd -_bcba )> maxDiffW {return 0,nil ;};if _cdecg (_baeb -_fgbb )> maxDiffH {return 0,nil ;};var _fgcg ,_eec int ;if delX >=0{_fgcg =int (delX +0.5);}else {_fgcg =int (delX -0.5);};if delY >=0{_eec =int (delY +0.5);}else {_eec =int (delY -0.5);
|
|
};_fcad :=bm1 .createTemplate ();if _aee =_fcad .RasterOperation (_fgcg ,_eec ,_bcba ,_fgbb ,PixSrc ,bm2 ,0,0);_aee !=nil {return _gged ,_b .Wrap (_aee ,_bdefc ,"\u0062m\u0032 \u0074\u006f\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065");};if _aee =_fcad .RasterOperation (0,0,_debd ,_baeb ,PixSrcAndDst ,bm1 ,0,0);
|
|
_aee !=nil {return _gged ,_b .Wrap (_aee ,_bdefc ,"b\u006d\u0031\u0020\u0061\u006e\u0064\u0020\u0062\u006d\u0054");};_dceba :=_fcad .countPixels ();_gged =float64 (_dceba )*float64 (_dceba )/(float64 (area1 )*float64 (area2 ));return _gged ,nil ;};func (_beag *Bitmaps )GetBitmap (i int )(*Bitmap ,error ){const _babb ="\u0047e\u0074\u0042\u0069\u0074\u006d\u0061p";
|
|
if _beag ==nil {return nil ,_b .Error (_babb ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");};if i > len (_beag .Values )-1{return nil ,_b .Errorf (_babb ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _beag .Values [i ],nil ;};func (_abfgb *Bitmap )ConnComponents (bms *Bitmaps ,connectivity int )(_cdbgd *Boxes ,_bcf error ){const _eag ="B\u0069\u0074\u006d\u0061p.\u0043o\u006e\u006e\u0043\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0073";if _abfgb ==nil {return nil ,_b .Error (_eag ,"\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 ,_b .Error (_eag ,"\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 _cdbgd ,_bcf =_abfgb .connComponentsBB (connectivity );
|
|
_bcf !=nil {return nil ,_b .Wrap (_bcf ,_eag ,"");};}else {if _cdbgd ,_bcf =_abfgb .connComponentsBitmapsBB (bms ,connectivity );_bcf !=nil {return nil ,_b .Wrap (_bcf ,_eag ,"");};};return _cdbgd ,nil ;};func (_efd Points )YSorter ()func (_fcfg ,_aaab int )bool {return func (_aca ,_becad int )bool {return _efd [_aca ].Y < _efd [_becad ].Y };
|
|
};func (_gecef *ClassedPoints )validateIntSlice ()error {const _ddecd ="\u0076\u0061l\u0069\u0064\u0061t\u0065\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065";for _ ,_eefe :=range _gecef .IntSlice {if _eefe >=(_gecef .Points .Size ()){return _b .Errorf (_ddecd ,"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",_eefe ,_gecef .Points .Size ());
|
|
};};return nil ;};func NewWithData (width ,height int ,data []byte )(*Bitmap ,error ){const _gec ="N\u0065\u0077\u0057\u0069\u0074\u0068\u0044\u0061\u0074\u0061";_gdec :=_dda (width ,height );_gdec .Data =data ;if len (data )< height *_gdec .RowStride {return nil ,_b .Errorf (_gec ,"\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 *_gdec .RowStride );
|
|
};return _gdec ,nil ;};func _bebe (_fcdb *Bitmap ,_abdd ,_ecaf ,_bggc ,_fadbb int ,_ceag RasterOperator ,_bdfcg *Bitmap ,_cdd ,_bbaeb int )error {var (_acgb bool ;_ggfg bool ;_bgaf byte ;_egf int ;_dgdc int ;_fgcd int ;_acaa int ;_fbac bool ;_ffga int ;
|
|
_dcac int ;_fbda int ;_fegc bool ;_fbae byte ;_ebae int ;_bge int ;_aebd int ;_egbge byte ;_cdce int ;_bgfe int ;_gfbd uint ;_bdadd uint ;_fbcee byte ;_gfcaf shift ;_gddca bool ;_fdga bool ;_efcb ,_caef int ;);if _cdd &7!=0{_bgfe =8-(_cdd &7);};if _abdd &7!=0{_dgdc =8-(_abdd &7);
|
|
};if _bgfe ==0&&_dgdc ==0{_fbcee =_feba [0];}else {if _dgdc > _bgfe {_gfbd =uint (_dgdc -_bgfe );}else {_gfbd =uint (8-(_bgfe -_dgdc ));};_bdadd =8-_gfbd ;_fbcee =_feba [_gfbd ];};if (_abdd &7)!=0{_acgb =true ;_egf =8-(_abdd &7);_bgaf =_feba [_egf ];_fgcd =_fcdb .RowStride *_ecaf +(_abdd >>3);
|
|
_acaa =_bdfcg .RowStride *_bbaeb +(_cdd >>3);_cdce =8-(_cdd &7);if _egf > _cdce {_gfcaf =_gbfgc ;if _bggc >=_bgfe {_gddca =true ;};}else {_gfcaf =_fcac ;};};if _bggc < _egf {_ggfg =true ;_bgaf &=_ddge [8-_egf +_bggc ];};if !_ggfg {_ffga =(_bggc -_egf )>>3;
|
|
if _ffga !=0{_fbac =true ;_dcac =_fcdb .RowStride *_ecaf +((_abdd +_dgdc )>>3);_fbda =_bdfcg .RowStride *_bbaeb +((_cdd +_dgdc )>>3);};};_ebae =(_abdd +_bggc )&7;if !(_ggfg ||_ebae ==0){_fegc =true ;_fbae =_ddge [_ebae ];_bge =_fcdb .RowStride *_ecaf +((_abdd +_dgdc )>>3)+_ffga ;
|
|
_aebd =_bdfcg .RowStride *_bbaeb +((_cdd +_dgdc )>>3)+_ffga ;if _ebae > int (_bdadd ){_fdga =true ;};};switch _ceag {case PixSrc :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );
|
|
};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],_egbge ,_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );
|
|
_fcdb .Data [_dcac +_caef ]=_egbge ;};_dcac +=_fcdb .RowStride ;_fbda +=_bdfcg .RowStride ;};};if _fegc {for _efcb =0;_efcb < _fadbb ;_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );
|
|
};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],_egbge ,_fbae );_bge +=_fcdb .RowStride ;_aebd +=_bdfcg .RowStride ;};};case PixNotSrc :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );
|
|
};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],^_egbge ,_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );
|
|
_fcdb .Data [_dcac +_caef ]=^_egbge ;};_dcac +=_fcdb .RowStride ;_fbda +=_bdfcg .RowStride ;};};if _fegc {for _efcb =0;_efcb < _fadbb ;_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );
|
|
};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],^_egbge ,_fbae );_bge +=_fcdb .RowStride ;_aebd +=_bdfcg .RowStride ;};};case PixSrcOrDst :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );
|
|
};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],_egbge |_fcdb .Data [_fgcd ],_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;
|
|
_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );_fcdb .Data [_dcac +_caef ]|=_egbge ;};_dcac +=_fcdb .RowStride ;_fbda +=_bdfcg .RowStride ;};};if _fegc {for _efcb =0;_efcb < _fadbb ;
|
|
_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],_egbge |_fcdb .Data [_bge ],_fbae );_bge +=_fcdb .RowStride ;_aebd +=_bdfcg .RowStride ;
|
|
};};case PixSrcAndDst :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;
|
|
};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],_egbge &_fcdb .Data [_fgcd ],_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );
|
|
_fcdb .Data [_dcac +_caef ]&=_egbge ;};_dcac +=_fcdb .RowStride ;_fbda +=_bdfcg .RowStride ;};};if _fegc {for _efcb =0;_efcb < _fadbb ;_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );
|
|
};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],_egbge &_fcdb .Data [_bge ],_fbae );_bge +=_fcdb .RowStride ;_aebd +=_bdfcg .RowStride ;};};case PixSrcXorDst :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;
|
|
if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],_egbge ^_fcdb .Data [_fgcd ],_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;
|
|
};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );_fcdb .Data [_dcac +_caef ]^=_egbge ;};_dcac +=_fcdb .RowStride ;
|
|
_fbda +=_bdfcg .RowStride ;};};if _fegc {for _efcb =0;_efcb < _fadbb ;_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],_egbge ^_fcdb .Data [_bge ],_fbae );
|
|
_bge +=_fcdb .RowStride ;_aebd +=_bdfcg .RowStride ;};};case PixNotSrcOrDst :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );
|
|
};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],^_egbge |_fcdb .Data [_fgcd ],_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;
|
|
_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );_fcdb .Data [_dcac +_caef ]|=^_egbge ;};_dcac +=_fcdb .RowStride ;_fbda +=_bdfcg .RowStride ;};};if _fegc {for _efcb =0;_efcb < _fadbb ;
|
|
_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],^_egbge |_fcdb .Data [_bge ],_fbae );_bge +=_fcdb .RowStride ;_aebd +=_bdfcg .RowStride ;
|
|
};};case PixNotSrcAndDst :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;
|
|
};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],^_egbge &_fcdb .Data [_fgcd ],_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );
|
|
_fcdb .Data [_dcac +_caef ]&=^_egbge ;};_dcac +=_fcdb .RowStride ;_fbda +=_bdfcg .RowStride ;};};if _fegc {for _efcb =0;_efcb < _fadbb ;_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );
|
|
};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],^_egbge &_fcdb .Data [_bge ],_fbae );_bge +=_fcdb .RowStride ;_aebd +=_bdfcg .RowStride ;};};case PixSrcOrNotDst :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;
|
|
if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],_egbge |^_fcdb .Data [_fgcd ],_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;
|
|
};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );_fcdb .Data [_dcac +_caef ]=_egbge |^_fcdb .Data [_dcac +_caef ];
|
|
};_dcac +=_fcdb .RowStride ;_fbda +=_bdfcg .RowStride ;};};if _fegc {for _efcb =0;_efcb < _fadbb ;_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],_egbge |^_fcdb .Data [_bge ],_fbae );
|
|
_bge +=_fcdb .RowStride ;_aebd +=_bdfcg .RowStride ;};};case PixSrcAndNotDst :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );
|
|
};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],_egbge &^_fcdb .Data [_fgcd ],_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;
|
|
_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );_fcdb .Data [_dcac +_caef ]=_egbge &^_fcdb .Data [_dcac +_caef ];};_dcac +=_fcdb .RowStride ;_fbda +=_bdfcg .RowStride ;};};if _fegc {for _efcb =0;
|
|
_efcb < _fadbb ;_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],_egbge &^_fcdb .Data [_bge ],_fbae );_bge +=_fcdb .RowStride ;_aebd +=_bdfcg .RowStride ;
|
|
};};case PixNotPixSrcOrDst :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;
|
|
};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],^(_egbge |_fcdb .Data [_fgcd ]),_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );
|
|
_fcdb .Data [_dcac +_caef ]=^(_egbge |_fcdb .Data [_dcac +_caef ]);};_dcac +=_fcdb .RowStride ;_fbda +=_bdfcg .RowStride ;};};if _fegc {for _efcb =0;_efcb < _fadbb ;_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );
|
|
};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],^(_egbge |_fcdb .Data [_bge ]),_fbae );_bge +=_fcdb .RowStride ;_aebd +=_bdfcg .RowStride ;};};case PixNotPixSrcAndDst :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;
|
|
if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],^(_egbge &_fcdb .Data [_fgcd ]),_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;
|
|
};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );_fcdb .Data [_dcac +_caef ]=^(_egbge &_fcdb .Data [_dcac +_caef ]);
|
|
};_dcac +=_fcdb .RowStride ;_fbda +=_bdfcg .RowStride ;};};if _fegc {for _efcb =0;_efcb < _fadbb ;_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],^(_egbge &_fcdb .Data [_bge ]),_fbae );
|
|
_bge +=_fcdb .RowStride ;_aebd +=_bdfcg .RowStride ;};};case PixNotPixSrcXorDst :if _acgb {for _efcb =0;_efcb < _fadbb ;_efcb ++{if _gfcaf ==_gbfgc {_egbge =_bdfcg .Data [_acaa ]<<_gfbd ;if _gddca {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_acaa +1]>>_bdadd ,_fbcee );
|
|
};}else {_egbge =_bdfcg .Data [_acaa ]>>_bdadd ;};_fcdb .Data [_fgcd ]=_fgcdb (_fcdb .Data [_fgcd ],^(_egbge ^_fcdb .Data [_fgcd ]),_bgaf );_fgcd +=_fcdb .RowStride ;_acaa +=_bdfcg .RowStride ;};};if _fbac {for _efcb =0;_efcb < _fadbb ;_efcb ++{for _caef =0;
|
|
_caef < _ffga ;_caef ++{_egbge =_fgcdb (_bdfcg .Data [_fbda +_caef ]<<_gfbd ,_bdfcg .Data [_fbda +_caef +1]>>_bdadd ,_fbcee );_fcdb .Data [_dcac +_caef ]=^(_egbge ^_fcdb .Data [_dcac +_caef ]);};_dcac +=_fcdb .RowStride ;_fbda +=_bdfcg .RowStride ;};};
|
|
if _fegc {for _efcb =0;_efcb < _fadbb ;_efcb ++{_egbge =_bdfcg .Data [_aebd ]<<_gfbd ;if _fdga {_egbge =_fgcdb (_egbge ,_bdfcg .Data [_aebd +1]>>_bdadd ,_fbcee );};_fcdb .Data [_bge ]=_fgcdb (_fcdb .Data [_bge ],^(_egbge ^_fcdb .Data [_bge ]),_fbae );_bge +=_fcdb .RowStride ;
|
|
_aebd +=_bdfcg .RowStride ;};};default:_g .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",_ceag );return _b .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 init (){for _bagb :=0;_bagb < 256;_bagb ++{_fcbf [_bagb ]=uint8 (_bagb &0x1)+(uint8 (_bagb >>1)&0x1)+(uint8 (_bagb >>2)&0x1)+(uint8 (_bagb >>3)&0x1)+(uint8 (_bagb >>4)&0x1)+(uint8 (_bagb >>5)&0x1)+(uint8 (_bagb >>6)&0x1)+(uint8 (_bagb >>7)&0x1);
|
|
};};func (_ged *Bitmap )InverseData (){_ged .inverseData ()};func (_fgcf *Bitmap )ToImage ()_ce .Image {_fggd ,_ggdc :=_a .NewImage (_fgcf .Width ,_fgcf .Height ,1,1,_fgcf .Data ,nil ,nil );if _ggdc !=nil {_g .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",_ggdc );
|
|
};return _fggd ;};type MorphProcess struct{Operation MorphOperation ;Arguments []int ;};func _daed (_bbacd ,_feb *Bitmap ,_efbc ,_edf ,_geff ,_bdd ,_fagb ,_aeag ,_dcfd ,_fdcb int ,_eedb CombinationOperator )error {var _fac int ;_fbeg :=func (){_fac ++;
|
|
_geff +=_feb .RowStride ;_bdd +=_bbacd .RowStride ;_fagb +=_bbacd .RowStride };for _fac =_efbc ;_fac < _edf ;_fbeg (){var _dded uint16 ;_eabc :=_geff ;for _bbaf :=_bdd ;_bbaf <=_fagb ;_bbaf ++{_febd ,_bgaa :=_feb .GetByte (_eabc );if _bgaa !=nil {return _bgaa ;
|
|
};_edc ,_bgaa :=_bbacd .GetByte (_bbaf );if _bgaa !=nil {return _bgaa ;};_dded =(_dded |uint16 (_edc ))<<uint (_fdcb );_edc =byte (_dded >>8);if _bbaf ==_fagb {_edc =_eeff (uint (_aeag ),_edc );};if _bgaa =_feb .SetByte (_eabc ,_cee (_febd ,_edc ,_eedb ));
|
|
_bgaa !=nil {return _bgaa ;};_eabc ++;_dded <<=uint (_dcfd );};};return nil ;};type BoundaryCondition int ;func _eafb ()(_cedf [256]uint16 ){for _fbfe :=0;_fbfe < 256;_fbfe ++{if _fbfe &0x01!=0{_cedf [_fbfe ]|=0x3;};if _fbfe &0x02!=0{_cedf [_fbfe ]|=0xc;
|
|
};if _fbfe &0x04!=0{_cedf [_fbfe ]|=0x30;};if _fbfe &0x08!=0{_cedf [_fbfe ]|=0xc0;};if _fbfe &0x10!=0{_cedf [_fbfe ]|=0x300;};if _fbfe &0x20!=0{_cedf [_fbfe ]|=0xc00;};if _fbfe &0x40!=0{_cedf [_fbfe ]|=0x3000;};if _fbfe &0x80!=0{_cedf [_fbfe ]|=0xc000;
|
|
};};return _cedf ;};func _cdb ()(_feef [256]uint32 ){for _dcd :=0;_dcd < 256;_dcd ++{if _dcd &0x01!=0{_feef [_dcd ]|=0xf;};if _dcd &0x02!=0{_feef [_dcd ]|=0xf0;};if _dcd &0x04!=0{_feef [_dcd ]|=0xf00;};if _dcd &0x08!=0{_feef [_dcd ]|=0xf000;};if _dcd &0x10!=0{_feef [_dcd ]|=0xf0000;
|
|
};if _dcd &0x20!=0{_feef [_dcd ]|=0xf00000;};if _dcd &0x40!=0{_feef [_dcd ]|=0xf000000;};if _dcd &0x80!=0{_feef [_dcd ]|=0xf0000000;};};return _feef ;};func (_dfgb Points )Get (i int )(Point ,error ){if i > len (_dfgb )-1{return Point {},_b .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 _dfgb [i ],nil ;};func (_fbfc *Points )AddPoint (x ,y float32 ){*_fbfc =append (*_fbfc ,Point {x ,y })};const (Vanilla Color =iota ;Chocolate ;);func (_dgd *ClassedPoints )GetIntYByClass (i int )(int ,error ){const _gffb ="\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 >=_dgd .IntSlice .Size (){return 0,_b .Errorf (_gffb ,"\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 (_dgd .YAtIndex (i )),nil ;};func (_ecacb *Bitmap )nextOnPixelLow (_dbd ,_fadb ,_bgag ,_bcgb ,_abg int )(_fefc _ce .Point ,_fgab bool ,_cdcc error ){const _afc ="B\u0069\u0074\u006d\u0061p.\u006ee\u0078\u0074\u004f\u006e\u0050i\u0078\u0065\u006c\u004c\u006f\u0077";
|
|
var (_cgbd int ;_fdf byte ;);_efcc :=_abg *_bgag ;_ffc :=_efcc +(_bcgb /8);if _fdf ,_cdcc =_ecacb .GetByte (_ffc );_cdcc !=nil {return _fefc ,false ,_b .Wrap (_cdcc ,_afc ,"\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 _fdf !=0{_cede :=_bcgb -(_bcgb %8)+7;for _cgbd =_bcgb ;_cgbd <=_cede &&_cgbd < _dbd ;_cgbd ++{if _ecacb .GetPixel (_cgbd ,_abg ){_fefc .X =_cgbd ;_fefc .Y =_abg ;return _fefc ,true ,nil ;};};};_eafa :=(_bcgb /8)+1;_cgbd =8*_eafa ;var _aacfa int ;for _ffc =_efcc +_eafa ;
|
|
_cgbd < _dbd ;_ffc ,_cgbd =_ffc +1,_cgbd +8{if _fdf ,_cdcc =_ecacb .GetByte (_ffc );_cdcc !=nil {return _fefc ,false ,_b .Wrap (_cdcc ,_afc ,"r\u0065\u0073\u0074\u0020of\u0020t\u0068\u0065\u0020\u006c\u0069n\u0065\u0020\u0062\u0079\u0074\u0065");};if _fdf ==0{continue ;
|
|
};for _aacfa =0;_aacfa < 8&&_cgbd < _dbd ;_aacfa ,_cgbd =_aacfa +1,_cgbd +1{if _ecacb .GetPixel (_cgbd ,_abg ){_fefc .X =_cgbd ;_fefc .Y =_abg ;return _fefc ,true ,nil ;};};};for _eeg :=_abg +1;_eeg < _fadb ;_eeg ++{_efcc =_eeg *_bgag ;for _ffc ,_cgbd =_efcc ,0;
|
|
_cgbd < _dbd ;_ffc ,_cgbd =_ffc +1,_cgbd +8{if _fdf ,_cdcc =_ecacb .GetByte (_ffc );_cdcc !=nil {return _fefc ,false ,_b .Wrap (_cdcc ,_afc ,"\u0066o\u006cl\u006f\u0077\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u0073");};if _fdf ==0{continue ;};for _aacfa =0;
|
|
_aacfa < 8&&_cgbd < _dbd ;_aacfa ,_cgbd =_aacfa +1,_cgbd +1{if _ecacb .GetPixel (_cgbd ,_eeg ){_fefc .X =_cgbd ;_fefc .Y =_eeg ;return _fefc ,true ,nil ;};};};};return _fefc ,false ,nil ;};func TstDSymbol (t *_d .T ,scale ...int )*Bitmap {_becab ,_ebba :=NewWithData (4,5,[]byte {0xf0,0x90,0x90,0x90,0xE0});
|
|
_fg .NoError (t ,_ebba );return TstGetScaledSymbol (t ,_becab ,scale ...);};func MorphSequence (src *Bitmap ,sequence ...MorphProcess )(*Bitmap ,error ){return _acbbf (src ,sequence ...);};const (SelDontCare SelectionValue =iota ;SelHit ;SelMiss ;);var (_gcabf =_eafb ();
|
|
_abdc =_cdb ();_defb =_fgb (););func (_acce *Bitmap )connComponentsBitmapsBB (_gaffg *Bitmaps ,_ebbg int )(_ggab *Boxes ,_cgccb error ){const _gaga ="\u0063\u006f\u006enC\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0069\u0074\u006d\u0061\u0070\u0073\u0042\u0042";
|
|
if _ebbg !=4&&_ebbg !=8{return nil ,_b .Error (_gaga ,"\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 _gaffg ==nil {return nil ,_b .Error (_gaga ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
};if len (_gaffg .Values )> 0{return nil ,_b .Error (_gaga ,"\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 _acce .Zero (){return &Boxes {},nil ;
|
|
};var (_afd ,_febg ,_efbe ,_gcc *Bitmap ;);_acce .setPadBits (0);if _afd ,_cgccb =_daef (nil ,_acce );_cgccb !=nil {return nil ,_b .Wrap (_cgccb ,_gaga ,"\u0062\u006d\u0031");};if _febg ,_cgccb =_daef (nil ,_acce );_cgccb !=nil {return nil ,_b .Wrap (_cgccb ,_gaga ,"\u0062\u006d\u0032");
|
|
};_bdfb :=&_e .Stack {};_bdfb .Aux =&_e .Stack {};_ggab =&Boxes {};var (_abga ,_gdge int ;_fda _ce .Point ;_faab bool ;_cfge *_ce .Rectangle ;);for {if _fda ,_faab ,_cgccb =_afd .nextOnPixel (_abga ,_gdge );_cgccb !=nil {return nil ,_b .Wrap (_cgccb ,_gaga ,"");
|
|
};if !_faab {break ;};if _cfge ,_cgccb =_cegaa (_afd ,_bdfb ,_fda .X ,_fda .Y ,_ebbg );_cgccb !=nil {return nil ,_b .Wrap (_cgccb ,_gaga ,"");};if _cgccb =_ggab .Add (_cfge );_cgccb !=nil {return nil ,_b .Wrap (_cgccb ,_gaga ,"");};if _efbe ,_cgccb =_afd .clipRectangle (_cfge ,nil );
|
|
_cgccb !=nil {return nil ,_b .Wrap (_cgccb ,_gaga ,"\u0062\u006d\u0033");};if _gcc ,_cgccb =_febg .clipRectangle (_cfge ,nil );_cgccb !=nil {return nil ,_b .Wrap (_cgccb ,_gaga ,"\u0062\u006d\u0034");};if _ ,_cgccb =_ffe (_efbe ,_efbe ,_gcc );_cgccb !=nil {return nil ,_b .Wrap (_cgccb ,_gaga ,"\u0062m\u0033\u0020\u005e\u0020\u0062\u006d4");
|
|
};if _cgccb =_febg .RasterOperation (_cfge .Min .X ,_cfge .Min .Y ,_cfge .Dx (),_cfge .Dy (),PixSrcXorDst ,_efbe ,0,0);_cgccb !=nil {return nil ,_b .Wrap (_cgccb ,_gaga ,"\u0062\u006d\u0032\u0020\u002d\u0058\u004f\u0052\u002d>\u0020\u0062\u006d\u0033");
|
|
};_gaffg .AddBitmap (_efbe );_abga =_fda .X ;_gdge =_fda .Y ;};_gaffg .Boxes =*_ggab ;return _ggab ,nil ;};type SelectionValue int ;func (_cgba *Bitmap )inverseData (){if _bgca :=_cgba .RasterOperation (0,0,_cgba .Width ,_cgba .Height ,PixNotDst ,nil ,0,0);
|
|
_bgca !=nil {_g .Log .Debug ("\u0049n\u0076\u0065\u0072\u0073e\u0020\u0064\u0061\u0074\u0061 \u0066a\u0069l\u0065\u0064\u003a\u0020\u0027\u0025\u0076'",_bgca );};if _cgba .Color ==Chocolate {_cgba .Color =Vanilla ;}else {_cgba .Color =Chocolate ;};};func (_eace *Bitmaps )SortByWidth (){_ecdddc :=(*byWidth )(_eace );
|
|
_dd .Sort (_ecdddc )};var _ _dd .Interface =&ClassedPoints {};func (_ebega *Bitmaps )AddBox (box *_ce .Rectangle ){_ebega .Boxes =append (_ebega .Boxes ,box )};func (_cgd *Bitmap )GetByteIndex (x ,y int )int {return y *_cgd .RowStride +(x >>3)};func TstASymbol (t *_d .T )*Bitmap {t .Helper ();
|
|
_accca :=New (6,6);_fg .NoError (t ,_accca .SetPixel (1,0,1));_fg .NoError (t ,_accca .SetPixel (2,0,1));_fg .NoError (t ,_accca .SetPixel (3,0,1));_fg .NoError (t ,_accca .SetPixel (4,0,1));_fg .NoError (t ,_accca .SetPixel (5,1,1));_fg .NoError (t ,_accca .SetPixel (1,2,1));
|
|
_fg .NoError (t ,_accca .SetPixel (2,2,1));_fg .NoError (t ,_accca .SetPixel (3,2,1));_fg .NoError (t ,_accca .SetPixel (4,2,1));_fg .NoError (t ,_accca .SetPixel (5,2,1));_fg .NoError (t ,_accca .SetPixel (0,3,1));_fg .NoError (t ,_accca .SetPixel (5,3,1));
|
|
_fg .NoError (t ,_accca .SetPixel (0,4,1));_fg .NoError (t ,_accca .SetPixel (5,4,1));_fg .NoError (t ,_accca .SetPixel (1,5,1));_fg .NoError (t ,_accca .SetPixel (2,5,1));_fg .NoError (t ,_accca .SetPixel (3,5,1));_fg .NoError (t ,_accca .SetPixel (4,5,1));
|
|
_fg .NoError (t ,_accca .SetPixel (5,5,1));return _accca ;};func (_ccdd *Bitmap )resizeImageData (_cedb *Bitmap )error {if _cedb ==nil {return _b .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 _ccdd .SizesEqual (_cedb ){return nil ;};_ccdd .Data =make ([]byte ,len (_cedb .Data ));_ccdd .Width =_cedb .Width ;_ccdd .Height =_cedb .Height ;_ccdd .RowStride =_cedb .RowStride ;return nil ;};func (_ege *Bitmap )setTwoBytes (_baa int ,_cffb uint16 )error {if _baa +1> len (_ege .Data )-1{return _b .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",_baa );
|
|
};_ege .Data [_baa ]=byte ((_cffb &0xff00)>>8);_ege .Data [_baa +1]=byte (_cffb &0xff);return nil ;};func _gdeg (_cfcbb *Bitmap ,_efgg ,_geac int ,_aece ,_fcea int ,_bbag RasterOperator ,_fbgeb *Bitmap ,_eeae ,_bddc int )error {var _acfg ,_cbbcd ,_dfcf ,_ffbe int ;
|
|
if _efgg < 0{_eeae -=_efgg ;_aece +=_efgg ;_efgg =0;};if _eeae < 0{_efgg -=_eeae ;_aece +=_eeae ;_eeae =0;};_acfg =_efgg +_aece -_cfcbb .Width ;if _acfg > 0{_aece -=_acfg ;};_cbbcd =_eeae +_aece -_fbgeb .Width ;if _cbbcd > 0{_aece -=_cbbcd ;};if _geac < 0{_bddc -=_geac ;
|
|
_fcea +=_geac ;_geac =0;};if _bddc < 0{_geac -=_bddc ;_fcea +=_bddc ;_bddc =0;};_dfcf =_geac +_fcea -_cfcbb .Height ;if _dfcf > 0{_fcea -=_dfcf ;};_ffbe =_bddc +_fcea -_fbgeb .Height ;if _ffbe > 0{_fcea -=_ffbe ;};if _aece <=0||_fcea <=0{return nil ;};
|
|
var _edce error ;switch {case _efgg &7==0&&_eeae &7==0:_edce =_daca (_cfcbb ,_efgg ,_geac ,_aece ,_fcea ,_bbag ,_fbgeb ,_eeae ,_bddc );case _efgg &7==_eeae &7:_edce =_ccef (_cfcbb ,_efgg ,_geac ,_aece ,_fcea ,_bbag ,_fbgeb ,_eeae ,_bddc );default:_edce =_bebe (_cfcbb ,_efgg ,_geac ,_aece ,_fcea ,_bbag ,_fbgeb ,_eeae ,_bddc );
|
|
};if _edce !=nil {return _b .Wrap (_edce ,"r\u0061\u0073\u0074\u0065\u0072\u004f\u0070\u004c\u006f\u0077","");};return nil ;};func (_gbag *Bitmap )centroid (_bgga ,_ebfc []int )(Point ,error ){_caggcg :=Point {};_gbag .setPadBits (0);if len (_bgga )==0{_bgga =_fbde ();
|
|
};if len (_ebfc )==0{_ebfc =_bbgf ();};var _bbee ,_cafeb ,_bggac ,_edfe ,_cbcf ,_bfcd int ;var _fcfd byte ;for _cbcf =0;_cbcf < _gbag .Height ;_cbcf ++{_ebcg :=_gbag .RowStride *_cbcf ;_edfe =0;for _bfcd =0;_bfcd < _gbag .RowStride ;_bfcd ++{_fcfd =_gbag .Data [_ebcg +_bfcd ];
|
|
if _fcfd !=0{_edfe +=_ebfc [_fcfd ];_bbee +=_bgga [_fcfd ]+_bfcd *8*_ebfc [_fcfd ];};};_bggac +=_edfe ;_cafeb +=_edfe *_cbcf ;};if _bggac !=0{_caggcg .X =float32 (_bbee )/float32 (_bggac );_caggcg .Y =float32 (_cafeb )/float32 (_bggac );};return _caggcg ,nil ;
|
|
};func Centroid (bm *Bitmap ,centTab ,sumTab []int )(Point ,error ){return bm .centroid (centTab ,sumTab )};func (_bbdc *Bitmap )thresholdPixelSum (_fccd int )bool {var (_dcag int ;_gdaf uint8 ;_cad byte ;_cfba int ;);_eeda :=_bbdc .RowStride ;_dcg :=uint (_bbdc .Width &0x07);
|
|
if _dcg !=0{_gdaf =uint8 ((0xff<<(8-_dcg ))&0xff);_eeda --;};for _bdfc :=0;_bdfc < _bbdc .Height ;_bdfc ++{for _cfba =0;_cfba < _eeda ;_cfba ++{_cad =_bbdc .Data [_bdfc *_bbdc .RowStride +_cfba ];_dcag +=int (_fcbf [_cad ]);};if _dcg !=0{_cad =_bbdc .Data [_bdfc *_bbdc .RowStride +_cfba ]&_gdaf ;
|
|
_dcag +=int (_fcbf [_cad ]);};if _dcag > _fccd {return true ;};};return false ;};type Boxes []*_ce .Rectangle ;func _ccb (_gfd *Bitmap ,_bac ,_cac int )(*Bitmap ,error ){const _dac ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0052\u0065p\u006c\u0069\u0063\u0061\u0074\u0065";
|
|
if _gfd ==nil {return nil ,_b .Error (_dac ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _bac <=0||_cac <=0{return nil ,_b .Error (_dac ,"\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 _bac ==_cac {if _bac ==1{_gdf ,_fbea :=_daef (nil ,_gfd );if _fbea !=nil {return nil ,_b .Wrap (_fbea ,_dac ,"\u0078\u0046\u0061\u0063\u0074\u0020\u003d\u003d\u0020y\u0046\u0061\u0063\u0074");};return _gdf ,nil ;};if _bac ==2||_bac ==4||_bac ==8{_geb ,_ggd :=_de (_gfd ,_bac );
|
|
if _ggd !=nil {return nil ,_b .Wrap (_ggd ,_dac ,"\u0078\u0046a\u0063\u0074\u0020i\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");};return _geb ,nil ;};};_eed :=_bac *_gfd .Width ;_ecb :=_cac *_gfd .Height ;_bga :=New (_eed ,_ecb );_fcb :=_bga .RowStride ;
|
|
var (_dde ,_cf ,_bbb ,_bf ,_ddeb int ;_dcf byte ;_fff error ;);for _cf =0;_cf < _gfd .Height ;_cf ++{_dde =_cac *_cf *_fcb ;for _bbb =0;_bbb < _gfd .Width ;_bbb ++{if _af :=_gfd .GetPixel (_bbb ,_cf );_af {_ddeb =_bac *_bbb ;for _bf =0;_bf < _bac ;_bf ++{_bga .setBit (_dde *8+_ddeb +_bf );
|
|
};};};for _bf =1;_bf < _cac ;_bf ++{_cd :=_dde +_bf *_fcb ;for _ced :=0;_ced < _fcb ;_ced ++{if _dcf ,_fff =_bga .GetByte (_dde +_ced );_fff !=nil {return nil ,_b .Wrapf (_fff ,_dac ,"\u0072\u0065\u0070\u006cic\u0061\u0074\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u003a\u0020\u0027\u0025d\u0027",_bf );
|
|
};if _fff =_bga .SetByte (_cd +_ced ,_dcf );_fff !=nil {return nil ,_b .Wrap (_fff ,_dac ,"\u0053\u0065\u0074\u0074in\u0067\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};};};};return _bga ,nil ;};func (_fdcgc *Bitmaps )GetBox (i int )(*_ce .Rectangle ,error ){const _eagdf ="\u0047\u0065\u0074\u0042\u006f\u0078";
|
|
if _fdcgc ==nil {return nil ,_b .Error (_eagdf ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074\u006d\u0061\u0070s\u0027");};if i > len (_fdcgc .Boxes )-1{return nil ,_b .Errorf (_eagdf ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _fdcgc .Boxes [i ],nil ;};func (_agac Points )GetIntX (i int )(int ,error ){if i >=len (_agac ){return 0,_b .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 (_agac [i ].X ),nil ;};func CorrelationScore (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_dcge float64 ,_eagd error ){const _cbec ="\u0063\u006fr\u0072\u0065\u006ca\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065";
|
|
if bm1 ==nil ||bm2 ==nil {return 0,_b .Error (_cbec ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0062\u0069\u0074ma\u0070\u0073");};if tab ==nil {return 0,_b .Error (_cbec ,"\u0027\u0074\u0061\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
};if area1 <=0||area2 <=0{return 0,_b .Error (_cbec ,"\u0061\u0072\u0065\u0061s\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0067r\u0065a\u0074\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};_ccfa ,_bebdb :=bm1 .Width ,bm1 .Height ;_fdcfa ,_acebd :=bm2 .Width ,bm2 .Height ;
|
|
_eagf :=_cdecg (_ccfa -_fdcfa );if _eagf > maxDiffW {return 0,nil ;};_ddec :=_cdecg (_bebdb -_acebd );if _ddec > maxDiffH {return 0,nil ;};var _cegde ,_dbdc int ;if delX >=0{_cegde =int (delX +0.5);}else {_cegde =int (delX -0.5);};if delY >=0{_dbdc =int (delY +0.5);
|
|
}else {_dbdc =int (delY -0.5);};_gdfd :=_fbfae (_dbdc ,0);_cgdd :=_dcagf (_acebd +_dbdc ,_bebdb );_ddef :=bm1 .RowStride *_gdfd ;_ecge :=bm2 .RowStride *(_gdfd -_dbdc );_acf :=_fbfae (_cegde ,0);_ccge :=_dcagf (_fdcfa +_cegde ,_ccfa );_dceb :=bm2 .RowStride ;
|
|
var _deff ,_gfbe int ;if _cegde >=8{_deff =_cegde >>3;_ddef +=_deff ;_acf -=_deff <<3;_ccge -=_deff <<3;_cegde &=7;}else if _cegde <=-8{_gfbe =-((_cegde +7)>>3);_ecge +=_gfbe ;_dceb -=_gfbe ;_cegde +=_gfbe <<3;};if _acf >=_ccge ||_gdfd >=_cgdd {return 0,nil ;
|
|
};_dag :=(_ccge +7)>>3;var (_dadd ,_adaf ,_bgbbg byte ;_baca ,_fcd ,_eaee int ;);switch {case _cegde ==0:for _eaee =_gdfd ;_eaee < _cgdd ;_eaee ,_ddef ,_ecge =_eaee +1,_ddef +bm1 .RowStride ,_ecge +bm2 .RowStride {for _fcd =0;_fcd < _dag ;_fcd ++{_bgbbg =bm1 .Data [_ddef +_fcd ]&bm2 .Data [_ecge +_fcd ];
|
|
_baca +=tab [_bgbbg ];};};case _cegde > 0:if _dceb < _dag {for _eaee =_gdfd ;_eaee < _cgdd ;_eaee ,_ddef ,_ecge =_eaee +1,_ddef +bm1 .RowStride ,_ecge +bm2 .RowStride {_dadd ,_adaf =bm1 .Data [_ddef ],bm2 .Data [_ecge ]>>uint (_cegde );_bgbbg =_dadd &_adaf ;
|
|
_baca +=tab [_bgbbg ];for _fcd =1;_fcd < _dceb ;_fcd ++{_dadd ,_adaf =bm1 .Data [_ddef +_fcd ],(bm2 .Data [_ecge +_fcd ]>>uint (_cegde ))|(bm2 .Data [_ecge +_fcd -1]<<uint (8-_cegde ));_bgbbg =_dadd &_adaf ;_baca +=tab [_bgbbg ];};_dadd =bm1 .Data [_ddef +_fcd ];
|
|
_adaf =bm2 .Data [_ecge +_fcd -1]<<uint (8-_cegde );_bgbbg =_dadd &_adaf ;_baca +=tab [_bgbbg ];};}else {for _eaee =_gdfd ;_eaee < _cgdd ;_eaee ,_ddef ,_ecge =_eaee +1,_ddef +bm1 .RowStride ,_ecge +bm2 .RowStride {_dadd ,_adaf =bm1 .Data [_ddef ],bm2 .Data [_ecge ]>>uint (_cegde );
|
|
_bgbbg =_dadd &_adaf ;_baca +=tab [_bgbbg ];for _fcd =1;_fcd < _dag ;_fcd ++{_dadd =bm1 .Data [_ddef +_fcd ];_adaf =(bm2 .Data [_ecge +_fcd ]>>uint (_cegde ))|(bm2 .Data [_ecge +_fcd -1]<<uint (8-_cegde ));_bgbbg =_dadd &_adaf ;_baca +=tab [_bgbbg ];};
|
|
};};default:if _dag < _dceb {for _eaee =_gdfd ;_eaee < _cgdd ;_eaee ,_ddef ,_ecge =_eaee +1,_ddef +bm1 .RowStride ,_ecge +bm2 .RowStride {for _fcd =0;_fcd < _dag ;_fcd ++{_dadd =bm1 .Data [_ddef +_fcd ];_adaf =bm2 .Data [_ecge +_fcd ]<<uint (-_cegde );
|
|
_adaf |=bm2 .Data [_ecge +_fcd +1]>>uint (8+_cegde );_bgbbg =_dadd &_adaf ;_baca +=tab [_bgbbg ];};};}else {for _eaee =_gdfd ;_eaee < _cgdd ;_eaee ,_ddef ,_ecge =_eaee +1,_ddef +bm1 .RowStride ,_ecge +bm2 .RowStride {for _fcd =0;_fcd < _dag -1;_fcd ++{_dadd =bm1 .Data [_ddef +_fcd ];
|
|
_adaf =bm2 .Data [_ecge +_fcd ]<<uint (-_cegde );_adaf |=bm2 .Data [_ecge +_fcd +1]>>uint (8+_cegde );_bgbbg =_dadd &_adaf ;_baca +=tab [_bgbbg ];};_dadd =bm1 .Data [_ddef +_fcd ];_adaf =bm2 .Data [_ecge +_fcd ]<<uint (-_cegde );_bgbbg =_dadd &_adaf ;_baca +=tab [_bgbbg ];
|
|
};};};_dcge =float64 (_baca )*float64 (_baca )/(float64 (area1 )*float64 (area2 ));return _dcge ,nil ;};func (_gedgbe *ClassedPoints )GetIntXByClass (i int )(int ,error ){const _dcbe ="\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 >=_gedgbe .IntSlice .Size (){return 0,_b .Errorf (_dcbe ,"\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 (_gedgbe .XAtIndex (i )),nil ;};func (_bdcc *Points )Add (pt *Points )error {const _adgf ="\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0041\u0064\u0064";if _bdcc ==nil {return _b .Error (_adgf ,"\u0070o\u0069n\u0074\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if pt ==nil {return _b .Error (_adgf ,"a\u0072\u0067\u0075\u006d\u0065\u006et\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");};*_bdcc =append (*_bdcc ,*pt ...);return nil ;};type SizeSelection int ;
|
|
func TstWordBitmap (t *_d .T ,scale ...int )*Bitmap {_bece :=1;if len (scale )> 0{_bece =scale [0];};_cdag :=3;_fbbg :=9+7+15+2*_cdag ;_bbbc :=5+_cdag +5;_adbe :=New (_fbbg *_bece ,_bbbc *_bece );_dabc :=&Bitmaps {};var _cfdbf *int ;_cdag *=_bece ;_aefa :=0;
|
|
_cfdbf =&_aefa ;_adga :=0;_gcaf :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,1*_bece );_gcaf =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,_cdag );_gcaf =TstISymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,1*_bece );
|
|
_gcaf =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,_cdag );_gcaf =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,1*_bece );_gcaf =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,1*_bece );
|
|
_gcaf =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,0);*_cfdbf =0;_adga =5*_bece +_cdag ;_gcaf =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,1*_bece );_gcaf =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,_cdag );
|
|
_gcaf =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,1*_bece );_gcaf =TstESymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,1*_bece );_gcaf =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,1*_bece );
|
|
_gcaf =TstESymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,1*_bece );_gcaf =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_dabc ,_gcaf ,_cfdbf ,_adga ,0);TstWriteSymbols (t ,_dabc ,_adbe );return _adbe ;};func (_fedd *ClassedPoints )SortByX (){_fedd ._cbfb =_fedd .xSortFunction ();
|
|
_dd .Sort (_fedd )};func _fdae (_dfg ,_abdca *Bitmap ,_cdbd ,_gcb int )(*Bitmap ,error ){const _ebab ="\u006fp\u0065\u006e\u0042\u0072\u0069\u0063k";if _abdca ==nil {return nil ,_b .Error (_ebab ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _cdbd < 1&&_gcb < 1{return nil ,_b .Error (_ebab ,"\u0068\u0053\u0069\u007ae \u003c\u0020\u0031\u0020\u0026\u0026\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u003c \u0031");};if _cdbd ==1&&_gcb ==1{return _abdca .Copy (),nil ;};if _cdbd ==1||_gcb ==1{var _dcedg error ;
|
|
_cega :=SelCreateBrick (_gcb ,_cdbd ,_gcb /2,_cdbd /2,SelHit );_dfg ,_dcedg =_cadb (_dfg ,_abdca ,_cega );if _dcedg !=nil {return nil ,_b .Wrap (_dcedg ,_ebab ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _dfg ,nil ;};_cgab :=SelCreateBrick (1,_cdbd ,0,_cdbd /2,SelHit );_bab :=SelCreateBrick (_gcb ,1,_gcb /2,0,SelHit );_eaccb ,_bccc :=_edab (nil ,_abdca ,_cgab );if _bccc !=nil {return nil ,_b .Wrap (_bccc ,_ebab ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_dfg ,_bccc =_edab (_dfg ,_eaccb ,_bab );if _bccc !=nil {return nil ,_b .Wrap (_bccc ,_ebab ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};_ ,_bccc =_cgbb (_eaccb ,_dfg ,_cgab );if _bccc !=nil {return nil ,_b .Wrap (_bccc ,_ebab ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_ ,_bccc =_cgbb (_dfg ,_eaccb ,_bab );if _bccc !=nil {return nil ,_b .Wrap (_bccc ,_ebab ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _dfg ,nil ;};func (_dgbg *Bitmap )setEightPartlyBytes (_edd ,_ecd int ,_aecd uint64 )(_aga error ){var (_edda byte ;
|
|
_fae int ;);const _deda ="\u0073\u0065\u0074\u0045ig\u0068\u0074\u0050\u0061\u0072\u0074\u006c\u0079\u0042\u0079\u0074\u0065\u0073";for _bbf :=1;_bbf <=_ecd ;_bbf ++{_fae =64-_bbf *8;_edda =byte (_aecd >>uint (_fae )&0xff);_g .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",_edda ,_edd ,_edd +_bbf -1,_ecd ,_fae );
|
|
if _aga =_dgbg .SetByte (_edd +_bbf -1,_edda );_aga !=nil {return _b .Wrap (_aga ,_deda ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};};_cfb :=_dgbg .RowStride *8-_dgbg .Width ;if _cfb ==0{return nil ;};_fae -=8;_edda =byte (_aecd >>uint (_fae )&0xff)<<uint (_cfb );
|
|
if _aga =_dgbg .SetByte (_edd +_ecd ,_edda );_aga !=nil {return _b .Wrap (_aga ,_deda ,"\u0070\u0061\u0064\u0064\u0065\u0064");};return nil ;};func TstImageBitmapData ()[]byte {return _aebbc .Data };func (_dcbbc *byHeight )Less (i ,j int )bool {return _dcbbc .Values [i ].Height < _dcbbc .Values [j ].Height };
|
|
func _efdb (_aabc ,_ccga *Bitmap ,_abdb ,_agdf int )(_cdgf error ){const _bgeg ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0034";var (_afeed ,_bdec ,_dfaa ,_faec int ;_ecfb ,_fbad ,_dfcef ,_ecfc ,_ddgf ,_bead ,_cbeb byte ;
|
|
);for _afeed =0;_afeed < _abdb ;_afeed ++{_dfaa =_afeed *_aabc .RowStride ;_faec =_afeed *_ccga .RowStride ;for _bdec =0;_bdec < _agdf ;_bdec ++{_ecfb ,_cdgf =_aabc .GetByte (_dfaa +_bdec );if _cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"\u0066i\u0072\u0073\u0074\u0020\u0067\u0065t");
|
|
};_fbad ,_cdgf =_ccga .GetByte (_faec +_bdec );if _cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0067\u0065\u0074");};if _afeed > 0{_dfcef ,_cdgf =_aabc .GetByte (_dfaa -_aabc .RowStride +_bdec );if _cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"\u0069\u0020\u003e \u0030");
|
|
};_ecfb |=_dfcef ;};if _bdec > 0{_ecfc ,_cdgf =_aabc .GetByte (_dfaa +_bdec -1);if _cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"\u006a\u0020\u003e \u0030");};_ecfb |=_ecfc <<7;};_ecfb &=_fbad ;if _ecfb ==0||(^_ecfb )==0{if _cdgf =_aabc .SetByte (_dfaa +_bdec ,_ecfb );
|
|
_cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"b\u0074\u0020\u003d\u003d 0\u0020|\u007c\u0020\u0028\u005e\u0062t\u0029\u0020\u003d\u003d\u0020\u0030");};continue ;};for {_cbeb =_ecfb ;_ecfb =(_ecfb |(_ecfb >>1)|(_ecfb <<1))&_fbad ;if (_ecfb ^_cbeb )==0{if _cdgf =_aabc .SetByte (_dfaa +_bdec ,_ecfb );
|
|
_cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _afeed =_abdb -1;_afeed >=0;_afeed --{_dfaa =_afeed *_aabc .RowStride ;_faec =_afeed *_ccga .RowStride ;
|
|
for _bdec =_agdf -1;_bdec >=0;_bdec --{if _ecfb ,_cdgf =_aabc .GetByte (_dfaa +_bdec );_cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"\u0072\u0065\u0076\u0065\u0072\u0073\u0065\u0020\u0066\u0069\u0072\u0073t\u0020\u0067\u0065\u0074");};if _fbad ,_cdgf =_ccga .GetByte (_faec +_bdec );
|
|
_cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _afeed < _abdb -1{if _ddgf ,_cdgf =_aabc .GetByte (_dfaa +_aabc .RowStride +_bdec );_cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"\u0072\u0065v\u0065\u0072\u0073e\u0020\u0069\u0020\u003c\u0020\u0068\u0020\u002d\u0031");
|
|
};_ecfb |=_ddgf ;};if _bdec < _agdf -1{if _bead ,_cdgf =_aabc .GetByte (_dfaa +_bdec +1);_cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"\u0072\u0065\u0076\u0065rs\u0065\u0020\u006a\u0020\u003c\u0020\u0077\u0070\u006c\u0020\u002d\u0020\u0031");};_ecfb |=_bead >>7;
|
|
};_ecfb &=_fbad ;if _ecfb ==0||(^_ecfb )==0{if _cdgf =_aabc .SetByte (_dfaa +_bdec ,_ecfb );_cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"\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 {_cbeb =_ecfb ;_ecfb =(_ecfb |(_ecfb >>1)|(_ecfb <<1))&_fbad ;if (_ecfb ^_cbeb )==0{if _cdgf =_aabc .SetByte (_dfaa +_bdec ,_ecfb );_cdgf !=nil {return _b .Wrap (_cdgf ,_bgeg ,"\u0072e\u0076\u0065\u0072\u0073e\u0020\u0073\u0065\u0074\u0074i\u006eg\u0020p\u0072\u0065\u0076\u0020\u0062\u0079\u0074e");
|
|
};break ;};};};};return nil ;};func _gbb (_gage *Bitmap )(_eagb *Bitmap ,_fbb int ,_fbge error ){const _dgba ="\u0042i\u0074\u006d\u0061\u0070.\u0077\u006f\u0072\u0064\u004da\u0073k\u0042y\u0044\u0069\u006c\u0061\u0074\u0069\u006fn";if _gage ==nil {return nil ,0,_b .Errorf (_dgba ,"\u0027\u0073\u0027\u0020bi\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");
|
|
};var _aae ,_cfbf *Bitmap ;if _aae ,_fbge =_daef (nil ,_gage );_fbge !=nil {return nil ,0,_b .Wrap (_fbge ,_dgba ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0073\u0027");};var (_gfbf [13]int ;_dbb ,_gbfb int ;);_adfd :=12;_cegd :=_e .NewNumSlice (_adfd +1);
|
|
_eedd :=_e .NewNumSlice (_adfd +1);var _dgbde *Boxes ;for _cdadg :=0;_cdadg <=_adfd ;_cdadg ++{if _cdadg ==0{if _cfbf ,_fbge =_daef (nil ,_aae );_fbge !=nil {return nil ,0,_b .Wrap (_fbge ,_dgba ,"\u0066i\u0072\u0073\u0074\u0020\u0062\u006d2");};}else {if _cfbf ,_fbge =_acbbf (_aae ,MorphProcess {Operation :MopDilation ,Arguments :[]int {2,1}});
|
|
_fbge !=nil {return nil ,0,_b .Wrap (_fbge ,_dgba ,"\u0064\u0069\u006ca\u0074\u0069\u006f\u006e\u0020\u0062\u006d\u0032");};};if _dgbde ,_fbge =_cfbf .connComponentsBB (4);_fbge !=nil {return nil ,0,_b .Wrap (_fbge ,_dgba ,"");};_gfbf [_cdadg ]=len (*_dgbde );
|
|
_cegd .AddInt (_gfbf [_cdadg ]);switch _cdadg {case 0:_dbb =_gfbf [0];default:_gbfb =_gfbf [_cdadg -1]-_gfbf [_cdadg ];_eedd .AddInt (_gbfb );};_aae =_cfbf ;};_addc :=true ;_aecf :=2;var _cgca ,_edadg int ;for _fffb :=1;_fffb < len (*_eedd );_fffb ++{if _cgca ,_fbge =_cegd .GetInt (_fffb );
|
|
_fbge !=nil {return nil ,0,_b .Wrap (_fbge ,_dgba ,"\u0043\u0068\u0065\u0063ki\u006e\u0067\u0020\u0062\u0065\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0069o\u006e");};if _addc &&_cgca < int (0.3*float32 (_dbb )){_aecf =_fffb +1;_addc =false ;};if _gbfb ,_fbge =_eedd .GetInt (_fffb );
|
|
_fbge !=nil {return nil ,0,_b .Wrap (_fbge ,_dgba ,"\u0067\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006ea\u0044\u0069\u0066\u0066");};if _gbfb > _edadg {_edadg =_gbfb ;};};_bgbf :=_gage .XResolution ;if _bgbf ==0{_bgbf =150;};if _bgbf > 110{_aecf ++;
|
|
};if _aecf < 2{_g .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");_aecf =2;
|
|
};_fbb =_aecf +1;if _eagb ,_fbge =_fadba (nil ,_gage ,_aecf +1,1);_fbge !=nil {return nil ,0,_b .Wrap (_fbge ,_dgba ,"\u0067\u0065\u0074\u0074in\u0067\u0020\u006d\u0061\u0073\u006b\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};return _eagb ,_fbb ,nil ;
|
|
};type Getter interface{GetBitmap ()*Bitmap ;};var (_acca *Bitmap ;_aebbc *Bitmap ;);func (_ggda *Bitmap )GetBitOffset (x int )int {return x &0x07};func TstTSymbol (t *_d .T ,scale ...int )*Bitmap {_gbeg ,_efbd :=NewWithData (5,5,[]byte {0xF8,0x20,0x20,0x20,0x20});
|
|
_fg .NoError (t ,_efbd );return TstGetScaledSymbol (t ,_gbeg ,scale ...);};func (_egcc *byWidth )Less (i ,j int )bool {return _egcc .Values [i ].Width < _egcc .Values [j ].Width };func DilateBrick (d ,s *Bitmap ,hSize ,vSize int )(*Bitmap ,error ){return _gcg (d ,s ,hSize ,vSize )};
|
|
func _ecbge (_cbbd ,_adeda ,_ffde *Bitmap )(*Bitmap ,error ){const _bdad ="\u0073\u0075\u0062\u0074\u0072\u0061\u0063\u0074";if _adeda ==nil {return nil ,_b .Error (_bdad ,"'\u0073\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _ffde ==nil {return nil ,_b .Error (_bdad ,"'\u0073\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
};var _ffca error ;switch {case _cbbd ==_adeda :if _ffca =_cbbd .RasterOperation (0,0,_adeda .Width ,_adeda .Height ,PixNotSrcAndDst ,_ffde ,0,0);_ffca !=nil {return nil ,_b .Wrap (_ffca ,_bdad ,"\u0064 \u003d\u003d\u0020\u0073\u0031");};case _cbbd ==_ffde :if _ffca =_cbbd .RasterOperation (0,0,_adeda .Width ,_adeda .Height ,PixNotSrcAndDst ,_adeda ,0,0);
|
|
_ffca !=nil {return nil ,_b .Wrap (_ffca ,_bdad ,"\u0064 \u003d\u003d\u0020\u0073\u0032");};default:_cbbd ,_ffca =_daef (_cbbd ,_adeda );if _ffca !=nil {return nil ,_b .Wrap (_ffca ,_bdad ,"");};if _ffca =_cbbd .RasterOperation (0,0,_adeda .Width ,_adeda .Height ,PixNotSrcAndDst ,_ffde ,0,0);
|
|
_ffca !=nil {return nil ,_b .Wrap (_ffca ,_bdad ,"\u0064e\u0066\u0061\u0075\u006c\u0074");};};return _cbbd ,nil ;};func _gcg (_bdg ,_ceac *Bitmap ,_dgge ,_fadc int )(*Bitmap ,error ){const _befe ="d\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063\u006b";
|
|
if _ceac ==nil {_g .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 ,_b .Error (_befe ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _dgge < 1||_fadc < 1{return nil ,_b .Error (_befe ,"\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 _dgge ==1&&_fadc ==1{_ebaf ,_gagac :=_daef (_bdg ,_ceac );if _gagac !=nil {return nil ,_b .Wrap (_gagac ,_befe ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _ebaf ,nil ;};if _dgge ==1||_fadc ==1{_bfdge :=SelCreateBrick (_fadc ,_dgge ,_fadc /2,_dgge /2,SelHit );_afgf ,_acdef :=_cgbb (_bdg ,_ceac ,_bfdge );if _acdef !=nil {return nil ,_b .Wrap (_acdef ,_befe ,"\u0068s\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _afgf ,nil ;};_facd :=SelCreateBrick (1,_dgge ,0,_dgge /2,SelHit );_ddddg :=SelCreateBrick (_fadc ,1,_fadc /2,0,SelHit );_gfae ,_gaee :=_cgbb (nil ,_ceac ,_facd );if _gaee !=nil {return nil ,_b .Wrap (_gaee ,_befe ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_bdg ,_gaee =_cgbb (_bdg ,_gfae ,_ddddg );if _gaee !=nil {return nil ,_b .Wrap (_gaee ,_befe ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _bdg ,nil ;};func (_dada *BitmapsArray )GetBitmaps (i int )(*Bitmaps ,error ){const _abfe ="\u0042\u0069\u0074ma\u0070\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u0069\u0074\u006d\u0061\u0070\u0073";
|
|
if _dada ==nil {return nil ,_b .Error (_abfe ,"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 (_dada .Values )-1{return nil ,_b .Errorf (_abfe ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _dada .Values [i ],nil ;};func _daef (_afcd ,_cfa *Bitmap )(*Bitmap ,error ){if _cfa ==nil {return nil ,_b .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 _cfa ==_afcd {return _afcd ,nil ;};if _afcd ==nil {_afcd =_cfa .createTemplate ();copy (_afcd .Data ,_cfa .Data );return _afcd ,nil ;};_abad :=_afcd .resizeImageData (_cfa );if _abad !=nil {return nil ,_b .Wrap (_abad ,"\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","");
|
|
};_afcd .Text =_cfa .Text ;copy (_afcd .Data ,_cfa .Data );return _afcd ,nil ;};func TstWordBitmapWithSpaces (t *_d .T ,scale ...int )*Bitmap {_adea :=1;if len (scale )> 0{_adea =scale [0];};_bcggf :=3;_gbfge :=9+7+15+2*_bcggf +2*_bcggf ;_dfgc :=5+_bcggf +5+2*_bcggf ;
|
|
_fagd :=New (_gbfge *_adea ,_dfgc *_adea );_efccc :=&Bitmaps {};var _cdef *int ;_bcggf *=_adea ;_bcef :=_bcggf ;_cdef =&_bcef ;_cfbfc :=_bcggf ;_cabb :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,1*_adea );_cabb =TstOSymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,_bcggf );_cabb =TstISymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,1*_adea );_cabb =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,_bcggf );_cabb =TstNSymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,1*_adea );_cabb =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,1*_adea );_cabb =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,0);*_cdef =_bcggf ;_cfbfc =5*_adea +_bcggf ;
|
|
_cabb =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,1*_adea );_cabb =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,_bcggf );_cabb =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,1*_adea );
|
|
_cabb =TstESymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,1*_adea );_cabb =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,1*_adea );_cabb =TstESymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,1*_adea );
|
|
_cabb =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_efccc ,_cabb ,_cdef ,_cfbfc ,0);TstWriteSymbols (t ,_efccc ,_fagd );return _fagd ;};func (_egag *Bitmaps )CountPixels ()*_e .NumSlice {_cbecd :=&_e .NumSlice {};for _ ,_gbfe :=range _egag .Values {_cbecd .AddInt (_gbfe .CountPixels ());
|
|
};return _cbecd ;};func (_dgff *ClassedPoints )Len ()int {return _dgff .IntSlice .Size ()};func Rect (x ,y ,w ,h int )(*_ce .Rectangle ,error ){const _ecggg ="b\u0069\u0074\u006d\u0061\u0070\u002e\u0052\u0065\u0063\u0074";if x < 0{w +=x ;x =0;if w <=0{return nil ,_b .Errorf (_ecggg ,"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 ,_b .Error (_ecggg ,"\u0079\u0020\u003c 0\u0020\u0061\u006e\u0064\u0020\u0062\u006f\u0078\u0020\u006f\u0066\u0066\u0020\u002b\u0071\u0075\u0061\u0064");};};_cce :=_ce .Rect (x ,y ,x +w ,y +h );return &_cce ,nil ;
|
|
};func (_dedg *Bitmap )String ()string {var _cdfe ="\u000a";for _fedf :=0;_fedf < _dedg .Height ;_fedf ++{var _fdc string ;for _bbd :=0;_bbd < _dedg .Width ;_bbd ++{_dae :=_dedg .GetPixel (_bbd ,_fedf );if _dae {_fdc +="\u0031";}else {_fdc +="\u0030";};
|
|
};_cdfe +=_fdc +"\u000a";};return _cdfe ;};func _cde (_fd ,_fbcb *Bitmap ,_gdff int ,_ace []byte ,_deg int )(_bfd error ){const _ece ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0032";
|
|
var (_bda ,_gga ,_afe ,_cgb ,_acd ,_dec ,_dad ,_eca int ;_bae ,_feeb ,_cbb ,_ggc uint32 ;_gadd ,_edg byte ;_aeb uint16 ;);_age :=make ([]byte ,4);_eab :=make ([]byte ,4);for _afe =0;_afe < _fd .Height -1;_afe ,_cgb =_afe +2,_cgb +1{_bda =_afe *_fd .RowStride ;
|
|
_gga =_cgb *_fbcb .RowStride ;for _acd ,_dec =0,0;_acd < _deg ;_acd ,_dec =_acd +4,_dec +1{for _dad =0;_dad < 4;_dad ++{_eca =_bda +_acd +_dad ;if _eca <=len (_fd .Data )-1&&_eca < _bda +_fd .RowStride {_age [_dad ]=_fd .Data [_eca ];}else {_age [_dad ]=0x00;
|
|
};_eca =_bda +_fd .RowStride +_acd +_dad ;if _eca <=len (_fd .Data )-1&&_eca < _bda +(2*_fd .RowStride ){_eab [_dad ]=_fd .Data [_eca ];}else {_eab [_dad ]=0x00;};};_bae =_ba .BigEndian .Uint32 (_age );_feeb =_ba .BigEndian .Uint32 (_eab );_cbb =_bae &_feeb ;
|
|
_cbb |=_cbb <<1;_ggc =_bae |_feeb ;_ggc &=_ggc <<1;_feeb =_cbb |_ggc ;_feeb &=0xaaaaaaaa;_bae =_feeb |(_feeb <<7);_gadd =byte (_bae >>24);_edg =byte ((_bae >>8)&0xff);_eca =_gga +_dec ;if _eca +1==len (_fbcb .Data )-1||_eca +1>=_gga +_fbcb .RowStride {if _bfd =_fbcb .SetByte (_eca ,_ace [_gadd ]);
|
|
_bfd !=nil {return _b .Wrapf (_bfd ,_ece ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_eca );};}else {_aeb =(uint16 (_ace [_gadd ])<<8)|uint16 (_ace [_edg ]);if _bfd =_fbcb .setTwoBytes (_eca ,_aeb );_bfd !=nil {return _b .Wrapf (_bfd ,_ece ,"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",_eca );
|
|
};_dec ++;};};};return nil ;};type byWidth Bitmaps ;func _eeff (_ddbc uint ,_bdb byte )byte {return _bdb >>_ddbc <<_ddbc };type ClassedPoints struct{*Points ;_e .IntSlice ;_cbfb func (_aagb ,_bgcd int )bool ;};func TstWriteSymbols (t *_d .T ,bms *Bitmaps ,src *Bitmap ){for _gcfc :=0;
|
|
_gcfc < bms .Size ();_gcfc ++{_cdfb :=bms .Values [_gcfc ];_cgdfd :=bms .Boxes [_gcfc ];_dbaff :=src .RasterOperation (_cgdfd .Min .X ,_cgdfd .Min .Y ,_cdfb .Width ,_cdfb .Height ,PixSrc ,_cdfb ,0,0);_fg .NoError (t ,_dbaff );};};func _ab (_dc ,_eg *Bitmap )(_gd error ){const _gdd ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0032";
|
|
_eb :=_eg .RowStride ;_bb :=_dc .RowStride ;var (_db byte ;_fb uint16 ;_bba ,_egc ,_bc ,_ca ,_caf int ;);for _bc =0;_bc < _eg .Height ;_bc ++{_bba =_bc *_eb ;_egc =2*_bc *_bb ;for _ca =0;_ca < _eb ;_ca ++{_db =_eg .Data [_bba +_ca ];_fb =_gcabf [_db ];
|
|
_caf =_egc +_ca *2;if _dc .RowStride !=_eg .RowStride *2&&(_ca +1)*2> _dc .RowStride {_gd =_dc .SetByte (_caf ,byte (_fb >>8));}else {_gd =_dc .setTwoBytes (_caf ,_fb );};if _gd !=nil {return _b .Wrap (_gd ,_gdd ,"");};};for _ca =0;_ca < _bb ;_ca ++{_caf =_egc +_bb +_ca ;
|
|
_db =_dc .Data [_egc +_ca ];if _gd =_dc .SetByte (_caf ,_db );_gd !=nil {return _b .Wrapf (_gd ,_gdd ,"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",_egc +_ca ,_egc +_bb +_ca );
|
|
};};};return nil ;};func (_efac *Bitmap )clearAll ()error {return _efac .RasterOperation (0,0,_efac .Width ,_efac .Height ,PixClr ,nil ,0,0);};func (_ecc *Bitmap )addBorderGeneral (_efca ,_ffbf ,_dcca ,_cggb int ,_bceec int )(*Bitmap ,error ){const _degf ="\u0061\u0064d\u0042\u006f\u0072d\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
if _efca < 0||_ffbf < 0||_dcca < 0||_cggb < 0{return nil ,_b .Error (_degf ,"n\u0065\u0067\u0061\u0074iv\u0065 \u0062\u006f\u0072\u0064\u0065r\u0020\u0061\u0064\u0064\u0065\u0064");};_abcd ,_cdec :=_ecc .Width ,_ecc .Height ;_fbef :=_abcd +_efca +_ffbf ;
|
|
_cbfe :=_cdec +_dcca +_cggb ;_bad :=New (_fbef ,_cbfe );_bad .Color =_ecc .Color ;_dcdg :=PixClr ;if _bceec > 0{_dcdg =PixSet ;};_gfdf :=_bad .RasterOperation (0,0,_efca ,_cbfe ,_dcdg ,nil ,0,0);if _gfdf !=nil {return nil ,_b .Wrap (_gfdf ,_degf ,"\u006c\u0065\u0066\u0074");
|
|
};_gfdf =_bad .RasterOperation (_fbef -_ffbf ,0,_ffbf ,_cbfe ,_dcdg ,nil ,0,0);if _gfdf !=nil {return nil ,_b .Wrap (_gfdf ,_degf ,"\u0072\u0069\u0067h\u0074");};_gfdf =_bad .RasterOperation (0,0,_fbef ,_dcca ,_dcdg ,nil ,0,0);if _gfdf !=nil {return nil ,_b .Wrap (_gfdf ,_degf ,"\u0074\u006f\u0070");
|
|
};_gfdf =_bad .RasterOperation (0,_cbfe -_cggb ,_fbef ,_cggb ,_dcdg ,nil ,0,0);if _gfdf !=nil {return nil ,_b .Wrap (_gfdf ,_degf ,"\u0062\u006f\u0074\u0074\u006f\u006d");};_gfdf =_bad .RasterOperation (_efca ,_dcca ,_abcd ,_cdec ,PixSrc ,_ecc ,0,0);if _gfdf !=nil {return nil ,_b .Wrap (_gfdf ,_degf ,"\u0063\u006f\u0070\u0079");
|
|
};return _bad ,nil ;};func _aag ()(_cfdae []byte ){_cfdae =make ([]byte ,256);for _dbcb :=0;_dbcb < 256;_dbcb ++{_faa :=byte (_dbcb );_cfdae [_faa ]=(_faa &0x01)|((_faa &0x04)>>1)|((_faa &0x10)>>2)|((_faa &0x40)>>3)|((_faa &0x02)<<3)|((_faa &0x08)<<2)|((_faa &0x20)<<1)|(_faa &0x80);
|
|
};return _cfdae ;};func _aba (_ff ,_fbc *Bitmap )(_eba error ){const _ga ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0034";_fbf :=_fbc .RowStride ;_gad :=_ff .RowStride ;_cb :=_fbc .RowStride *4-_ff .RowStride ;
|
|
var (_gf ,_dg byte ;_df uint32 ;_fbe ,_da ,_abc ,_ge ,_fc ,_bg ,_cc int ;);for _abc =0;_abc < _fbc .Height ;_abc ++{_fbe =_abc *_fbf ;_da =4*_abc *_gad ;for _ge =0;_ge < _fbf ;_ge ++{_gf =_fbc .Data [_fbe +_ge ];_df =_abdc [_gf ];_bg =_da +_ge *4;if _cb !=0&&(_ge +1)*4> _ff .RowStride {for _fc =_cb ;
|
|
_fc > 0;_fc --{_dg =byte ((_df >>uint (_fc *8))&0xff);_cc =_bg +(_cb -_fc );if _eba =_ff .SetByte (_cc ,_dg );_eba !=nil {return _b .Wrapf (_eba ,_ga ,"D\u0069\u0066\u0066\u0065\u0072\u0065n\u0074\u0020\u0072\u006f\u0077\u0073\u0074\u0072\u0069d\u0065\u0073\u002e \u004b:\u0020\u0025\u0064",_fc );
|
|
};};}else if _eba =_ff .setFourBytes (_bg ,_df );_eba !=nil {return _b .Wrap (_eba ,_ga ,"");};if _eba =_ff .setFourBytes (_da +_ge *4,_abdc [_fbc .Data [_fbe +_ge ]]);_eba !=nil {return _b .Wrap (_eba ,_ga ,"");};};for _fc =1;_fc < 4;_fc ++{for _ge =0;
|
|
_ge < _gad ;_ge ++{if _eba =_ff .SetByte (_da +_fc *_gad +_ge ,_ff .Data [_da +_ge ]);_eba !=nil {return _b .Wrapf (_eba ,_ga ,"\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",_fc ,_ge );
|
|
};};};};return nil ;};func _cbgc (_cfdf *Bitmap ,_agef int )(*Bitmap ,error ){const _adbdf ="\u0065x\u0070a\u006e\u0064\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0065";if _cfdf ==nil {return nil ,_b .Error (_adbdf ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _agef <=0{return nil ,_b .Error (_adbdf ,"i\u006e\u0076\u0061\u006cid\u0020f\u0061\u0063\u0074\u006f\u0072 \u002d\u0020\u003c\u003d\u0020\u0030");};if _agef ==1{_ebcd ,_eea :=_daef (nil ,_cfdf );if _eea !=nil {return nil ,_b .Wrap (_eea ,_adbdf ,"\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u003d\u0020\u0031");
|
|
};return _ebcd ,nil ;};_gdba ,_cffef :=_ccb (_cfdf ,_agef ,_agef );if _cffef !=nil {return nil ,_b .Wrap (_cffef ,_adbdf ,"");};return _gdba ,nil ;};func Dilate (d *Bitmap ,s *Bitmap ,sel *Selection )(*Bitmap ,error ){return _cgbb (d ,s ,sel )};type SizeComparison int ;
|
|
var MorphBC BoundaryCondition ;type Component int ;func _gcbf (_ffdcb *Bitmap ,_ecfd *Bitmap ,_dfeb *Selection ,_gedd **Bitmap )(*Bitmap ,error ){const _gdfc ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0031";
|
|
if _ecfd ==nil {return nil ,_b .Error (_gdfc ,"\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 _dfeb ==nil {return nil ,_b .Error (_gdfc ,"\u004d\u006f\u0072\u0068p\u0041\u0072\u0067\u0073\u0031\u0020\u0027\u0073\u0065\u006c'\u0020n\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064");
|
|
};_baeg ,_aefd :=_dfeb .Height ,_dfeb .Width ;if _baeg ==0||_aefd ==0{return nil ,_b .Error (_gdfc ,"\u0073\u0065\u006c\u0065ct\u0069\u006f\u006e\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _ffdcb ==nil {_ffdcb =_ecfd .createTemplate ();
|
|
*_gedd =_ecfd ;return _ffdcb ,nil ;};_ffdcb .Width =_ecfd .Width ;_ffdcb .Height =_ecfd .Height ;_ffdcb .RowStride =_ecfd .RowStride ;_ffdcb .Color =_ecfd .Color ;_ffdcb .Data =make ([]byte ,_ecfd .RowStride *_ecfd .Height );if _ffdcb ==_ecfd {*_gedd =_ecfd .Copy ();
|
|
}else {*_gedd =_ecfd ;};return _ffdcb ,nil ;};const (MopDilation MorphOperation =iota ;MopErosion ;MopOpening ;MopClosing ;MopRankBinaryReduction ;MopReplicativeBinaryExpansion ;MopAddBorder ;);func (_ffd *Bitmap )addPadBits ()(_ebe error ){const _ddebb ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0061\u0064\u0064\u0050\u0061d\u0042\u0069\u0074\u0073";
|
|
_ecbg :=_ffd .Width %8;if _ecbg ==0{return nil ;};_dbe :=_ffd .Width /8;_ggae :=_ee .NewReader (_ffd .Data );_agee :=make ([]byte ,_ffd .Height *_ffd .RowStride );_cacd :=_ee .NewWriterMSB (_agee );_fbd :=make ([]byte ,_dbe );var (_cbd int ;_ebb uint64 ;
|
|
);for _cbd =0;_cbd < _ffd .Height ;_cbd ++{if _ ,_ebe =_ggae .Read (_fbd );_ebe !=nil {return _b .Wrap (_ebe ,_ddebb ,"\u0066u\u006c\u006c\u0020\u0062\u0079\u0074e");};if _ ,_ebe =_cacd .Write (_fbd );_ebe !=nil {return _b .Wrap (_ebe ,_ddebb ,"\u0066\u0075\u006c\u006c\u0020\u0062\u0079\u0074\u0065\u0073");
|
|
};if _ebb ,_ebe =_ggae .ReadBits (byte (_ecbg ));_ebe !=nil {return _b .Wrap (_ebe ,_ddebb ,"\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067\u0020\u0062\u0069\u0074\u0073");};if _ebe =_cacd .WriteByte (byte (_ebb )<<uint (8-_ecbg ));_ebe !=nil {return _b .Wrap (_ebe ,_ddebb ,"\u006ca\u0073\u0074\u0020\u0062\u0079\u0074e");
|
|
};};_ffd .Data =_cacd .Data ();return nil ;};func (_fdg *Bitmap )GetVanillaData ()[]byte {if _fdg .Color ==Chocolate {_fdg .inverseData ();};return _fdg .Data ;};func (_cgea *Bitmap )SetDefaultPixel (){for _aed :=range _cgea .Data {_cgea .Data [_aed ]=byte (0xff);
|
|
};};func (_aace *Bitmap )Equals (s *Bitmap )bool {if len (_aace .Data )!=len (s .Data )||_aace .Width !=s .Width ||_aace .Height !=s .Height {return false ;};for _aefc :=0;_aefc < _aace .Height ;_aefc ++{_agba :=_aefc *_aace .RowStride ;for _abb :=0;_abb < _aace .RowStride ;
|
|
_abb ++{if _aace .Data [_agba +_abb ]!=s .Data [_agba +_abb ]{return false ;};};};return true ;};func _fgb ()(_daa [256]uint64 ){for _gde :=0;_gde < 256;_gde ++{if _gde &0x01!=0{_daa [_gde ]|=0xff;};if _gde &0x02!=0{_daa [_gde ]|=0xff00;};if _gde &0x04!=0{_daa [_gde ]|=0xff0000;
|
|
};if _gde &0x08!=0{_daa [_gde ]|=0xff000000;};if _gde &0x10!=0{_daa [_gde ]|=0xff00000000;};if _gde &0x20!=0{_daa [_gde ]|=0xff0000000000;};if _gde &0x40!=0{_daa [_gde ]|=0xff000000000000;};if _gde &0x80!=0{_daa [_gde ]|=0xff00000000000000;};};return _daa ;
|
|
};func TstRSymbol (t *_d .T ,scale ...int )*Bitmap {_bdba ,_cefg :=NewWithData (4,5,[]byte {0xF0,0x90,0xF0,0xA0,0x90});_fg .NoError (t ,_cefg );return TstGetScaledSymbol (t ,_bdba ,scale ...);};func (_abaa *Bitmap )GetByte (index int )(byte ,error ){if index > len (_abaa .Data )-1||index < 0{return 0,_b .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 _abaa .Data [index ],nil ;};func (_fagg *ClassedPoints )XAtIndex (i int )float32 {return (*_fagg .Points )[_fagg .IntSlice [i ]].X };const _bcac =5000;func (_ddde *Boxes )selectWithIndicator (_cgee *_e .NumSlice )(_ggf *Boxes ,_fgabg error ){const _eeb ="\u0042o\u0078\u0065\u0073\u002es\u0065\u006c\u0065\u0063\u0074W\u0069t\u0068I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _ddde ==nil {return nil ,_b .Error (_eeb ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if _cgee ==nil {return nil ,_b .Error (_eeb ,"\u0027\u006ea\u0027\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if len (*_cgee )!=len (*_ddde ){return nil ,_b .Error (_eeb ,"\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 _dddgc ,_fgfb int ;for _gadg :=0;_gadg < len (*_cgee );_gadg ++{if _dddgc ,_fgabg =_cgee .GetInt (_gadg );_fgabg !=nil {return nil ,_b .Wrap (_fgabg ,_eeb ,"\u0063\u0068\u0065\u0063\u006b\u0069\u006e\u0067\u0020c\u006f\u0075\u006e\u0074");};if _dddgc ==1{_fgfb ++;
|
|
};};if _fgfb ==len (*_ddde ){return _ddde ,nil ;};_bcgbd :=Boxes {};for _def :=0;_def < len (*_cgee );_def ++{_dddgc =int ((*_cgee )[_def ]);if _dddgc ==0{continue ;};_bcgbd =append (_bcgbd ,(*_ddde )[_def ]);};_ggf =&_bcgbd ;return _ggf ,nil ;};func (_fgea *Boxes )Get (i int )(*_ce .Rectangle ,error ){const _bggd ="\u0042o\u0078\u0065\u0073\u002e\u0047\u0065t";
|
|
if _fgea ==nil {return nil ,_b .Error (_bggd ,"\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if i > len (*_fgea )-1{return nil ,_b .Errorf (_bggd ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return (*_fgea )[i ],nil ;};func (_edgb *Bitmaps )selectByIndicator (_fedce *_e .NumSlice )(_gddd *Bitmaps ,_acfe error ){const _cbcc ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u0073\u0065\u006c\u0065c\u0074B\u0079I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _edgb ==nil {return nil ,_b .Error (_cbcc ,"\u0027\u0062\u0027 b\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _fedce ==nil {return nil ,_b .Error (_cbcc ,"'\u006e\u0061\u0027\u0020\u0069\u006ed\u0069\u0063\u0061\u0074\u006f\u0072\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
};if len (_edgb .Values )==0{return _edgb ,nil ;};if len (*_fedce )!=len (_edgb .Values ){return nil ,_b .Errorf (_cbcc ,"\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 (*_fedce ),len (_edgb .Values ));
|
|
};var _afba ,_fdced ,_decb int ;for _fdced =0;_fdced < len (*_fedce );_fdced ++{if _afba ,_acfe =_fedce .GetInt (_fdced );_acfe !=nil {return nil ,_b .Wrap (_acfe ,_cbcc ,"f\u0069\u0072\u0073\u0074\u0020\u0063\u0068\u0065\u0063\u006b");};if _afba ==1{_decb ++;
|
|
};};if _decb ==len (_edgb .Values ){return _edgb ,nil ;};_gddd =&Bitmaps {};_fdefc :=len (_edgb .Values )==len (_edgb .Boxes );for _fdced =0;_fdced < len (*_fedce );_fdced ++{if _afba =int ((*_fedce )[_fdced ]);_afba ==0{continue ;};_gddd .Values =append (_gddd .Values ,_edgb .Values [_fdced ]);
|
|
if _fdefc {_gddd .Boxes =append (_gddd .Boxes ,_edgb .Boxes [_fdced ]);};};return _gddd ,nil ;};func TstPSymbol (t *_d .T )*Bitmap {t .Helper ();_ebd :=New (5,8);_fg .NoError (t ,_ebd .SetPixel (0,0,1));_fg .NoError (t ,_ebd .SetPixel (1,0,1));_fg .NoError (t ,_ebd .SetPixel (2,0,1));
|
|
_fg .NoError (t ,_ebd .SetPixel (3,0,1));_fg .NoError (t ,_ebd .SetPixel (4,1,1));_fg .NoError (t ,_ebd .SetPixel (0,1,1));_fg .NoError (t ,_ebd .SetPixel (4,2,1));_fg .NoError (t ,_ebd .SetPixel (0,2,1));_fg .NoError (t ,_ebd .SetPixel (4,3,1));_fg .NoError (t ,_ebd .SetPixel (0,3,1));
|
|
_fg .NoError (t ,_ebd .SetPixel (0,4,1));_fg .NoError (t ,_ebd .SetPixel (1,4,1));_fg .NoError (t ,_ebd .SetPixel (2,4,1));_fg .NoError (t ,_ebd .SetPixel (3,4,1));_fg .NoError (t ,_ebd .SetPixel (0,5,1));_fg .NoError (t ,_ebd .SetPixel (0,6,1));_fg .NoError (t ,_ebd .SetPixel (0,7,1));
|
|
return _ebd ;};func (_gba *Bitmap )removeBorderGeneral (_aefce ,_aab ,_fcc ,_dgf int )(*Bitmap ,error ){const _faae ="\u0072\u0065\u006d\u006fve\u0042\u006f\u0072\u0064\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";if _aefce < 0||_aab < 0||_fcc < 0||_dgf < 0{return nil ,_b .Error (_faae ,"\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");
|
|
};_dgfe ,_ebf :=_gba .Width ,_gba .Height ;_adeb :=_dgfe -_aefce -_aab ;_acdb :=_ebf -_fcc -_dgf ;if _adeb <=0{return nil ,_b .Errorf (_faae ,"w\u0069\u0064\u0074\u0068: \u0025d\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u003e\u0020\u0030",_adeb );
|
|
};if _acdb <=0{return nil ,_b .Errorf (_faae ,"\u0068\u0065\u0069\u0067ht\u003a\u0020\u0025\u0064\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u003e \u0030",_acdb );};_ggdd :=New (_adeb ,_acdb );_ggdd .Color =_gba .Color ;_ccg :=_ggdd .RasterOperation (0,0,_adeb ,_acdb ,PixSrc ,_gba ,_aefce ,_fcc );
|
|
if _ccg !=nil {return nil ,_b .Wrap (_ccg ,_faae ,"");};return _ggdd ,nil ;};func RankHausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH ,area1 ,area3 int ,rank float32 ,tab8 []int )(_dcaf bool ,_gacg error ){const _ffa ="\u0052\u0061\u006ek\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";
|
|
_geee ,_afca :=p1 .Width ,p1 .Height ;_dece ,_gdee :=p3 .Width ,p3 .Height ;if _e .Abs (_geee -_dece )> maxDiffW {return false ,nil ;};if _e .Abs (_afca -_gdee )> maxDiffH {return false ,nil ;};_fbee :=int (float32 (area1 )*(1.0-rank )+0.5);_ebefd :=int (float32 (area3 )*(1.0-rank )+0.5);
|
|
var _acgc ,_edgdg int ;if delX >=0{_acgc =int (delX +0.5);}else {_acgc =int (delX -0.5);};if delY >=0{_edgdg =int (delY +0.5);}else {_edgdg =int (delY -0.5);};_gdafe :=p1 .CreateTemplate ();if _gacg =_gdafe .RasterOperation (0,0,_geee ,_afca ,PixSrc ,p1 ,0,0);
|
|
_gacg !=nil {return false ,_b .Wrap (_gacg ,_ffa ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _gacg =_gdafe .RasterOperation (_acgc ,_edgdg ,_geee ,_afca ,PixNotSrcAndDst ,p4 ,0,0);_gacg !=nil {return false ,_b .Wrap (_gacg ,_ffa ,"\u0074 \u0026\u0020\u0021\u0070\u0034");
|
|
};_dcaf ,_gacg =_gdafe .ThresholdPixelSum (_fbee ,tab8 );if _gacg !=nil {return false ,_b .Wrap (_gacg ,_ffa ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0031");};if _dcaf {return false ,nil ;};if _gacg =_gdafe .RasterOperation (_acgc ,_edgdg ,_dece ,_gdee ,PixSrc ,p3 ,0,0);
|
|
_gacg !=nil {return false ,_b .Wrap (_gacg ,_ffa ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _gacg =_gdafe .RasterOperation (0,0,_dece ,_gdee ,PixNotSrcAndDst ,p2 ,0,0);_gacg !=nil {return false ,_b .Wrap (_gacg ,_ffa ,"\u0074 \u0026\u0020\u0021\u0070\u0032");
|
|
};_dcaf ,_gacg =_gdafe .ThresholdPixelSum (_ebefd ,tab8 );if _gacg !=nil {return false ,_b .Wrap (_gacg ,_ffa ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0033");};return !_dcaf ,nil ;};func TstVSymbol (t *_d .T ,scale ...int )*Bitmap {_abgd ,_gaeg :=NewWithData (5,5,[]byte {0x88,0x88,0x88,0x50,0x20});
|
|
_fg .NoError (t ,_gaeg );return TstGetScaledSymbol (t ,_abgd ,scale ...);};func (_cdaa *Bitmap )AddBorderGeneral (left ,right ,top ,bot int ,val int )(*Bitmap ,error ){return _cdaa .addBorderGeneral (left ,right ,top ,bot ,val );};type Selection struct{Height ,Width int ;
|
|
Cx ,Cy int ;Name string ;Data [][]SelectionValue ;};func (_gfe *Bitmap )ThresholdPixelSum (thresh int ,tab8 []int )(_ccd bool ,_bfc error ){const _daea ="\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 =_bbgf ();};_dacb :=_gfe .Width >>3;_gcd :=_gfe .Width &7;_dce :=byte (0xff<<uint (8-_gcd ));var (_fbcd ,_eae ,_eefa ,_bdag int ;_gee byte ;);for _fbcd =0;_fbcd < _gfe .Height ;_fbcd ++{_eefa =_gfe .RowStride *_fbcd ;for _eae =0;_eae < _dacb ;
|
|
_eae ++{_gee ,_bfc =_gfe .GetByte (_eefa +_eae );if _bfc !=nil {return false ,_b .Wrap (_bfc ,_daea ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};_bdag +=tab8 [_gee ];};if _gcd !=0{_gee ,_bfc =_gfe .GetByte (_eefa +_eae );if _bfc !=nil {return false ,_b .Wrap (_bfc ,_daea ,"p\u0061\u0072\u0074\u0069\u0061\u006c\u0042\u0079\u0074\u0065");
|
|
};_gee &=_dce ;_bdag +=tab8 [_gee ];};if _bdag > thresh {return true ,nil ;};};return _ccd ,nil ;};func (_fccdg *Bitmaps )GroupByHeight ()(*BitmapsArray ,error ){const _dcagd ="\u0047\u0072\u006f\u0075\u0070\u0042\u0079\u0048\u0065\u0069\u0067\u0068\u0074";
|
|
if len (_fccdg .Values )==0{return nil ,_b .Error (_dcagd ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_bade :=&BitmapsArray {};_fccdg .SortByHeight ();_cgae :=-1;_dcbb :=-1;for _fgfc :=0;_fgfc < len (_fccdg .Values );
|
|
_fgfc ++{_fedfe :=_fccdg .Values [_fgfc ].Height ;if _fedfe > _cgae {_cgae =_fedfe ;_dcbb ++;_bade .Values =append (_bade .Values ,&Bitmaps {});};_bade .Values [_dcbb ].AddBitmap (_fccdg .Values [_fgfc ]);};return _bade ,nil ;};func Extract (roi _ce .Rectangle ,src *Bitmap )(*Bitmap ,error ){_agea :=New (roi .Dx (),roi .Dy ());
|
|
_dggf :=roi .Min .X &0x07;_aaa :=8-_dggf ;_agdd :=uint (8-_agea .Width &0x07);_facg :=src .GetByteIndex (roi .Min .X ,roi .Min .Y );_daae :=src .GetByteIndex (roi .Max .X -1,roi .Min .Y );_agc :=_agea .RowStride ==_daae +1-_facg ;var _efcad int ;for _bbgc :=roi .Min .Y ;
|
|
_bbgc < roi .Max .Y ;_bbgc ++{_gfga :=_facg ;_badb :=_efcad ;switch {case _facg ==_daae :_dfaf ,_eebg :=src .GetByte (_gfga );if _eebg !=nil {return nil ,_eebg ;};_dfaf <<=uint (_dggf );_eebg =_agea .SetByte (_badb ,_eeff (_agdd ,_dfaf ));if _eebg !=nil {return nil ,_eebg ;
|
|
};case _dggf ==0:for _dbf :=_facg ;_dbf <=_daae ;_dbf ++{_bffa ,_cgcb :=src .GetByte (_gfga );if _cgcb !=nil {return nil ,_cgcb ;};_gfga ++;if _dbf ==_daae &&_agc {_bffa =_eeff (_agdd ,_bffa );};_cgcb =_agea .SetByte (_badb ,_bffa );if _cgcb !=nil {return nil ,_cgcb ;
|
|
};_badb ++;};default:_ffea :=_fdbf (src ,_agea ,uint (_dggf ),uint (_aaa ),_agdd ,_facg ,_daae ,_agc ,_gfga ,_badb );if _ffea !=nil {return nil ,_ffea ;};};_facg +=src .RowStride ;_daae +=src .RowStride ;_efcad +=_agea .RowStride ;};return _agea ,nil ;
|
|
};func (_dcbd *ClassedPoints )SortByY (){_dcbd ._cbfb =_dcbd .ySortFunction ();_dd .Sort (_dcbd )};func (_ddf *Bitmap )And (s *Bitmap )(_fba *Bitmap ,_cab error ){const _gfcd ="\u0042\u0069\u0074\u006d\u0061\u0070\u002e\u0041\u006e\u0064";if _ddf ==nil {return nil ,_b .Error (_gfcd ,"\u0027b\u0069t\u006d\u0061\u0070\u0020\u0027b\u0027\u0020i\u0073\u0020\u006e\u0069\u006c");
|
|
};if s ==nil {return nil ,_b .Error (_gfcd ,"\u0062\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069s\u0020\u006e\u0069\u006c");};if !_ddf .SizesEqual (s ){_g .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",_gfcd );
|
|
};if _fba ,_cab =_daef (_fba ,_ddf );_cab !=nil {return nil ,_b .Wrap (_cab ,_gfcd ,"\u0063\u0061\u006e't\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _cab =_fba .RasterOperation (0,0,_fba .Width ,_fba .Height ,PixSrcAndDst ,s ,0,0);
|
|
_cab !=nil {return nil ,_b .Wrap (_cab ,_gfcd ,"");};return _fba ,nil ;};func _cadb (_gbda ,_beca *Bitmap ,_fgaf *Selection )(*Bitmap ,error ){const _bbcf ="\u006f\u0070\u0065\u006e";var _fbdb error ;_gbda ,_fbdb =_adec (_gbda ,_beca ,_fgaf );if _fbdb !=nil {return nil ,_b .Wrap (_fbdb ,_bbcf ,"");
|
|
};_gbea ,_fbdb :=_edab (nil ,_beca ,_fgaf );if _fbdb !=nil {return nil ,_b .Wrap (_fbdb ,_bbcf ,"");};_ ,_fbdb =_cgbb (_gbda ,_gbea ,_fgaf );if _fbdb !=nil {return nil ,_b .Wrap (_fbdb ,_bbcf ,"");};return _gbda ,nil ;};func (_cdbc *Boxes )makeSizeIndicator (_daeb ,_cffd int ,_ccf LocationFilter ,_add SizeComparison )*_e .NumSlice {_aafg :=&_e .NumSlice {};
|
|
var _dcgb ,_fdge ,_gdg int ;for _ ,_beg :=range *_cdbc {_dcgb =0;_fdge ,_gdg =_beg .Dx (),_beg .Dy ();switch _ccf {case LocSelectWidth :if (_add ==SizeSelectIfLT &&_fdge < _daeb )||(_add ==SizeSelectIfGT &&_fdge > _daeb )||(_add ==SizeSelectIfLTE &&_fdge <=_daeb )||(_add ==SizeSelectIfGTE &&_fdge >=_daeb ){_dcgb =1;
|
|
};case LocSelectHeight :if (_add ==SizeSelectIfLT &&_gdg < _cffd )||(_add ==SizeSelectIfGT &&_gdg > _cffd )||(_add ==SizeSelectIfLTE &&_gdg <=_cffd )||(_add ==SizeSelectIfGTE &&_gdg >=_cffd ){_dcgb =1;};case LocSelectIfEither :if (_add ==SizeSelectIfLT &&(_gdg < _cffd ||_fdge < _daeb ))||(_add ==SizeSelectIfGT &&(_gdg > _cffd ||_fdge > _daeb ))||(_add ==SizeSelectIfLTE &&(_gdg <=_cffd ||_fdge <=_daeb ))||(_add ==SizeSelectIfGTE &&(_gdg >=_cffd ||_fdge >=_daeb )){_dcgb =1;
|
|
};case LocSelectIfBoth :if (_add ==SizeSelectIfLT &&(_gdg < _cffd &&_fdge < _daeb ))||(_add ==SizeSelectIfGT &&(_gdg > _cffd &&_fdge > _daeb ))||(_add ==SizeSelectIfLTE &&(_gdg <=_cffd &&_fdge <=_daeb ))||(_add ==SizeSelectIfGTE &&(_gdg >=_cffd &&_fdge >=_daeb )){_dcgb =1;
|
|
};};_aafg .AddInt (_dcgb );};return _aafg ;};func (_cedc *Bitmaps )selectByIndexes (_bafg []int )(*Bitmaps ,error ){_efaba :=&Bitmaps {};for _ ,_bgcb :=range _bafg {_ddaa ,_eccf :=_cedc .GetBitmap (_bgcb );if _eccf !=nil {return nil ,_b .Wrap (_eccf ,"\u0073e\u006ce\u0063\u0074\u0042\u0079\u0049\u006e\u0064\u0065\u0078\u0065\u0073","");
|
|
};_efaba .AddBitmap (_ddaa );};return _efaba ,nil ;};func _de (_ad *Bitmap ,_gbc int )(*Bitmap ,error ){const _ddgd ="\u0065x\u0070a\u006e\u0064\u0042\u0069\u006ea\u0072\u0079P\u006f\u0077\u0065\u0072\u0032";if _ad ==nil {return nil ,_b .Error (_ddgd ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _gbc ==1{return _daef (nil ,_ad );};if _gbc !=2&&_gbc !=4&&_gbc !=8{return nil ,_b .Error (_ddgd ,"\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");
|
|
};_gg :=_gbc *_ad .Width ;_ag :=_gbc *_ad .Height ;_ef :=New (_gg ,_ag );var _ade error ;switch _gbc {case 2:_ade =_ab (_ef ,_ad );case 4:_ade =_aba (_ef ,_ad );case 8:_ade =_fe (_ef ,_ad );};if _ade !=nil {return nil ,_b .Wrap (_ade ,_ddgd ,"");};return _ef ,nil ;
|
|
};func _fbed (_ea *Bitmap ,_eaf *Bitmap ,_fee int )(_fbfb error ){const _eef ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0050\u006fw\u0065\u0072\u0032\u004c\u006f\u0077";switch _fee {case 2:_fbfb =_ab (_ea ,_eaf );case 4:_fbfb =_aba (_ea ,_eaf );
|
|
case 8:_fbfb =_fe (_ea ,_eaf );default:return _b .Error (_eef ,"\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 _fbfb !=nil {_fbfb =_b .Wrap (_fbfb ,_eef ,"");};return _fbfb ;};func (_eabe *ClassedPoints )Swap (i ,j int ){_eabe .IntSlice [i ],_eabe .IntSlice [j ]=_eabe .IntSlice [j ],_eabe .IntSlice [i ];};func TstWSymbol (t *_d .T ,scale ...int )*Bitmap {_dgfef ,_cabc :=NewWithData (5,5,[]byte {0x88,0x88,0xA8,0xD8,0x88});
|
|
_fg .NoError (t ,_cabc );return TstGetScaledSymbol (t ,_dgfef ,scale ...);};func _ecacd (_fagga *Bitmap ,_eddg ,_gbecf ,_defff ,_ccdea int ,_acfb RasterOperator ){if _eddg < 0{_defff +=_eddg ;_eddg =0;};_acaac :=_eddg +_defff -_fagga .Width ;if _acaac > 0{_defff -=_acaac ;
|
|
};if _gbecf < 0{_ccdea +=_gbecf ;_gbecf =0;};_gacc :=_gbecf +_ccdea -_fagga .Height ;if _gacc > 0{_ccdea -=_gacc ;};if _defff <=0||_ccdea <=0{return ;};if (_eddg &7)==0{_gbgf (_fagga ,_eddg ,_gbecf ,_defff ,_ccdea ,_acfb );}else {_babf (_fagga ,_eddg ,_gbecf ,_defff ,_ccdea ,_acfb );
|
|
};};type byHeight Bitmaps ;func NewClassedPoints (points *Points ,classes _e .IntSlice )(*ClassedPoints ,error ){const _eefg ="\u004e\u0065w\u0043\u006c\u0061s\u0073\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073";if points ==nil {return nil ,_b .Error (_eefg ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0070\u006f\u0069\u006e\u0074\u0073");
|
|
};if classes ==nil {return nil ,_b .Error (_eefg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0063\u006c\u0061ss\u0065\u0073");};_ffed :=&ClassedPoints {Points :points ,IntSlice :classes };if _ecbb :=_ffed .validateIntSlice ();_ecbb !=nil {return nil ,_b .Wrap (_ecbb ,_eefg ,"");
|
|
};return _ffed ,nil ;};const (_gbfgc shift =iota ;_fcac ;);func _cegaa (_dbdee *Bitmap ,_aacfd *_e .Stack ,_bdda ,_dega ,_baedb int )(_bbeed *_ce .Rectangle ,_fbacf error ){const _dcedb ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _dbdee ==nil {return nil ,_b .Error (_dcedb ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _aacfd ==nil {return nil ,_b .Error (_dcedb ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};switch _baedb {case 4:if _bbeed ,_fbacf =_bbbb (_dbdee ,_aacfd ,_bdda ,_dega );_fbacf !=nil {return nil ,_b .Wrap (_fbacf ,_dcedb ,"");};return _bbeed ,nil ;case 8:if _bbeed ,_fbacf =_deba (_dbdee ,_aacfd ,_bdda ,_dega );_fbacf !=nil {return nil ,_b .Wrap (_fbacf ,_dcedb ,"");
|
|
};return _bbeed ,nil ;default:return nil ,_b .Errorf (_dcedb ,"\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",_baedb );
|
|
};};func (_gagf *Bitmap )Equivalent (s *Bitmap )bool {return _gagf .equivalent (s )};func _fecf (_cdfc *_e .Stack )(_beeb *fillSegment ,_edaa error ){const _egga ="\u0070\u006f\u0070\u0046\u0069\u006c\u006c\u0053\u0065g\u006d\u0065\u006e\u0074";if _cdfc ==nil {return nil ,_b .Error (_egga ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
};if _cdfc .Aux ==nil {return nil ,_b .Error (_egga ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};_eged ,_eegd :=_cdfc .Pop ();if !_eegd {return nil ,nil ;};_dbbc ,_eegd :=_eged .(*fillSegment );if !_eegd {return nil ,_b .Error (_egga ,"\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");
|
|
};_beeb =&fillSegment {_dbbc ._gbdag ,_dbbc ._fddc ,_dbbc ._ecggb +_dbbc ._ccbb ,_dbbc ._ccbb };_cdfc .Aux .Push (_dbbc );return _beeb ,nil ;};func _fe (_cg ,_dfa *Bitmap )(_ac error ){const _dfc ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0038";
|
|
_ddg :=_dfa .RowStride ;_ed :=_cg .RowStride ;var _dgc ,_be ,_bd ,_gb ,_ec int ;for _bd =0;_bd < _dfa .Height ;_bd ++{_dgc =_bd *_ddg ;_be =8*_bd *_ed ;for _gb =0;_gb < _ddg ;_gb ++{if _ac =_cg .setEightBytes (_be +_gb *8,_defb [_dfa .Data [_dgc +_gb ]]);
|
|
_ac !=nil {return _b .Wrap (_ac ,_dfc ,"");};};for _ec =1;_ec < 8;_ec ++{for _gb =0;_gb < _ed ;_gb ++{if _ac =_cg .SetByte (_be +_ec *_ed +_gb ,_cg .Data [_be +_gb ]);_ac !=nil {return _b .Wrap (_ac ,_dfc ,"");};};};};return nil ;};func (_deb *Bitmap )equivalent (_fcbff *Bitmap )bool {if _deb ==_fcbff {return true ;
|
|
};if !_deb .SizesEqual (_fcbff ){return false ;};_abd :=_defc (_deb ,_fcbff ,CmbOpXor );_dddg :=_deb .countPixels ();_gebb :=int (0.25*float32 (_dddg ));if _abd .thresholdPixelSum (_gebb ){return false ;};var (_bdef [9][9]int ;_adf [18][9]int ;_agfg [9][18]int ;
|
|
_fdca int ;_edgg int ;);_dddd :=9;_gedc :=_deb .Height /_dddd ;_ccde :=_deb .Width /_dddd ;_cgcc ,_gddc :=_gedc /2,_ccde /2;if _gedc < _ccde {_cgcc =_ccde /2;_gddc =_gedc /2;};_dcfc :=float64 (_cgcc )*float64 (_gddc )*_ae .Pi ;_ggce :=int (float64 (_gedc *_ccde /2)*0.9);
|
|
_cagb :=int (float64 (_ccde *_gedc /2)*0.9);for _cged :=0;_cged < _dddd ;_cged ++{_bbeg :=_ccde *_cged +_fdca ;var _egb int ;if _cged ==_dddd -1{_fdca =0;_egb =_deb .Width ;}else {_egb =_bbeg +_ccde ;if ((_deb .Width -_fdca )%_dddd )> 0{_fdca ++;_egb ++;
|
|
};};for _cffc :=0;_cffc < _dddd ;_cffc ++{_gdbf :=_gedc *_cffc +_edgg ;var _cdab int ;if _cffc ==_dddd -1{_edgg =0;_cdab =_deb .Height ;}else {_cdab =_gdbf +_gedc ;if (_deb .Height -_edgg )%_dddd > 0{_edgg ++;_cdab ++;};};var _dgg ,_eaa ,_cbc ,_adef int ;
|
|
_afee :=(_bbeg +_egb )/2;_edgd :=(_gdbf +_cdab )/2;for _ccaf :=_bbeg ;_ccaf < _egb ;_ccaf ++{for _acde :=_gdbf ;_acde < _cdab ;_acde ++{if _abd .GetPixel (_ccaf ,_acde ){if _ccaf < _afee {_dgg ++;}else {_eaa ++;};if _acde < _edgd {_adef ++;}else {_cbc ++;
|
|
};};};};_bdef [_cged ][_cffc ]=_dgg +_eaa ;_adf [_cged *2][_cffc ]=_dgg ;_adf [_cged *2+1][_cffc ]=_eaa ;_agfg [_cged ][_cffc *2]=_adef ;_agfg [_cged ][_cffc *2+1]=_cbc ;};};for _cfg :=0;_cfg < _dddd *2-1;_cfg ++{for _bbga :=0;_bbga < (_dddd -1);_bbga ++{var _aec int ;
|
|
for _gadee :=0;_gadee < 2;_gadee ++{for _gefd :=0;_gefd < 2;_gefd ++{_aec +=_adf [_cfg +_gadee ][_bbga +_gefd ];};};if _aec > _cagb {return false ;};};};for _ggbc :=0;_ggbc < (_dddd -1);_ggbc ++{for _edea :=0;_edea < ((_dddd *2)-1);_edea ++{var _ebg int ;
|
|
for _dca :=0;_dca < 2;_dca ++{for _eefc :=0;_eefc < 2;_eefc ++{_ebg +=_agfg [_ggbc +_dca ][_edea +_eefc ];};};if _ebg > _ggce {return false ;};};};for _cdbe :=0;_cdbe < (_dddd -2);_cdbe ++{for _adcc :=0;_adcc < (_dddd -2);_adcc ++{var _ggde ,_fbaa int ;
|
|
for _adcg :=0;_adcg < 3;_adcg ++{for _gedb :=0;_gedb < 3;_gedb ++{if _adcg ==_gedb {_ggde +=_bdef [_cdbe +_adcg ][_adcc +_gedb ];};if (2-_adcg )==_gedb {_fbaa +=_bdef [_cdbe +_adcg ][_adcc +_gedb ];};};};if _ggde > _cagb ||_fbaa > _cagb {return false ;
|
|
};};};for _edac :=0;_edac < (_dddd -1);_edac ++{for _fca :=0;_fca < (_dddd -1);_fca ++{var _afab int ;for _badd :=0;_badd < 2;_badd ++{for _efff :=0;_efff < 2;_efff ++{_afab +=_bdef [_edac +_badd ][_fca +_efff ];};};if float64 (_afab )> _dcfc {return false ;
|
|
};};};return true ;};func _gfc (_fed ,_fgc *Bitmap ,_aef int ,_cfd []byte ,_bgf int )(_aded error ){const _dee ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0031";var (_dbc ,_feea ,_agb ,_cdc ,_beb ,_dbg ,_gff ,_fbfa int ;
|
|
_cgf ,_cffg uint32 ;_bgae ,_abae byte ;_gbg uint16 ;);_abcc :=make ([]byte ,4);_cag :=make ([]byte ,4);for _agb =0;_agb < _fed .Height -1;_agb ,_cdc =_agb +2,_cdc +1{_dbc =_agb *_fed .RowStride ;_feea =_cdc *_fgc .RowStride ;for _beb ,_dbg =0,0;_beb < _bgf ;
|
|
_beb ,_dbg =_beb +4,_dbg +1{for _gff =0;_gff < 4;_gff ++{_fbfa =_dbc +_beb +_gff ;if _fbfa <=len (_fed .Data )-1&&_fbfa < _dbc +_fed .RowStride {_abcc [_gff ]=_fed .Data [_fbfa ];}else {_abcc [_gff ]=0x00;};_fbfa =_dbc +_fed .RowStride +_beb +_gff ;if _fbfa <=len (_fed .Data )-1&&_fbfa < _dbc +(2*_fed .RowStride ){_cag [_gff ]=_fed .Data [_fbfa ];
|
|
}else {_cag [_gff ]=0x00;};};_cgf =_ba .BigEndian .Uint32 (_abcc );_cffg =_ba .BigEndian .Uint32 (_cag );_cffg |=_cgf ;_cffg |=_cffg <<1;_cffg &=0xaaaaaaaa;_cgf =_cffg |(_cffg <<7);_bgae =byte (_cgf >>24);_abae =byte ((_cgf >>8)&0xff);_fbfa =_feea +_dbg ;
|
|
if _fbfa +1==len (_fgc .Data )-1||_fbfa +1>=_feea +_fgc .RowStride {_fgc .Data [_fbfa ]=_cfd [_bgae ];}else {_gbg =(uint16 (_cfd [_bgae ])<<8)|uint16 (_cfd [_abae ]);if _aded =_fgc .setTwoBytes (_fbfa ,_gbg );_aded !=nil {return _b .Wrapf (_aded ,_dee ,"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",_fbfa );
|
|
};_dbg ++;};};};return nil ;};func _bbbb (_fdag *Bitmap ,_dgcac *_e .Stack ,_cefc ,_cfed int )(_daeg *_ce .Rectangle ,_cdca error ){const _eeec ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";if _fdag ==nil {return nil ,_b .Error (_eeec ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");
|
|
};if _dgcac ==nil {return nil ,_b .Error (_eeec ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");};_bffg ,_adaa :=_fdag .Width ,_fdag .Height ;_abdcb :=_bffg -1;_gcca :=_adaa -1;if _cefc < 0||_cefc > _abdcb ||_cfed < 0||_cfed > _gcca ||!_fdag .GetPixel (_cefc ,_cfed ){return nil ,nil ;
|
|
};var _gfage *_ce .Rectangle ;_gfage ,_cdca =Rect (100000,100000,0,0);if _cdca !=nil {return nil ,_b .Wrap (_cdca ,_eeec ,"");};if _cdca =_eefea (_dgcac ,_cefc ,_cefc ,_cfed ,1,_gcca ,_gfage );_cdca !=nil {return nil ,_b .Wrap (_cdca ,_eeec ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};if _cdca =_eefea (_dgcac ,_cefc ,_cefc ,_cfed +1,-1,_gcca ,_gfage );_cdca !=nil {return nil ,_b .Wrap (_cdca ,_eeec ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_gfage .Min .X ,_gfage .Max .X =_cefc ,_cefc ;
|
|
_gfage .Min .Y ,_gfage .Max .Y =_cfed ,_cfed ;var (_bdgg *fillSegment ;_aegf int ;);for _dgcac .Len ()> 0{if _bdgg ,_cdca =_fecf (_dgcac );_cdca !=nil {return nil ,_b .Wrap (_cdca ,_eeec ,"");};_cfed =_bdgg ._ecggb ;for _cefc =_bdgg ._gbdag ;_cefc >=0&&_fdag .GetPixel (_cefc ,_cfed );
|
|
_cefc --{if _cdca =_fdag .SetPixel (_cefc ,_cfed ,0);_cdca !=nil {return nil ,_b .Wrap (_cdca ,_eeec ,"");};};if _cefc >=_bdgg ._gbdag {for _cefc ++;_cefc <=_bdgg ._fddc &&_cefc <=_abdcb &&!_fdag .GetPixel (_cefc ,_cfed );_cefc ++{};_aegf =_cefc ;if !(_cefc <=_bdgg ._fddc &&_cefc <=_abdcb ){continue ;
|
|
};}else {_aegf =_cefc +1;if _aegf < _bdgg ._gbdag -1{if _cdca =_eefea (_dgcac ,_aegf ,_bdgg ._gbdag -1,_bdgg ._ecggb ,-_bdgg ._ccbb ,_gcca ,_gfage );_cdca !=nil {return nil ,_b .Wrap (_cdca ,_eeec ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_cefc =_bdgg ._gbdag +1;};for {for ;_cefc <=_abdcb &&_fdag .GetPixel (_cefc ,_cfed );_cefc ++{if _cdca =_fdag .SetPixel (_cefc ,_cfed ,0);_cdca !=nil {return nil ,_b .Wrap (_cdca ,_eeec ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _cdca =_eefea (_dgcac ,_aegf ,_cefc -1,_bdgg ._ecggb ,_bdgg ._ccbb ,_gcca ,_gfage );
|
|
_cdca !=nil {return nil ,_b .Wrap (_cdca ,_eeec ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _cefc > _bdgg ._fddc +1{if _cdca =_eefea (_dgcac ,_bdgg ._fddc +1,_cefc -1,_bdgg ._ecggb ,-_bdgg ._ccbb ,_gcca ,_gfage );_cdca !=nil {return nil ,_b .Wrap (_cdca ,_eeec ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _cefc ++;_cefc <=_bdgg ._fddc &&_cefc <=_abdcb &&!_fdag .GetPixel (_cefc ,_cfed );_cefc ++{};_aegf =_cefc ;if !(_cefc <=_bdgg ._fddc &&_cefc <=_abdcb ){break ;};};};_gfage .Max .X ++;_gfage .Max .Y ++;return _gfage ,nil ;};func ClipBoxToRectangle (box *_ce .Rectangle ,wi ,hi int )(_aacg *_ce .Rectangle ,_ecgg error ){const _aafc ="\u0043l\u0069p\u0042\u006f\u0078\u0054\u006fR\u0065\u0063t\u0061\u006e\u0067\u006c\u0065";
|
|
if box ==nil {return nil ,_b .Error (_aafc ,"\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 ,_b .Error (_aafc ,"\u0027\u0062\u006fx'\u0020\u006f\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0072\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065");
|
|
};_agaf :=*box ;_aacg =&_agaf ;if _aacg .Min .X < 0{_aacg .Max .X +=_aacg .Min .X ;_aacg .Min .X =0;};if _aacg .Min .Y < 0{_aacg .Max .Y +=_aacg .Min .Y ;_aacg .Min .Y =0;};if _aacg .Max .X > wi {_aacg .Max .X =wi ;};if _aacg .Max .Y > hi {_aacg .Max .Y =hi ;
|
|
};return _aacg ,nil ;};func _ccef (_ddfb *Bitmap ,_eeab ,_gbfg ,_faf ,_fgfa int ,_eeac RasterOperator ,_fbcdd *Bitmap ,_dadfg ,_ecbc int )error {var (_egbg bool ;_gdbad bool ;_bbegb int ;_agde int ;_bdbe int ;_bfdeg bool ;_gaddd byte ;_dbde int ;_dfce int ;
|
|
_daddc int ;_bbgd ,_ffaf int ;);_adgd :=8-(_eeab &7);_babaa :=_feba [_adgd ];_abfbd :=_ddfb .RowStride *_gbfg +(_eeab >>3);_bfgf :=_fbcdd .RowStride *_ecbc +(_dadfg >>3);if _faf < _adgd {_egbg =true ;_babaa &=_ddge [8-_adgd +_faf ];};if !_egbg {_bbegb =(_faf -_adgd )>>3;
|
|
if _bbegb > 0{_gdbad =true ;_agde =_abfbd +1;_bdbe =_bfgf +1;};};_dbde =(_eeab +_faf )&7;if !(_egbg ||_dbde ==0){_bfdeg =true ;_gaddd =_ddge [_dbde ];_dfce =_abfbd +1+_bbegb ;_daddc =_bfgf +1+_bbegb ;};switch _eeac {case PixSrc :for _bbgd =0;_bbgd < _fgfa ;
|
|
_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],_fbcdd .Data [_bfgf ],_babaa );_abfbd +=_ddfb .RowStride ;_bfgf +=_fbcdd .RowStride ;};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;_ffaf ++{_ddfb .Data [_agde +_ffaf ]=_fbcdd .Data [_bdbe +_ffaf ];
|
|
};_agde +=_ddfb .RowStride ;_bdbe +=_fbcdd .RowStride ;};};if _bfdeg {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],_fbcdd .Data [_daddc ],_gaddd );_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};case PixNotSrc :for _bbgd =0;
|
|
_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],^_fbcdd .Data [_bfgf ],_babaa );_abfbd +=_ddfb .RowStride ;_bfgf +=_fbcdd .RowStride ;};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;_ffaf ++{_ddfb .Data [_agde +_ffaf ]=^_fbcdd .Data [_bdbe +_ffaf ];
|
|
};_agde +=_ddfb .RowStride ;_bdbe +=_fbcdd .RowStride ;};};if _bfdeg {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],^_fbcdd .Data [_daddc ],_gaddd );_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};case PixSrcOrDst :for _bbgd =0;
|
|
_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],_fbcdd .Data [_bfgf ]|_ddfb .Data [_abfbd ],_babaa );_abfbd +=_ddfb .RowStride ;_bfgf +=_fbcdd .RowStride ;};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;
|
|
_ffaf ++{_ddfb .Data [_agde +_ffaf ]|=_fbcdd .Data [_bdbe +_ffaf ];};_agde +=_ddfb .RowStride ;_bdbe +=_fbcdd .RowStride ;};};if _bfdeg {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],_fbcdd .Data [_daddc ]|_ddfb .Data [_dfce ],_gaddd );
|
|
_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};case PixSrcAndDst :for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],_fbcdd .Data [_bfgf ]&_ddfb .Data [_abfbd ],_babaa );_abfbd +=_ddfb .RowStride ;_bfgf +=_fbcdd .RowStride ;
|
|
};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;_ffaf ++{_ddfb .Data [_agde +_ffaf ]&=_fbcdd .Data [_bdbe +_ffaf ];};_agde +=_ddfb .RowStride ;_bdbe +=_fbcdd .RowStride ;};};if _bfdeg {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],_fbcdd .Data [_daddc ]&_ddfb .Data [_dfce ],_gaddd );
|
|
_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};case PixSrcXorDst :for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],_fbcdd .Data [_bfgf ]^_ddfb .Data [_abfbd ],_babaa );_abfbd +=_ddfb .RowStride ;_bfgf +=_fbcdd .RowStride ;
|
|
};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;_ffaf ++{_ddfb .Data [_agde +_ffaf ]^=_fbcdd .Data [_bdbe +_ffaf ];};_agde +=_ddfb .RowStride ;_bdbe +=_fbcdd .RowStride ;};};if _bfdeg {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],_fbcdd .Data [_daddc ]^_ddfb .Data [_dfce ],_gaddd );
|
|
_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};case PixNotSrcOrDst :for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],^(_fbcdd .Data [_bfgf ])|_ddfb .Data [_abfbd ],_babaa );_abfbd +=_ddfb .RowStride ;_bfgf +=_fbcdd .RowStride ;
|
|
};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;_ffaf ++{_ddfb .Data [_agde +_ffaf ]|=^(_fbcdd .Data [_bdbe +_ffaf ]);};_agde +=_ddfb .RowStride ;_bdbe +=_fbcdd .RowStride ;};};if _bfdeg {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],^(_fbcdd .Data [_daddc ])|_ddfb .Data [_dfce ],_gaddd );
|
|
_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};case PixNotSrcAndDst :for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],^(_fbcdd .Data [_bfgf ])&_ddfb .Data [_abfbd ],_babaa );_abfbd +=_ddfb .RowStride ;
|
|
_bfgf +=_fbcdd .RowStride ;};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;_ffaf ++{_ddfb .Data [_agde +_ffaf ]&=^_fbcdd .Data [_bdbe +_ffaf ];};_agde +=_ddfb .RowStride ;_bdbe +=_fbcdd .RowStride ;};};if _bfdeg {for _bbgd =0;
|
|
_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],^(_fbcdd .Data [_daddc ])&_ddfb .Data [_dfce ],_gaddd );_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};case PixSrcOrNotDst :for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],_fbcdd .Data [_bfgf ]|^(_ddfb .Data [_abfbd ]),_babaa );
|
|
_abfbd +=_ddfb .RowStride ;_bfgf +=_fbcdd .RowStride ;};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;_ffaf ++{_ddfb .Data [_agde +_ffaf ]=_fbcdd .Data [_bdbe +_ffaf ]|^(_ddfb .Data [_agde +_ffaf ]);};_agde +=_ddfb .RowStride ;
|
|
_bdbe +=_fbcdd .RowStride ;};};if _bfdeg {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],_fbcdd .Data [_daddc ]|^(_ddfb .Data [_dfce ]),_gaddd );_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};case PixSrcAndNotDst :for _bbgd =0;
|
|
_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],_fbcdd .Data [_bfgf ]&^(_ddfb .Data [_abfbd ]),_babaa );_abfbd +=_ddfb .RowStride ;_bfgf +=_fbcdd .RowStride ;};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;
|
|
_ffaf ++{_ddfb .Data [_agde +_ffaf ]=_fbcdd .Data [_bdbe +_ffaf ]&^(_ddfb .Data [_agde +_ffaf ]);};_agde +=_ddfb .RowStride ;_bdbe +=_fbcdd .RowStride ;};};if _bfdeg {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],_fbcdd .Data [_daddc ]&^(_ddfb .Data [_dfce ]),_gaddd );
|
|
_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};case PixNotPixSrcOrDst :for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],^(_fbcdd .Data [_bfgf ]|_ddfb .Data [_abfbd ]),_babaa );_abfbd +=_ddfb .RowStride ;
|
|
_bfgf +=_fbcdd .RowStride ;};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;_ffaf ++{_ddfb .Data [_agde +_ffaf ]=^(_fbcdd .Data [_bdbe +_ffaf ]|_ddfb .Data [_agde +_ffaf ]);};_agde +=_ddfb .RowStride ;_bdbe +=_fbcdd .RowStride ;
|
|
};};if _bfdeg {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],^(_fbcdd .Data [_daddc ]|_ddfb .Data [_dfce ]),_gaddd );_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};case PixNotPixSrcAndDst :for _bbgd =0;
|
|
_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],^(_fbcdd .Data [_bfgf ]&_ddfb .Data [_abfbd ]),_babaa );_abfbd +=_ddfb .RowStride ;_bfgf +=_fbcdd .RowStride ;};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;
|
|
_ffaf ++{_ddfb .Data [_agde +_ffaf ]=^(_fbcdd .Data [_bdbe +_ffaf ]&_ddfb .Data [_agde +_ffaf ]);};_agde +=_ddfb .RowStride ;_bdbe +=_fbcdd .RowStride ;};};if _bfdeg {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],^(_fbcdd .Data [_daddc ]&_ddfb .Data [_dfce ]),_gaddd );
|
|
_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};case PixNotPixSrcXorDst :for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_abfbd ]=_fgcdb (_ddfb .Data [_abfbd ],^(_fbcdd .Data [_bfgf ]^_ddfb .Data [_abfbd ]),_babaa );_abfbd +=_ddfb .RowStride ;
|
|
_bfgf +=_fbcdd .RowStride ;};if _gdbad {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{for _ffaf =0;_ffaf < _bbegb ;_ffaf ++{_ddfb .Data [_agde +_ffaf ]=^(_fbcdd .Data [_bdbe +_ffaf ]^_ddfb .Data [_agde +_ffaf ]);};_agde +=_ddfb .RowStride ;_bdbe +=_fbcdd .RowStride ;
|
|
};};if _bfdeg {for _bbgd =0;_bbgd < _fgfa ;_bbgd ++{_ddfb .Data [_dfce ]=_fgcdb (_ddfb .Data [_dfce ],^(_fbcdd .Data [_daddc ]^_ddfb .Data [_dfce ]),_gaddd );_dfce +=_ddfb .RowStride ;_daddc +=_fbcdd .RowStride ;};};default:_g .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",_eeac );
|
|
return _b .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 (_ebag *byHeight )Len ()int {return len (_ebag .Values )};func (_aabe Points )GetGeometry (i int )(_bcgg ,_gdfa float32 ,_aeeec error ){if i > len (_aabe )-1{return 0,0,_b .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 );
|
|
};_cbab :=_aabe [i ];return _cbab .X ,_cbab .Y ,nil ;};func _cbf (_bag *Bitmap ,_gag int ,_acg []byte )(_cdf *Bitmap ,_bfg error ){const _bfb ="\u0072\u0065\u0064\u0075\u0063\u0065\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0032";if _bag ==nil {return nil ,_b .Error (_bfb ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _gag < 1||_gag > 4{return nil ,_b .Error (_bfb ,"\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 _bag .Height <=1{return nil ,_b .Errorf (_bfb ,"\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",_bag .Height );
|
|
};_cdf =New (_bag .Width /2,_bag .Height /2);if _acg ==nil {_acg =_aag ();};_cff :=_dcagf (_bag .RowStride ,2*_cdf .RowStride );switch _gag {case 1:_bfg =_gfc (_bag ,_cdf ,_gag ,_acg ,_cff );case 2:_bfg =_cde (_bag ,_cdf ,_gag ,_acg ,_cff );case 3:_bfg =_gab (_bag ,_cdf ,_gag ,_acg ,_cff );
|
|
case 4:_bfg =_fcg (_bag ,_cdf ,_gag ,_acg ,_cff );};if _bfg !=nil {return nil ,_bfg ;};return _cdf ,nil ;};func _babf (_gecd *Bitmap ,_eedg ,_bfaa int ,_cgbbc ,_dcdc int ,_fafe RasterOperator ){var (_edff bool ;_afdc bool ;_cgda int ;_dcdb int ;_febc int ;
|
|
_ecde int ;_efcbe bool ;_gfge byte ;);_geaeg :=8-(_eedg &7);_agfge :=_feba [_geaeg ];_dcdcb :=_gecd .RowStride *_bfaa +(_eedg >>3);if _cgbbc < _geaeg {_edff =true ;_agfge &=_ddge [8-_geaeg +_cgbbc ];};if !_edff {_cgda =(_cgbbc -_geaeg )>>3;if _cgda !=0{_afdc =true ;
|
|
_dcdb =_dcdcb +1;};};_febc =(_eedg +_cgbbc )&7;if !(_edff ||_febc ==0){_efcbe =true ;_gfge =_ddge [_febc ];_ecde =_dcdcb +1+_cgda ;};var _eddfg ,_bgeb int ;switch _fafe {case PixClr :for _eddfg =0;_eddfg < _dcdc ;_eddfg ++{_gecd .Data [_dcdcb ]=_fgcdb (_gecd .Data [_dcdcb ],0x0,_agfge );
|
|
_dcdcb +=_gecd .RowStride ;};if _afdc {for _eddfg =0;_eddfg < _dcdc ;_eddfg ++{for _bgeb =0;_bgeb < _cgda ;_bgeb ++{_gecd .Data [_dcdb +_bgeb ]=0x0;};_dcdb +=_gecd .RowStride ;};};if _efcbe {for _eddfg =0;_eddfg < _dcdc ;_eddfg ++{_gecd .Data [_ecde ]=_fgcdb (_gecd .Data [_ecde ],0x0,_gfge );
|
|
_ecde +=_gecd .RowStride ;};};case PixSet :for _eddfg =0;_eddfg < _dcdc ;_eddfg ++{_gecd .Data [_dcdcb ]=_fgcdb (_gecd .Data [_dcdcb ],0xff,_agfge );_dcdcb +=_gecd .RowStride ;};if _afdc {for _eddfg =0;_eddfg < _dcdc ;_eddfg ++{for _bgeb =0;_bgeb < _cgda ;
|
|
_bgeb ++{_gecd .Data [_dcdb +_bgeb ]=0xff;};_dcdb +=_gecd .RowStride ;};};if _efcbe {for _eddfg =0;_eddfg < _dcdc ;_eddfg ++{_gecd .Data [_ecde ]=_fgcdb (_gecd .Data [_ecde ],0xff,_gfge );_ecde +=_gecd .RowStride ;};};case PixNotDst :for _eddfg =0;_eddfg < _dcdc ;
|
|
_eddfg ++{_gecd .Data [_dcdcb ]=_fgcdb (_gecd .Data [_dcdcb ],^_gecd .Data [_dcdcb ],_agfge );_dcdcb +=_gecd .RowStride ;};if _afdc {for _eddfg =0;_eddfg < _dcdc ;_eddfg ++{for _bgeb =0;_bgeb < _cgda ;_bgeb ++{_gecd .Data [_dcdb +_bgeb ]=^(_gecd .Data [_dcdb +_bgeb ]);
|
|
};_dcdb +=_gecd .RowStride ;};};if _efcbe {for _eddfg =0;_eddfg < _dcdc ;_eddfg ++{_gecd .Data [_ecde ]=_fgcdb (_gecd .Data [_ecde ],^_gecd .Data [_ecde ],_gfge );_ecde +=_gecd .RowStride ;};};};};func (_dbgba *Bitmaps )makeSizeIndicator (_dgfa ,_dagc int ,_ageb LocationFilter ,_adee SizeComparison )(_fbceg *_e .NumSlice ,_cacdc error ){const _bbgcb ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u006d\u0061\u006b\u0065S\u0069z\u0065I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _dbgba ==nil {return nil ,_b .Error (_bbgcb ,"\u0062\u0069\u0074ma\u0070\u0073\u0020\u0027\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch _ageb {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_b .Errorf (_bbgcb ,"\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",_ageb );
|
|
};switch _adee {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_b .Errorf (_bbgcb ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",_adee );
|
|
};_fbceg =&_e .NumSlice {};var (_agff ,_bceb ,_gfcc int ;_fece *Bitmap ;);for _ ,_fece =range _dbgba .Values {_agff =0;_bceb ,_gfcc =_fece .Width ,_fece .Height ;switch _ageb {case LocSelectWidth :if (_adee ==SizeSelectIfLT &&_bceb < _dgfa )||(_adee ==SizeSelectIfGT &&_bceb > _dgfa )||(_adee ==SizeSelectIfLTE &&_bceb <=_dgfa )||(_adee ==SizeSelectIfGTE &&_bceb >=_dgfa )||(_adee ==SizeSelectIfEQ &&_bceb ==_dgfa ){_agff =1;
|
|
};case LocSelectHeight :if (_adee ==SizeSelectIfLT &&_gfcc < _dagc )||(_adee ==SizeSelectIfGT &&_gfcc > _dagc )||(_adee ==SizeSelectIfLTE &&_gfcc <=_dagc )||(_adee ==SizeSelectIfGTE &&_gfcc >=_dagc )||(_adee ==SizeSelectIfEQ &&_gfcc ==_dagc ){_agff =1;
|
|
};case LocSelectIfEither :if (_adee ==SizeSelectIfLT &&(_bceb < _dgfa ||_gfcc < _dagc ))||(_adee ==SizeSelectIfGT &&(_bceb > _dgfa ||_gfcc > _dagc ))||(_adee ==SizeSelectIfLTE &&(_bceb <=_dgfa ||_gfcc <=_dagc ))||(_adee ==SizeSelectIfGTE &&(_bceb >=_dgfa ||_gfcc >=_dagc ))||(_adee ==SizeSelectIfEQ &&(_bceb ==_dgfa ||_gfcc ==_dagc )){_agff =1;
|
|
};case LocSelectIfBoth :if (_adee ==SizeSelectIfLT &&(_bceb < _dgfa &&_gfcc < _dagc ))||(_adee ==SizeSelectIfGT &&(_bceb > _dgfa &&_gfcc > _dagc ))||(_adee ==SizeSelectIfLTE &&(_bceb <=_dgfa &&_gfcc <=_dagc ))||(_adee ==SizeSelectIfGTE &&(_bceb >=_dgfa &&_gfcc >=_dagc ))||(_adee ==SizeSelectIfEQ &&(_bceb ==_dgfa &&_gfcc ==_dagc )){_agff =1;
|
|
};};_fbceg .AddInt (_agff );};return _fbceg ,nil ;};func _defc (_bfcb ,_dfd *Bitmap ,_cdaaa CombinationOperator )*Bitmap {_gbcbe :=New (_bfcb .Width ,_bfcb .Height );for _abf :=0;_abf < len (_gbcbe .Data );_abf ++{_gbcbe .Data [_abf ]=_cee (_bfcb .Data [_abf ],_dfd .Data [_abf ],_cdaaa );
|
|
};return _gbcbe ;};func (_efec *Bitmap )SizesEqual (s *Bitmap )bool {if _efec ==s {return true ;};if _efec .Width !=s .Width ||_efec .Height !=s .Height {return false ;};return true ;};func (_gfagc *ClassedPoints )YAtIndex (i int )float32 {return (*_gfagc .Points )[_gfagc .IntSlice [i ]].Y };
|
|
type Bitmaps struct{Values []*Bitmap ;Boxes []*_ce .Rectangle ;};func (_egg *Bitmap )createTemplate ()*Bitmap {return &Bitmap {Width :_egg .Width ,Height :_egg .Height ,RowStride :_egg .RowStride ,Color :_egg .Color ,Text :_egg .Text ,BitmapNumber :_egg .BitmapNumber ,Special :_egg .Special ,Data :make ([]byte ,len (_egg .Data ))};
|
|
};func (_gfdb *Bitmap )GetPixel (x ,y int )bool {_cge :=_gfdb .GetByteIndex (x ,y );_aff :=_gfdb .GetBitOffset (x );_baf :=uint (7-_aff );if _cge > len (_gfdb .Data )-1{_g .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 ,_gfdb );
|
|
return false ;};if (_gfdb .Data [_cge ]>>_baf )&0x01>=1{return true ;};return false ;};func TstAddSymbol (t *_d .T ,bms *Bitmaps ,sym *Bitmap ,x *int ,y int ,space int ){bms .AddBitmap (sym );_aebbb :=_ce .Rect (*x ,y ,*x +sym .Width ,y +sym .Height );
|
|
bms .AddBox (&_aebbb );*x +=sym .Width +space ;};func _dda (_gge ,_bce int )*Bitmap {return &Bitmap {Width :_gge ,Height :_bce ,RowStride :(_gge +7)>>3};};func _fadba (_gfgad ,_cfbd *Bitmap ,_eggc ,_fegf int )(*Bitmap ,error ){const _cga ="\u0063\u006c\u006f\u0073\u0065\u0042\u0072\u0069\u0063\u006b";
|
|
if _cfbd ==nil {return nil ,_b .Error (_cga ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _eggc < 1||_fegf < 1{return nil ,_b .Error (_cga ,"\u0068S\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0053\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");
|
|
};if _eggc ==1&&_fegf ==1{return _cfbd .Copy (),nil ;};if _eggc ==1||_fegf ==1{_fdfb :=SelCreateBrick (_fegf ,_eggc ,_fegf /2,_eggc /2,SelHit );var _ecbaf error ;_gfgad ,_ecbaf =_becf (_gfgad ,_cfbd ,_fdfb );if _ecbaf !=nil {return nil ,_b .Wrap (_ecbaf ,_cga ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _gfgad ,nil ;};_aeac :=SelCreateBrick (1,_eggc ,0,_eggc /2,SelHit );_gffc :=SelCreateBrick (_fegf ,1,_fegf /2,0,SelHit );_cae ,_ebcb :=_cgbb (nil ,_cfbd ,_aeac );if _ebcb !=nil {return nil ,_b .Wrap (_ebcb ,_cga ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};if _gfgad ,_ebcb =_cgbb (_gfgad ,_cae ,_gffc );_ebcb !=nil {return nil ,_b .Wrap (_ebcb ,_cga ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_ebcb =_edab (_cae ,_gfgad ,_aeac );_ebcb !=nil {return nil ,_b .Wrap (_ebcb ,_cga ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};if _ ,_ebcb =_edab (_gfgad ,_cae ,_gffc );_ebcb !=nil {return nil ,_b .Wrap (_ebcb ,_cga ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _gfgad ,nil ;};func (_agg *Bitmap )setEightBytes (_cafe int ,_fdcg uint64 )error {_bebd :=_agg .RowStride -(_cafe %_agg .RowStride );
|
|
if _agg .RowStride !=_agg .Width >>3{_bebd --;};if _bebd >=8{return _agg .setEightFullBytes (_cafe ,_fdcg );};return _agg .setEightPartlyBytes (_cafe ,_bebd ,_fdcg );};func _deba (_eceaa *Bitmap ,_dfgg *_e .Stack ,_ggddg ,_cgbf int )(_ffafc *_ce .Rectangle ,_acaad error ){const _edbg ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _eceaa ==nil {return nil ,_b .Error (_edbg ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _dfgg ==nil {return nil ,_b .Error (_edbg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_fgfbc ,_gede :=_eceaa .Width ,_eceaa .Height ;_dccc :=_fgfbc -1;_fcgd :=_gede -1;if _ggddg < 0||_ggddg > _dccc ||_cgbf < 0||_cgbf > _fcgd ||!_eceaa .GetPixel (_ggddg ,_cgbf ){return nil ,nil ;};_cgeag :=_ce .Rect (100000,100000,0,0);if _acaad =_eefea (_dfgg ,_ggddg ,_ggddg ,_cgbf ,1,_fcgd ,&_cgeag );
|
|
_acaad !=nil {return nil ,_b .Wrap (_acaad ,_edbg ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _acaad =_eefea (_dfgg ,_ggddg ,_ggddg ,_cgbf +1,-1,_fcgd ,&_cgeag );_acaad !=nil {return nil ,_b .Wrap (_acaad ,_edbg ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};_cgeag .Min .X ,_cgeag .Max .X =_ggddg ,_ggddg ;_cgeag .Min .Y ,_cgeag .Max .Y =_cgbf ,_cgbf ;var (_faed *fillSegment ;_abgf int ;);for _dfgg .Len ()> 0{if _faed ,_acaad =_fecf (_dfgg );_acaad !=nil {return nil ,_b .Wrap (_acaad ,_edbg ,"");};_cgbf =_faed ._ecggb ;
|
|
for _ggddg =_faed ._gbdag -1;_ggddg >=0&&_eceaa .GetPixel (_ggddg ,_cgbf );_ggddg --{if _acaad =_eceaa .SetPixel (_ggddg ,_cgbf ,0);_acaad !=nil {return nil ,_b .Wrap (_acaad ,_edbg ,"\u0031s\u0074\u0020\u0073\u0065\u0074");};};if _ggddg >=_faed ._gbdag -1{for {for _ggddg ++;
|
|
_ggddg <=_faed ._fddc +1&&_ggddg <=_dccc &&!_eceaa .GetPixel (_ggddg ,_cgbf );_ggddg ++{};_abgf =_ggddg ;if !(_ggddg <=_faed ._fddc +1&&_ggddg <=_dccc ){break ;};for ;_ggddg <=_dccc &&_eceaa .GetPixel (_ggddg ,_cgbf );_ggddg ++{if _acaad =_eceaa .SetPixel (_ggddg ,_cgbf ,0);
|
|
_acaad !=nil {return nil ,_b .Wrap (_acaad ,_edbg ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _acaad =_eefea (_dfgg ,_abgf ,_ggddg -1,_faed ._ecggb ,_faed ._ccbb ,_fcgd ,&_cgeag );_acaad !=nil {return nil ,_b .Wrap (_acaad ,_edbg ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};if _ggddg > _faed ._fddc {if _acaad =_eefea (_dfgg ,_faed ._fddc +1,_ggddg -1,_faed ._ecggb ,-_faed ._ccbb ,_fcgd ,&_cgeag );_acaad !=nil {return nil ,_b .Wrap (_acaad ,_edbg ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};};continue ;};_abgf =_ggddg +1;if _abgf < _faed ._gbdag {if _acaad =_eefea (_dfgg ,_abgf ,_faed ._gbdag -1,_faed ._ecggb ,-_faed ._ccbb ,_fcgd ,&_cgeag );_acaad !=nil {return nil ,_b .Wrap (_acaad ,_edbg ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_ggddg =_faed ._gbdag ;for {for ;_ggddg <=_dccc &&_eceaa .GetPixel (_ggddg ,_cgbf );_ggddg ++{if _acaad =_eceaa .SetPixel (_ggddg ,_cgbf ,0);_acaad !=nil {return nil ,_b .Wrap (_acaad ,_edbg ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _acaad =_eefea (_dfgg ,_abgf ,_ggddg -1,_faed ._ecggb ,_faed ._ccbb ,_fcgd ,&_cgeag );
|
|
_acaad !=nil {return nil ,_b .Wrap (_acaad ,_edbg ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _ggddg > _faed ._fddc {if _acaad =_eefea (_dfgg ,_faed ._fddc +1,_ggddg -1,_faed ._ecggb ,-_faed ._ccbb ,_fcgd ,&_cgeag );_acaad !=nil {return nil ,_b .Wrap (_acaad ,_edbg ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _ggddg ++;_ggddg <=_faed ._fddc +1&&_ggddg <=_dccc &&!_eceaa .GetPixel (_ggddg ,_cgbf );_ggddg ++{};_abgf =_ggddg ;if !(_ggddg <=_faed ._fddc +1&&_ggddg <=_dccc ){break ;};};};_cgeag .Max .X ++;_cgeag .Max .Y ++;return &_cgeag ,nil ;};type Point struct{X ,Y float32 ;
|
|
};func (_agcc *ClassedPoints )ySortFunction ()func (_bfeb int ,_cbeaa int )bool {return func (_dfdf ,_accc int )bool {return _agcc .YAtIndex (_dfdf )< _agcc .YAtIndex (_accc )};};type MorphOperation int ;func (_aacf *Bitmap )nextOnPixel (_bacc ,_gbcg int )(_bfe _ce .Point ,_fde bool ,_agda error ){const _cbg ="n\u0065\u0078\u0074\u004f\u006e\u0050\u0069\u0078\u0065\u006c";
|
|
_bfe ,_fde ,_agda =_aacf .nextOnPixelLow (_aacf .Width ,_aacf .Height ,_aacf .RowStride ,_bacc ,_gbcg );if _agda !=nil {return _bfe ,false ,_b .Wrap (_agda ,_cbg ,"");};return _bfe ,_fde ,nil ;};func (_becc *Selection )setOrigin (_ceb ,_cgag int ){_becc .Cy ,_becc .Cx =_ceb ,_cgag };
|
|
func TstCSymbol (t *_d .T )*Bitmap {t .Helper ();_ecfcc :=New (6,6);_fg .NoError (t ,_ecfcc .SetPixel (1,0,1));_fg .NoError (t ,_ecfcc .SetPixel (2,0,1));_fg .NoError (t ,_ecfcc .SetPixel (3,0,1));_fg .NoError (t ,_ecfcc .SetPixel (4,0,1));_fg .NoError (t ,_ecfcc .SetPixel (0,1,1));
|
|
_fg .NoError (t ,_ecfcc .SetPixel (5,1,1));_fg .NoError (t ,_ecfcc .SetPixel (0,2,1));_fg .NoError (t ,_ecfcc .SetPixel (0,3,1));_fg .NoError (t ,_ecfcc .SetPixel (0,4,1));_fg .NoError (t ,_ecfcc .SetPixel (5,4,1));_fg .NoError (t ,_ecfcc .SetPixel (1,5,1));
|
|
_fg .NoError (t ,_ecfcc .SetPixel (2,5,1));_fg .NoError (t ,_ecfcc .SetPixel (3,5,1));_fg .NoError (t ,_ecfcc .SetPixel (4,5,1));return _ecfcc ;};func HausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH int )(bool ,error ){const _beef ="\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";
|
|
_feg ,_bgge :=p1 .Width ,p1 .Height ;_eabg ,_afb :=p3 .Width ,p3 .Height ;if _e .Abs (_feg -_eabg )> maxDiffW {return false ,nil ;};if _e .Abs (_bgge -_afb )> maxDiffH {return false ,nil ;};_bfdg :=int (delX +_e .Sign (delX )*0.5);_fged :=int (delY +_e .Sign (delY )*0.5);
|
|
var _fec error ;_fadd :=p1 .CreateTemplate ();if _fec =_fadd .RasterOperation (0,0,_feg ,_bgge ,PixSrc ,p1 ,0,0);_fec !=nil {return false ,_b .Wrap (_fec ,_beef ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _fec =_fadd .RasterOperation (_bfdg ,_fged ,_feg ,_bgge ,PixNotSrcAndDst ,p4 ,0,0);
|
|
_fec !=nil {return false ,_b .Wrap (_fec ,_beef ,"\u0021p\u0034\u0020\u0026\u0020\u0074");};if _fadd .Zero (){return false ,nil ;};if _fec =_fadd .RasterOperation (_bfdg ,_fged ,_eabg ,_afb ,PixSrc ,p3 ,0,0);_fec !=nil {return false ,_b .Wrap (_fec ,_beef ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");
|
|
};if _fec =_fadd .RasterOperation (0,0,_eabg ,_afb ,PixNotSrcAndDst ,p2 ,0,0);_fec !=nil {return false ,_b .Wrap (_fec ,_beef ,"\u0021p\u0032\u0020\u0026\u0020\u0074");};return _fadd .Zero (),nil ;};type Points []Point ;func (_ggff MorphProcess )getWidthHeight ()(_fced ,_beefd int ){return _ggff .Arguments [0],_ggff .Arguments [1];
|
|
};func TstImageBitmapInverseData ()[]byte {_beebb :=_aebbc .Copy ();_beebb .InverseData ();return _beebb .Data ;};const (CmbOpOr CombinationOperator =iota ;CmbOpAnd ;CmbOpXor ;CmbOpXNor ;CmbOpReplace ;CmbOpNot ;);func (_eadg *byWidth )Len ()int {return len (_eadg .Values )};
|
|
func TstFrameBitmap ()*Bitmap {return _acca .Copy ()};func MakePixelSumTab8 ()[]int {return _bbgf ()};func (_gbcb *Bitmap )Copy ()*Bitmap {_gaf :=make ([]byte ,len (_gbcb .Data ));copy (_gaf ,_gbcb .Data );return &Bitmap {Width :_gbcb .Width ,Height :_gbcb .Height ,RowStride :_gbcb .RowStride ,Data :_gaf ,Color :_gbcb .Color ,Text :_gbcb .Text ,BitmapNumber :_gbcb .BitmapNumber ,Special :_gbcb .Special };
|
|
};var _fcbf [256]uint8 ;func (_fdce *Bitmaps )GroupByWidth ()(*BitmapsArray ,error ){const _efccd ="\u0047\u0072\u006fu\u0070\u0042\u0079\u0057\u0069\u0064\u0074\u0068";if len (_fdce .Values )==0{return nil ,_b .Error (_efccd ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
};_ddac :=&BitmapsArray {};_fdce .SortByWidth ();_daab :=-1;_dga :=-1;for _gafg :=0;_gafg < len (_fdce .Values );_gafg ++{_eafd :=_fdce .Values [_gafg ].Width ;if _eafd > _daab {_daab =_eafd ;_dga ++;_ddac .Values =append (_ddac .Values ,&Bitmaps {});};
|
|
_ddac .Values [_dga ].AddBitmap (_fdce .Values [_gafg ]);};return _ddac ,nil ;};func _dcagf (_fgfd ,_gedg int )int {if _fgfd < _gedg {return _fgfd ;};return _gedg ;};func (_bfeba *Bitmaps )SelectByIndexes (idx []int )(*Bitmaps ,error ){const _cceff ="B\u0069\u0074\u006d\u0061\u0070\u0073.\u0053\u006f\u0072\u0074\u0049\u006e\u0064\u0065\u0078e\u0073\u0042\u0079H\u0065i\u0067\u0068\u0074";
|
|
_bdggb ,_ggdaf :=_bfeba .selectByIndexes (idx );if _ggdaf !=nil {return nil ,_b .Wrap (_ggdaf ,_cceff ,"");};return _bdggb ,nil ;};func _cdecg (_abecd int )int {if _abecd < 0{return -_abecd ;};return _abecd ;};func _gbgf (_cbba *Bitmap ,_dfdb ,_fffbe int ,_dgefe ,_dgcb int ,_aced RasterOperator ){var (_gdbd int ;
|
|
_daaa byte ;_ecfa ,_eacba int ;_aeeg int ;);_fffa :=_dgefe >>3;_cddg :=_dgefe &7;if _cddg > 0{_daaa =_ddge [_cddg ];};_gdbd =_cbba .RowStride *_fffbe +(_dfdb >>3);switch _aced {case PixClr :for _ecfa =0;_ecfa < _dgcb ;_ecfa ++{_aeeg =_gdbd +_ecfa *_cbba .RowStride ;
|
|
for _eacba =0;_eacba < _fffa ;_eacba ++{_cbba .Data [_aeeg ]=0x0;_aeeg ++;};if _cddg > 0{_cbba .Data [_aeeg ]=_fgcdb (_cbba .Data [_aeeg ],0x0,_daaa );};};case PixSet :for _ecfa =0;_ecfa < _dgcb ;_ecfa ++{_aeeg =_gdbd +_ecfa *_cbba .RowStride ;for _eacba =0;
|
|
_eacba < _fffa ;_eacba ++{_cbba .Data [_aeeg ]=0xff;_aeeg ++;};if _cddg > 0{_cbba .Data [_aeeg ]=_fgcdb (_cbba .Data [_aeeg ],0xff,_daaa );};};case PixNotDst :for _ecfa =0;_ecfa < _dgcb ;_ecfa ++{_aeeg =_gdbd +_ecfa *_cbba .RowStride ;for _eacba =0;_eacba < _fffa ;
|
|
_eacba ++{_cbba .Data [_aeeg ]=^_cbba .Data [_aeeg ];_aeeg ++;};if _cddg > 0{_cbba .Data [_aeeg ]=_fgcdb (_cbba .Data [_aeeg ],^_cbba .Data [_aeeg ],_daaa );};};};};func _ggfe (_fgbbb ,_dcada *Bitmap ,_dbgb ,_eeca int )(_fffe error ){const _beec ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0038";
|
|
var (_bdcd ,_cfbae ,_fgbd ,_bfga int ;_ggfa ,_cgbec ,_fceaa ,_baga ,_ggddb ,_efad ,_bcec ,_cdbda byte ;);for _bdcd =0;_bdcd < _dbgb ;_bdcd ++{_fgbd =_bdcd *_fgbbb .RowStride ;_bfga =_bdcd *_dcada .RowStride ;for _cfbae =0;_cfbae < _eeca ;_cfbae ++{if _ggfa ,_fffe =_fgbbb .GetByte (_fgbd +_cfbae );
|
|
_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\u0067e\u0074 \u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};if _cgbec ,_fffe =_dcada .GetByte (_bfga +_cfbae );_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\u0067\u0065\u0074\u0020\u006d\u0061\u0073\u006b\u0020\u0062\u0079\u0074\u0065");
|
|
};if _bdcd > 0{if _fceaa ,_fffe =_fgbbb .GetByte (_fgbd -_fgbbb .RowStride +_cfbae );_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\u0069\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_ggfa |=_fceaa |(_fceaa <<1)|(_fceaa >>1);if _cfbae > 0{if _cdbda ,_fffe =_fgbbb .GetByte (_fgbd -_fgbbb .RowStride +_cfbae -1);
|
|
_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\u0069\u0020\u003e\u00200 \u0026\u0026\u0020\u006a\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_ggfa |=_cdbda <<7;};if _cfbae < _eeca -1{if _cdbda ,_fffe =_fgbbb .GetByte (_fgbd -_fgbbb .RowStride +_cfbae +1);
|
|
_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\u006a\u0020<\u0020\u0077\u0070l\u0020\u002d\u0020\u0031\u0020\u0062\u0079\u0074\u0065");};_ggfa |=_cdbda >>7;};};if _cfbae > 0{if _baga ,_fffe =_fgbbb .GetByte (_fgbd +_cfbae -1);_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\u006a\u0020\u003e \u0030");
|
|
};_ggfa |=_baga <<7;};_ggfa &=_cgbec ;if _ggfa ==0||^_ggfa ==0{if _fffe =_fgbbb .SetByte (_fgbd +_cfbae ,_ggfa );_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\u0073e\u0074t\u0069\u006e\u0067\u0020\u0065m\u0070\u0074y\u0020\u0062\u0079\u0074\u0065");};};
|
|
for {_bcec =_ggfa ;_ggfa =(_ggfa |(_ggfa >>1)|(_ggfa <<1))&_cgbec ;if (_ggfa ^_bcec )==0{if _fffe =_fgbbb .SetByte (_fgbd +_cfbae ,_ggfa );_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");
|
|
};break ;};};};};for _bdcd =_dbgb -1;_bdcd >=0;_bdcd --{_fgbd =_bdcd *_fgbbb .RowStride ;_bfga =_bdcd *_dcada .RowStride ;for _cfbae =_eeca -1;_cfbae >=0;_cfbae --{if _ggfa ,_fffe =_fgbbb .GetByte (_fgbd +_cfbae );_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\u0072\u0065\u0076er\u0073\u0065\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _cgbec ,_fffe =_dcada .GetByte (_bfga +_cfbae );_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _bdcd < _dbgb -1{if _ggddb ,_fffe =_fgbbb .GetByte (_fgbd +_fgbbb .RowStride +_cfbae );
|
|
_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\u0069\u0020\u003c\u0020h\u0020\u002d\u0020\u0031\u0020\u002d\u003e\u0020\u0067\u0065t\u0020s\u006f\u0075\u0072\u0063\u0065\u0020\u0062y\u0074\u0065");};_ggfa |=_ggddb |(_ggddb <<1)|_ggddb >>1;if _cfbae > 0{if _cdbda ,_fffe =_fgbbb .GetByte (_fgbd +_fgbbb .RowStride +_cfbae -1);
|
|
_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\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");};_ggfa |=_cdbda <<7;};if _cfbae < _eeca -1{if _cdbda ,_fffe =_fgbbb .GetByte (_fgbd +_fgbbb .RowStride +_cfbae +1);
|
|
_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\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");
|
|
};_ggfa |=_cdbda >>7;};};if _cfbae < _eeca -1{if _efad ,_fffe =_fgbbb .GetByte (_fgbd +_cfbae +1);_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\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");
|
|
};_ggfa |=_efad >>7;};_ggfa &=_cgbec ;if _ggfa ==0||(^_ggfa )==0{if _fffe =_fgbbb .SetByte (_fgbd +_cfbae ,_ggfa );_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"\u0073e\u0074 \u006d\u0061\u0073\u006b\u0065\u0064\u0020\u0062\u0079\u0074\u0065");};};for {_bcec =_ggfa ;
|
|
_ggfa =(_ggfa |(_ggfa >>1)|(_ggfa <<1))&_cgbec ;if (_ggfa ^_bcec )==0{if _fffe =_fgbbb .SetByte (_fgbd +_cfbae ,_ggfa );_fffe !=nil {return _b .Wrap (_fffe ,_beec ,"r\u0065\u0076\u0065\u0072se\u0020s\u0065\u0074\u0020\u0070\u0072e\u0076\u0020\u0062\u0079\u0074\u0065");
|
|
};break ;};};};};return nil ;};func (_fggdg *byWidth )Swap (i ,j int ){_fggdg .Values [i ],_fggdg .Values [j ]=_fggdg .Values [j ],_fggdg .Values [i ];if _fggdg .Boxes !=nil {_fggdg .Boxes [i ],_fggdg .Boxes [j ]=_fggdg .Boxes [j ],_fggdg .Boxes [i ];};
|
|
};func (_adfa *BitmapsArray )AddBox (box *_ce .Rectangle ){_adfa .Boxes =append (_adfa .Boxes ,box )};func (_eefd *BitmapsArray )AddBitmaps (bm *Bitmaps ){_eefd .Values =append (_eefd .Values ,bm )};func (_gbec MorphProcess )verify (_bcgc int ,_ffbb ,_cdae *int )error {const _dafb ="\u004d\u006f\u0072\u0070hP\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u0076\u0065\u0072\u0069\u0066\u0079";
|
|
switch _gbec .Operation {case MopDilation ,MopErosion ,MopOpening ,MopClosing :if len (_gbec .Arguments )!=2{return _b .Error (_dafb ,"\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");
|
|
};_eaeg ,_afge :=_gbec .getWidthHeight ();if _eaeg <=0||_afge <=0{return _b .Error (_dafb ,"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 :_dff :=len (_gbec .Arguments );*_ffbb +=_dff ;if _dff < 1||_dff > 4{return _b .Error (_dafb ,"\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 _geae :=0;_geae < _dff ;_geae ++{if _gbec .Arguments [_geae ]< 1||_gbec .Arguments [_geae ]> 4{return _b .Error (_dafb ,"\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 (_gbec .Arguments )==0{return _b .Error (_dafb ,"\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");
|
|
};_bfdc :=_gbec .Arguments [0];if _bfdc !=2&&_bfdc !=4&&_bfdc !=8{return _b .Error (_dafb ,"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");
|
|
};*_ffbb -=_aacgb [_bfdc /4];case MopAddBorder :if len (_gbec .Arguments )==0{return _b .Error (_dafb ,"\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");
|
|
};_bgd :=_gbec .Arguments [0];if _bcgc > 0{return _b .Error (_dafb ,"\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 _bgd < 1{return _b .Error (_dafb ,"\u0041\u0064\u0064\u0042o\u0072\u0064\u0065\u0072\u0020\u0076\u0061\u006c\u0075\u0065 \u006co\u0077\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};*_cdae =_bgd ;};return nil ;};type RasterOperator int ;func _bbgf ()[]int {_abfc :=make ([]int ,256);
|
|
for _ggbf :=0;_ggbf <=0xff;_ggbf ++{_cfcba :=byte (_ggbf );_abfc [_cfcba ]=int (_cfcba &0x1)+(int (_cfcba >>1)&0x1)+(int (_cfcba >>2)&0x1)+(int (_cfcba >>3)&0x1)+(int (_cfcba >>4)&0x1)+(int (_cfcba >>5)&0x1)+(int (_cfcba >>6)&0x1)+(int (_cfcba >>7)&0x1);
|
|
};return _abfc ;};type Color int ;func (_ceddd *Bitmap )setAll ()error {_gdab :=_edbfa (_ceddd ,0,0,_ceddd .Width ,_ceddd .Height ,PixSet ,nil ,0,0);if _gdab !=nil {return _b .Wrap (_gdab ,"\u0073\u0065\u0074\u0041\u006c\u006c","");};return nil ;};func _cee (_dcad ,_aade byte ,_afce CombinationOperator )byte {switch _afce {case CmbOpOr :return _aade |_dcad ;
|
|
case CmbOpAnd :return _aade &_dcad ;case CmbOpXor :return _aade ^_dcad ;case CmbOpXNor :return ^(_aade ^_dcad );case CmbOpNot :return ^(_aade );default:return _aade ;};};func (_adbd *Bitmap )setFourBytes (_ecad int ,_eee uint32 )error {if _ecad +3> len (_adbd .Data )-1{return _b .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",_ecad );
|
|
};_adbd .Data [_ecad ]=byte ((_eee &0xff000000)>>24);_adbd .Data [_ecad +1]=byte ((_eee &0xff0000)>>16);_adbd .Data [_ecad +2]=byte ((_eee &0xff00)>>8);_adbd .Data [_ecad +3]=byte (_eee &0xff);return nil ;};func (_gffd *Bitmap )connComponentsBB (_acbd int )(_cea *Boxes ,_fcge error ){const _bee ="\u0042\u0069\u0074ma\u0070\u002e\u0063\u006f\u006e\u006e\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0042";
|
|
if _acbd !=4&&_acbd !=8{return nil ,_b .Error (_bee ,"\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 _gffd .Zero (){return &Boxes {},nil ;
|
|
};_gffd .setPadBits (0);_bddb ,_fcge :=_daef (nil ,_gffd );if _fcge !=nil {return nil ,_b .Wrap (_fcge ,_bee ,"\u0062\u006d\u0031");};_gceg :=&_e .Stack {};_gceg .Aux =&_e .Stack {};_cea =&Boxes {};var (_aabf ,_defd int ;_aacd _ce .Point ;_gabb bool ;_dggdc *_ce .Rectangle ;
|
|
);for {if _aacd ,_gabb ,_fcge =_bddb .nextOnPixel (_defd ,_aabf );_fcge !=nil {return nil ,_b .Wrap (_fcge ,_bee ,"");};if !_gabb {break ;};if _dggdc ,_fcge =_cegaa (_bddb ,_gceg ,_aacd .X ,_aacd .Y ,_acbd );_fcge !=nil {return nil ,_b .Wrap (_fcge ,_bee ,"");
|
|
};if _fcge =_cea .Add (_dggdc );_fcge !=nil {return nil ,_b .Wrap (_fcge ,_bee ,"");};_defd =_aacd .X ;_aabf =_aacd .Y ;};return _cea ,nil ;};func (_fdfba *Bitmaps )AddBitmap (bm *Bitmap ){_fdfba .Values =append (_fdfba .Values ,bm )};var _aacgb =[5]int {1,2,3,0,4};
|
|
func MakePixelCentroidTab8 ()[]int {return _fbde ()};func _gab (_dfe ,_bca *Bitmap ,_aebb int ,_gbd []byte ,_agd int )(_ecac error ){const _ccbe ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0033";
|
|
var (_cfc ,_bef ,_baed ,_fea ,_gbe ,_ddb ,_cda ,_bgb int ;_dbcg ,_bbac ,_acbb ,_afg uint32 ;_feag ,_ded byte ;_cdbg uint16 ;);_cedd :=make ([]byte ,4);_dgca :=make ([]byte ,4);for _baed =0;_baed < _dfe .Height -1;_baed ,_fea =_baed +2,_fea +1{_cfc =_baed *_dfe .RowStride ;
|
|
_bef =_fea *_bca .RowStride ;for _gbe ,_ddb =0,0;_gbe < _agd ;_gbe ,_ddb =_gbe +4,_ddb +1{for _cda =0;_cda < 4;_cda ++{_bgb =_cfc +_gbe +_cda ;if _bgb <=len (_dfe .Data )-1&&_bgb < _cfc +_dfe .RowStride {_cedd [_cda ]=_dfe .Data [_bgb ];}else {_cedd [_cda ]=0x00;
|
|
};_bgb =_cfc +_dfe .RowStride +_gbe +_cda ;if _bgb <=len (_dfe .Data )-1&&_bgb < _cfc +(2*_dfe .RowStride ){_dgca [_cda ]=_dfe .Data [_bgb ];}else {_dgca [_cda ]=0x00;};};_dbcg =_ba .BigEndian .Uint32 (_cedd );_bbac =_ba .BigEndian .Uint32 (_dgca );_acbb =_dbcg &_bbac ;
|
|
_acbb |=_acbb <<1;_afg =_dbcg |_bbac ;_afg &=_afg <<1;_bbac =_acbb &_afg ;_bbac &=0xaaaaaaaa;_dbcg =_bbac |(_bbac <<7);_feag =byte (_dbcg >>24);_ded =byte ((_dbcg >>8)&0xff);_bgb =_bef +_ddb ;if _bgb +1==len (_bca .Data )-1||_bgb +1>=_bef +_bca .RowStride {if _ecac =_bca .SetByte (_bgb ,_gbd [_feag ]);
|
|
_ecac !=nil {return _b .Wrapf (_ecac ,_ccbe ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_bgb );};}else {_cdbg =(uint16 (_gbd [_feag ])<<8)|uint16 (_gbd [_ded ]);if _ecac =_bca .setTwoBytes (_bgb ,_cdbg );_ecac !=nil {return _b .Wrapf (_ecac ,_ccbe ,"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",_bgb );
|
|
};_ddb ++;};};};return nil ;};func (_cbag *Bitmap )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _edbfa (_cbag ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func (_bfgg *Bitmap )RemoveBorder (borderSize int )(*Bitmap ,error ){if borderSize ==0{return _bfgg .Copy (),nil ;
|
|
};_cgfb ,_bcee :=_bfgg .removeBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize );if _bcee !=nil {return nil ,_b .Wrap (_bcee ,"\u0052\u0065\u006do\u0076\u0065\u0042\u006f\u0072\u0064\u0065\u0072","");};return _cgfb ,nil ;};func SelCreateBrick (h ,w int ,cy ,cx int ,tp SelectionValue )*Selection {_edfg :=_befgb (h ,w ,"");
|
|
_edfg .setOrigin (cy ,cx );var _dfab ,_gdabe int ;for _dfab =0;_dfab < h ;_dfab ++{for _gdabe =0;_gdabe < w ;_gdabe ++{_edfg .Data [_dfab ][_gdabe ]=tp ;};};return _edfg ;};func _fgcdb (_bbfa ,_dcgfe ,_cafbd byte )byte {return (_bbfa &^(_cafbd ))|(_dcgfe &_cafbd )};
|
|
func (_cgc *Bitmap )GetUnpaddedData ()([]byte ,error ){_ffbd :=uint (_cgc .Width &0x07);if _ffbd ==0{return _cgc .Data ,nil ;};_bfa :=_cgc .Width *_cgc .Height ;if _bfa %8!=0{_bfa >>=3;_bfa ++;}else {_bfa >>=3;};_daf :=make ([]byte ,_bfa );_cgdb :=_ee .NewWriterMSB (_daf );
|
|
const _eda ="\u0047e\u0074U\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";for _bed :=0;_bed < _cgc .Height ;_bed ++{for _ddd :=0;_ddd < _cgc .RowStride ;_ddd ++{_aeba :=_cgc .Data [_bed *_cgc .RowStride +_ddd ];if _ddd !=_cgc .RowStride -1{_fad :=_cgdb .WriteByte (_aeba );
|
|
if _fad !=nil {return nil ,_b .Wrap (_fad ,_eda ,"");};continue ;};for _efc :=uint (0);_efc < _ffbd ;_efc ++{_ceg :=_cgdb .WriteBit (int (_aeba >>(7-_efc )&0x01));if _ceg !=nil {return nil ,_b .Wrap (_ceg ,_eda ,"");};};};};return _daf ,nil ;};func _ffe (_dadf ,_ccdf ,_dbaf *Bitmap )(*Bitmap ,error ){const _abec ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0078\u006f\u0072";
|
|
if _ccdf ==nil {return nil ,_b .Error (_abec ,"'\u0062\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _dbaf ==nil {return nil ,_b .Error (_abec ,"'\u0062\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _dadf ==_dbaf {return nil ,_b .Error (_abec ,"'\u0064\u0027\u0020\u003d\u003d\u0020\u0027\u0062\u0032\u0027");
|
|
};if !_ccdf .SizesEqual (_dbaf ){_g .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",_abec );
|
|
};var _gfdc error ;if _dadf ,_gfdc =_daef (_dadf ,_ccdf );_gfdc !=nil {return nil ,_b .Wrap (_gfdc ,_abec ,"\u0063\u0061n\u0027\u0074\u0020c\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027");};if _gfdc =_dadf .RasterOperation (0,0,_dadf .Width ,_dadf .Height ,PixSrcXorDst ,_dbaf ,0,0);
|
|
_gfdc !=nil {return nil ,_b .Wrap (_gfdc ,_abec ,"");};return _dadf ,nil ;};func (_afeg *Bitmap )SetPadBits (value int ){_afeg .setPadBits (value )};func TstESymbol (t *_d .T ,scale ...int )*Bitmap {_egbb ,_cgdgb :=NewWithData (4,5,[]byte {0xF0,0x80,0xE0,0x80,0xF0});
|
|
_fg .NoError (t ,_cgdgb );return TstGetScaledSymbol (t ,_egbb ,scale ...);};func (_gbdb *Bitmap )CountPixels ()int {return _gbdb .countPixels ()};func _dddb (_cbe ,_effa *Bitmap ,_gbf ,_affg ,_ccbg ,_eddf ,_adag int ,_gce CombinationOperator )error {var _gbdd int ;
|
|
_aad :=func (){_gbdd ++;_ccbg +=_effa .RowStride ;_eddf +=_cbe .RowStride ;_adag +=_cbe .RowStride };for _gbdd =_gbf ;_gbdd < _affg ;_aad (){_gedgb :=_ccbg ;for _aceb :=_eddf ;_aceb <=_adag ;_aceb ++{_cdad ,_aeae :=_effa .GetByte (_gedgb );if _aeae !=nil {return _aeae ;
|
|
};_bbae ,_aeae :=_cbe .GetByte (_aceb );if _aeae !=nil {return _aeae ;};if _aeae =_effa .SetByte (_gedgb ,_cee (_cdad ,_bbae ,_gce ));_aeae !=nil {return _aeae ;};_gedgb ++;};};return nil ;};func (_cbbf *Bitmaps )HeightSorter ()func (_gbgb ,_cfgf int )bool {return func (_ggfd ,_dcdge int )bool {_fedfc :=_cbbf .Values [_ggfd ].Height < _cbbf .Values [_dcdge ].Height ;
|
|
_g .Log .Debug ("H\u0065i\u0067\u0068\u0074\u003a\u0020\u0025\u0076\u0020<\u0020\u0025\u0076\u0020= \u0025\u0076",_cbbf .Values [_ggfd ].Height ,_cbbf .Values [_dcdge ].Height ,_fedfc );return _fedfc ;};};func (_eafdf *Bitmaps )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_bfcc *Bitmaps ,_deca error ){const _eddd ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0053\u0065\u006ce\u0063\u0074\u0042\u0079Si\u007a\u0065";
|
|
if _eafdf ==nil {return nil ,_b .Error (_eddd ,"\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 ,_b .Errorf (_eddd ,"\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 ,_b .Errorf (_eddd ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",relation );
|
|
};_gbfbg ,_deca :=_eafdf .makeSizeIndicator (width ,height ,tp ,relation );if _deca !=nil {return nil ,_b .Wrap (_deca ,_eddd ,"");};_bfcc ,_deca =_eafdf .selectByIndicator (_gbfbg );if _deca !=nil {return nil ,_b .Wrap (_deca ,_eddd ,"");};return _bfcc ,nil ;
|
|
};func TstOSymbol (t *_d .T ,scale ...int )*Bitmap {_egd ,_bcbf :=NewWithData (4,5,[]byte {0xF0,0x90,0x90,0x90,0xF0});_fg .NoError (t ,_bcbf );return TstGetScaledSymbol (t ,_egd ,scale ...);};func TstGetScaledSymbol (t *_d .T ,sm *Bitmap ,scale ...int )*Bitmap {if len (scale )==0{return sm ;
|
|
};if scale [0]==1{return sm ;};_efeg ,_fdcfg :=MorphSequence (sm ,MorphProcess {Operation :MopReplicativeBinaryExpansion ,Arguments :scale });_fg .NoError (t ,_fdcfg );return _efeg ;};func _dadfb (_ebca *Bitmap ,_dcef *Bitmap ,_bbaec int )(_dcbdf error ){const _bgbe ="\u0073\u0065\u0065\u0064\u0066\u0069\u006c\u006c\u0042\u0069\u006e\u0061r\u0079\u004c\u006f\u0077";
|
|
_eceag :=_dcagf (_ebca .Height ,_dcef .Height );_cgbg :=_dcagf (_ebca .RowStride ,_dcef .RowStride );switch _bbaec {case 4:_dcbdf =_efdb (_ebca ,_dcef ,_eceag ,_cgbg );case 8:_dcbdf =_ggfe (_ebca ,_dcef ,_eceag ,_cgbg );default:return _b .Errorf (_bgbe ,"\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",_bbaec );
|
|
};if _dcbdf !=nil {return _b .Wrap (_dcbdf ,_bgbe ,"");};return nil ;};const (ComponentConn Component =iota ;ComponentCharacters ;ComponentWords ;);func (_dba *Bitmap )RemoveBorderGeneral (left ,right ,top ,bot int )(*Bitmap ,error ){return _dba .removeBorderGeneral (left ,right ,top ,bot );
|
|
};type shift int ;func (_bacf *Bitmap )Zero ()bool {_gcdb :=_bacf .Width /8;_cgdbe :=_bacf .Width &7;var _eac byte ;if _cgdbe !=0{_eac =byte (0xff<<uint (8-_cgdbe ));};var _fbfee ,_afae ,_ecf int ;for _afae =0;_afae < _bacf .Height ;_afae ++{_fbfee =_bacf .RowStride *_afae ;
|
|
for _ecf =0;_ecf < _gcdb ;_ecf ,_fbfee =_ecf +1,_fbfee +1{if _bacf .Data [_fbfee ]!=0{return false ;};};if _cgdbe > 0{if _bacf .Data [_fbfee ]&_eac !=0{return false ;};};};return true ;};func _edbf (_aaceg ,_agbe *Bitmap ,_cgcda ,_baaa int )(*Bitmap ,error ){const _cada ="\u0063\u006c\u006f\u0073\u0065\u0053\u0061\u0066\u0065B\u0072\u0069\u0063\u006b";
|
|
if _agbe ==nil {return nil ,_b .Error (_cada ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _cgcda < 1||_baaa < 1{return nil ,_b .Error (_cada ,"\u0068s\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");
|
|
};if _cgcda ==1&&_baaa ==1{return _daef (_aaceg ,_agbe );};if MorphBC ==SymmetricMorphBC {_fdgc ,_egeg :=_fadba (_aaceg ,_agbe ,_cgcda ,_baaa );if _egeg !=nil {return nil ,_b .Wrap (_egeg ,_cada ,"\u0053\u0079m\u006d\u0065\u0074r\u0069\u0063\u004d\u006f\u0072\u0070\u0068\u0042\u0043");
|
|
};return _fdgc ,nil ;};_cfbe :=_fbfae (_cgcda /2,_baaa /2);_bbef :=8*((_cfbe +7)/8);_dcaa ,_bdbg :=_agbe .AddBorder (_bbef ,0);if _bdbg !=nil {return nil ,_b .Wrapf (_bdbg ,_cada ,"\u0042\u006f\u0072\u0064\u0065\u0072\u0053\u0069\u007ae\u003a\u0020\u0025\u0064",_bbef );
|
|
};var _begc ,_cfbfa *Bitmap ;if _cgcda ==1||_baaa ==1{_bfde :=SelCreateBrick (_baaa ,_cgcda ,_baaa /2,_cgcda /2,SelHit );_begc ,_bdbg =_becf (nil ,_dcaa ,_bfde );if _bdbg !=nil {return nil ,_b .Wrap (_bdbg ,_cada ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};}else {_fagbd :=SelCreateBrick (1,_cgcda ,0,_cgcda /2,SelHit );_bcag ,_ggffe :=_cgbb (nil ,_dcaa ,_fagbd );if _ggffe !=nil {return nil ,_b .Wrap (_ggffe ,_cada ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0064\u0069\u006c\u0061t\u0065");
|
|
};_acfa :=SelCreateBrick (_baaa ,1,_baaa /2,0,SelHit );_begc ,_ggffe =_cgbb (nil ,_bcag ,_acfa );if _ggffe !=nil {return nil ,_b .Wrap (_ggffe ,_cada ,"\u0072\u0065\u0067ul\u0061\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};if _ ,_ggffe =_edab (_bcag ,_begc ,_fagbd );_ggffe !=nil {return nil ,_b .Wrap (_ggffe ,_cada ,"r\u0065\u0067\u0075\u006car\u0020-\u0020\u0066\u0069\u0072\u0073t\u0020\u0065\u0072\u006f\u0064\u0065");};if _ ,_ggffe =_edab (_begc ,_bcag ,_acfa );_ggffe !=nil {return nil ,_b .Wrap (_ggffe ,_cada ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0065\u0072\u006fd\u0065");
|
|
};};if _cfbfa ,_bdbg =_begc .RemoveBorder (_bbef );_bdbg !=nil {return nil ,_b .Wrap (_bdbg ,_cada ,"\u0072e\u0067\u0075\u006c\u0061\u0072");};if _aaceg ==nil {return _cfbfa ,nil ;};if _ ,_bdbg =_daef (_aaceg ,_cfbfa );_bdbg !=nil {return nil ,_bdbg ;};
|
|
return _aaceg ,nil ;};func Blit (src *Bitmap ,dst *Bitmap ,x ,y int ,op CombinationOperator )error {var _cgdg ,_ccddd int ;_fdcf :=src .RowStride -1;if x < 0{_ccddd =-x ;x =0;}else if x +src .Width > dst .Width {_fdcf -=src .Width +x -dst .Width ;};if y < 0{_cgdg =-y ;
|
|
y =0;_ccddd +=src .RowStride ;_fdcf +=src .RowStride ;}else if y +src .Height > dst .Height {_cgdg =src .Height +y -dst .Height ;};var (_gca int ;_gbgd error ;);_gfca :=x &0x07;_ebeg :=8-_gfca ;_afgd :=src .Width &0x07;_cedeg :=_ebeg -_afgd ;_bage :=_ebeg &0x07!=0;
|
|
_ffeb :=src .Width <=((_fdcf -_ccddd )<<3)+_ebeg ;_fdbd :=dst .GetByteIndex (x ,y );_ead :=_cgdg +dst .Height ;if src .Height > _ead {_gca =_ead ;}else {_gca =src .Height ;};switch {case !_bage :_gbgd =_dddb (src ,dst ,_cgdg ,_gca ,_fdbd ,_ccddd ,_fdcf ,op );
|
|
case _ffeb :_gbgd =_daed (src ,dst ,_cgdg ,_gca ,_fdbd ,_ccddd ,_fdcf ,_cedeg ,_gfca ,_ebeg ,op );default:_gbgd =_cffe (src ,dst ,_cgdg ,_gca ,_fdbd ,_ccddd ,_fdcf ,_cedeg ,_gfca ,_ebeg ,op ,_afgd );};return _gbgd ;};func (_fegb *ClassedPoints )Less (i ,j int )bool {return _fegb ._cbfb (i ,j )};
|
|
func RasterOperation (dest *Bitmap ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _edbfa (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func _cffe (_gfda ,_cbgg *Bitmap ,_acbbg ,_bbfc ,_gea ,_ebc ,_bff ,_bcb ,_ccag ,_bec int ,_ffdc CombinationOperator ,_edb int )error {var _gac int ;
|
|
_aebg :=func (){_gac ++;_gea +=_cbgg .RowStride ;_ebc +=_gfda .RowStride ;_bff +=_gfda .RowStride };for _gac =_acbbg ;_gac < _bbfc ;_aebg (){var _ecba uint16 ;_gefc :=_gea ;for _ccaa :=_ebc ;_ccaa <=_bff ;_ccaa ++{_dcdgb ,_gaff :=_cbgg .GetByte (_gefc );
|
|
if _gaff !=nil {return _gaff ;};_gfa ,_gaff :=_gfda .GetByte (_ccaa );if _gaff !=nil {return _gaff ;};_ecba =(_ecba |(uint16 (_gfa )&0xff))<<uint (_bec );_gfa =byte (_ecba >>8);if _gaff =_cbgg .SetByte (_gefc ,_cee (_dcdgb ,_gfa ,_ffdc ));_gaff !=nil {return _gaff ;
|
|
};_gefc ++;_ecba <<=uint (_ccag );if _ccaa ==_bff {_gfa =byte (_ecba >>(8-uint8 (_bec )));if _edb !=0{_gfa =_eeff (uint (8+_bcb ),_gfa );};_dcdgb ,_gaff =_cbgg .GetByte (_gefc );if _gaff !=nil {return _gaff ;};if _gaff =_cbgg .SetByte (_gefc ,_cee (_dcdgb ,_gfa ,_ffdc ));
|
|
_gaff !=nil {return _gaff ;};};};};return nil ;};func (_efag *Bitmap )setEightFullBytes (_decg int ,_efecf uint64 )error {if _decg +7> len (_efag .Data )-1{return _b .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");
|
|
};_efag .Data [_decg ]=byte ((_efecf &0xff00000000000000)>>56);_efag .Data [_decg +1]=byte ((_efecf &0xff000000000000)>>48);_efag .Data [_decg +2]=byte ((_efecf &0xff0000000000)>>40);_efag .Data [_decg +3]=byte ((_efecf &0xff00000000)>>32);_efag .Data [_decg +4]=byte ((_efecf &0xff000000)>>24);
|
|
_efag .Data [_decg +5]=byte ((_efecf &0xff0000)>>16);_efag .Data [_decg +6]=byte ((_efecf &0xff00)>>8);_efag .Data [_decg +7]=byte (_efecf &0xff);return nil ;};func (_gaaa *Bitmaps )ClipToBitmap (s *Bitmap )(*Bitmaps ,error ){const _geed ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0043\u006c\u0069p\u0054\u006f\u0042\u0069tm\u0061\u0070";
|
|
if _gaaa ==nil {return nil ,_b .Error (_geed ,"\u0042\u0069\u0074\u006dap\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if s ==nil {return nil ,_b .Error (_geed ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};_fbafe :=len (_gaaa .Values );_fgfaa :=&Bitmaps {Values :make ([]*Bitmap ,_fbafe ),Boxes :make ([]*_ce .Rectangle ,_fbafe )};var (_bdadg ,_gbfa *Bitmap ;_fafd *_ce .Rectangle ;_cgcgb error ;);for _debc :=0;_debc < _fbafe ;_debc ++{if _bdadg ,_cgcgb =_gaaa .GetBitmap (_debc );
|
|
_cgcgb !=nil {return nil ,_b .Wrap (_cgcgb ,_geed ,"");};if _fafd ,_cgcgb =_gaaa .GetBox (_debc );_cgcgb !=nil {return nil ,_b .Wrap (_cgcgb ,_geed ,"");};if _gbfa ,_cgcgb =s .clipRectangle (_fafd ,nil );_cgcgb !=nil {return nil ,_b .Wrap (_cgcgb ,_geed ,"");
|
|
};if _gbfa ,_cgcgb =_gbfa .And (_bdadg );_cgcgb !=nil {return nil ,_b .Wrap (_cgcgb ,_geed ,"");};_fgfaa .Values [_debc ]=_gbfa ;_fgfaa .Boxes [_debc ]=_fafd ;};return _fgfaa ,nil ;};type BitmapsArray struct{Values []*Bitmaps ;Boxes []*_ce .Rectangle ;
|
|
};func _fcg (_bcc ,_bcg *Bitmap ,_eafg int ,_ffb []byte ,_cagg int )(_caa error ){const _daag ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0034";var (_fa ,_adc ,_cfda ,_deeg ,_gbdf ,_bdf ,_efb ,_gda int ;
|
|
_bgc ,_ede uint32 ;_fga ,_gade byte ;_fgg uint16 ;);_efe :=make ([]byte ,4);_aac :=make ([]byte ,4);for _cfda =0;_cfda < _bcc .Height -1;_cfda ,_deeg =_cfda +2,_deeg +1{_fa =_cfda *_bcc .RowStride ;_adc =_deeg *_bcg .RowStride ;for _gbdf ,_bdf =0,0;_gbdf < _cagg ;
|
|
_gbdf ,_bdf =_gbdf +4,_bdf +1{for _efb =0;_efb < 4;_efb ++{_gda =_fa +_gbdf +_efb ;if _gda <=len (_bcc .Data )-1&&_gda < _fa +_bcc .RowStride {_efe [_efb ]=_bcc .Data [_gda ];}else {_efe [_efb ]=0x00;};_gda =_fa +_bcc .RowStride +_gbdf +_efb ;if _gda <=len (_bcc .Data )-1&&_gda < _fa +(2*_bcc .RowStride ){_aac [_efb ]=_bcc .Data [_gda ];
|
|
}else {_aac [_efb ]=0x00;};};_bgc =_ba .BigEndian .Uint32 (_efe );_ede =_ba .BigEndian .Uint32 (_aac );_ede &=_bgc ;_ede &=_ede <<1;_ede &=0xaaaaaaaa;_bgc =_ede |(_ede <<7);_fga =byte (_bgc >>24);_gade =byte ((_bgc >>8)&0xff);_gda =_adc +_bdf ;if _gda +1==len (_bcg .Data )-1||_gda +1>=_adc +_bcg .RowStride {_bcg .Data [_gda ]=_ffb [_fga ];
|
|
if _caa =_bcg .SetByte (_gda ,_ffb [_fga ]);_caa !=nil {return _b .Wrapf (_caa ,_daag ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_gda );};}else {_fgg =(uint16 (_ffb [_fga ])<<8)|uint16 (_ffb [_gade ]);if _caa =_bcg .setTwoBytes (_gda ,_fgg );_caa !=nil {return _b .Wrapf (_caa ,_daag ,"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",_gda );
|
|
};_bdf ++;};};};return nil ;};func (_ggcg *Boxes )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_edcg *Boxes ,_bdaa error ){const _dead ="\u0042o\u0078e\u0073\u002e\u0053\u0065\u006ce\u0063\u0074B\u0079\u0053\u0069\u007a\u0065";
|
|
if _ggcg ==nil {return nil ,_b .Error (_dead ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if len (*_ggcg )==0{return _ggcg ,nil ;};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_b .Errorf (_dead ,"\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 ,_b .Errorf (_dead ,"i\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020t\u0079\u0070\u0065:\u0020'\u0025\u0064\u0027",tp );
|
|
};_adff :=_ggcg .makeSizeIndicator (width ,height ,tp ,relation );_adbf ,_bdaa :=_ggcg .selectWithIndicator (_adff );if _bdaa !=nil {return nil ,_b .Wrap (_bdaa ,_dead ,"");};return _adbf ,nil ;};func _edab (_acgf ,_cfecd *Bitmap ,_gcef *Selection )(*Bitmap ,error ){const _cgdf ="\u0065\u0072\u006fd\u0065";
|
|
var (_gaed error ;_ccgb *Bitmap ;);_acgf ,_gaed =_gcbf (_acgf ,_cfecd ,_gcef ,&_ccgb );if _gaed !=nil {return nil ,_b .Wrap (_gaed ,_cgdf ,"");};if _gaed =_acgf .setAll ();_gaed !=nil {return nil ,_b .Wrap (_gaed ,_cgdf ,"");};var _efg SelectionValue ;
|
|
for _gafc :=0;_gafc < _gcef .Height ;_gafc ++{for _ffeg :=0;_ffeg < _gcef .Width ;_ffeg ++{_efg =_gcef .Data [_gafc ][_ffeg ];if _efg ==SelHit {_gaed =_edbfa (_acgf ,_gcef .Cx -_ffeg ,_gcef .Cy -_gafc ,_cfecd .Width ,_cfecd .Height ,PixSrcAndDst ,_ccgb ,0,0);
|
|
if _gaed !=nil {return nil ,_b .Wrap (_gaed ,_cgdf ,"");};};};};if MorphBC ==SymmetricMorphBC {return _acgf ,nil ;};_fbaf ,_bbda ,_ccc ,_fbga :=_gcef .findMaxTranslations ();if _fbaf > 0{if _gaed =_acgf .RasterOperation (0,0,_fbaf ,_cfecd .Height ,PixClr ,nil ,0,0);
|
|
_gaed !=nil {return nil ,_b .Wrap (_gaed ,_cgdf ,"\u0078\u0070\u0020\u003e\u0020\u0030");};};if _ccc > 0{if _gaed =_acgf .RasterOperation (_cfecd .Width -_ccc ,0,_ccc ,_cfecd .Height ,PixClr ,nil ,0,0);_gaed !=nil {return nil ,_b .Wrap (_gaed ,_cgdf ,"\u0078\u006e\u0020\u003e\u0020\u0030");
|
|
};};if _bbda > 0{if _gaed =_acgf .RasterOperation (0,0,_cfecd .Width ,_bbda ,PixClr ,nil ,0,0);_gaed !=nil {return nil ,_b .Wrap (_gaed ,_cgdf ,"\u0079\u0070\u0020\u003e\u0020\u0030");};};if _fbga > 0{if _gaed =_acgf .RasterOperation (0,_cfecd .Height -_fbga ,_cfecd .Width ,_fbga ,PixClr ,nil ,0,0);
|
|
_gaed !=nil {return nil ,_b .Wrap (_gaed ,_cgdf ,"\u0079\u006e\u0020\u003e\u0020\u0030");};};return _acgf ,nil ;};func (_dbff *Bitmaps )Size ()int {return len (_dbff .Values )};func (_ebef *Bitmap )setBit (_adb int ){_ebef .Data [(_adb >>3)]|=0x80>>uint (_adb &7)};
|
|
type CombinationOperator int ;func (_cgg *Bitmap )CreateTemplate ()*Bitmap {return _cgg .createTemplate ()};func (_gdb *Bitmap )SetPixel (x ,y int ,pixel byte )error {_dea :=_gdb .GetByteIndex (x ,y );if _dea > len (_gdb .Data )-1{return _b .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",_dea );
|
|
};_dab :=_gdb .GetBitOffset (x );_fdb :=uint (7-_dab );_cfe :=_gdb .Data [_dea ];var _afa byte ;if pixel ==1{_afa =_cfe |(pixel &0x01<<_fdb );}else {_afa =_cfe &^(1<<_fdb );};_gdb .Data [_dea ]=_afa ;return nil ;};func (_egca *Bitmap )GetChocolateData ()[]byte {if _egca .Color ==Vanilla {_egca .inverseData ();
|
|
};return _egca .Data ;};func _befgb (_bacea ,_gcf int ,_ddee string )*Selection {_gbaf :=&Selection {Height :_bacea ,Width :_gcf ,Name :_ddee };_gbaf .Data =make ([][]SelectionValue ,_bacea );for _effaf :=0;_effaf < _bacea ;_effaf ++{_gbaf .Data [_effaf ]=make ([]SelectionValue ,_gcf );
|
|
};return _gbaf ;};func (_cdff Points )XSorter ()func (_afcc ,_fbcde int )bool {return func (_eacb ,_dbdf int )bool {return _cdff [_eacb ].X < _cdff [_dbdf ].X };};const (_ SizeComparison =iota ;SizeSelectIfLT ;SizeSelectIfGT ;SizeSelectIfLTE ;SizeSelectIfGTE ;
|
|
SizeSelectIfEQ ;);func (_ebea CombinationOperator )String ()string {var _fgbcd string ;switch _ebea {case CmbOpOr :_fgbcd ="\u004f\u0052";case CmbOpAnd :_fgbcd ="\u0041\u004e\u0044";case CmbOpXor :_fgbcd ="\u0058\u004f\u0052";case CmbOpXNor :_fgbcd ="\u0058\u004e\u004f\u0052";
|
|
case CmbOpReplace :_fgbcd ="\u0052E\u0050\u004c\u0041\u0043\u0045";case CmbOpNot :_fgbcd ="\u004e\u004f\u0054";};return _fgbcd ;};func (_dgef *Bitmap )GetComponents (components Component ,maxWidth ,maxHeight int )(_fbcg *Bitmaps ,_bbgce *Boxes ,_gefcb error ){const _dcb ="B\u0069t\u006d\u0061\u0070\u002e\u0047\u0065\u0074\u0043o\u006d\u0070\u006f\u006een\u0074\u0073";
|
|
if _dgef ==nil {return nil ,nil ,_b .Error (_dcb ,"\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 ,_b .Error (_dcb ,"\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 _dgef .Zero (){_bbgce =&Boxes {};_fbcg =&Bitmaps {};return _fbcg ,_bbgce ,nil ;};switch components {case ComponentConn :_fbcg =&Bitmaps {};if _bbgce ,_gefcb =_dgef .ConnComponents (_fbcg ,8);_gefcb !=nil {return nil ,nil ,_b .Wrap (_gefcb ,_dcb ,"\u006e\u006f \u0070\u0072\u0065p\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};case ComponentCharacters :_cbdd ,_gdad :=MorphSequence (_dgef ,MorphProcess {Operation :MopClosing ,Arguments :[]int {1,6}});if _gdad !=nil {return nil ,nil ,_b .Wrap (_gdad ,_dcb ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _g .Log .IsLogLevel (_g .LogLevelTrace ){_g .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",_cbdd .String ());
|
|
};_bcea :=&Bitmaps {};_bbgce ,_gdad =_cbdd .ConnComponents (_bcea ,8);if _gdad !=nil {return nil ,nil ,_b .Wrap (_gdad ,_dcb ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _g .Log .IsLogLevel (_g .LogLevelTrace ){_g .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",_bcea .String ());
|
|
};if _fbcg ,_gdad =_bcea .ClipToBitmap (_dgef );_gdad !=nil {return nil ,nil ,_b .Wrap (_gdad ,_dcb ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentWords :_eaad :=1;
|
|
var _ddff *Bitmap ;switch {case _dgef .XResolution <=200:_ddff =_dgef ;case _dgef .XResolution <=400:_eaad =2;_ddff ,_gefcb =_aa (_dgef ,1,0,0,0);if _gefcb !=nil {return nil ,nil ,_b .Wrap (_gefcb ,_dcb ,"w\u006f\u0072\u0064\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u002d \u0078\u0072\u0065s\u003c=\u0034\u0030\u0030");
|
|
};default:_eaad =4;_ddff ,_gefcb =_aa (_dgef ,1,1,0,0);if _gefcb !=nil {return nil ,nil ,_b .Wrap (_gefcb ,_dcb ,"\u0077\u006f\u0072\u0064 \u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073 \u002d \u0078\u0072\u0065\u0073\u0020\u003e\u00204\u0030\u0030");
|
|
};};_efae ,_ ,_befg :=_gbb (_ddff );if _befg !=nil {return nil ,nil ,_b .Wrap (_befg ,_dcb ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_ecdd ,_befg :=_cbgc (_efae ,_eaad );if _befg !=nil {return nil ,nil ,_b .Wrap (_befg ,_dcb ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");
|
|
};_ggdf :=&Bitmaps {};if _bbgce ,_befg =_ecdd .ConnComponents (_ggdf ,4);_befg !=nil {return nil ,nil ,_b .Wrap (_befg ,_dcb ,"\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 _fbcg ,_befg =_ggdf .ClipToBitmap (_dgef );_befg !=nil {return nil ,nil ,_b .Wrap (_befg ,_dcb ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};};_fbcg ,_gefcb =_fbcg .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );
|
|
if _gefcb !=nil {return nil ,nil ,_b .Wrap (_gefcb ,_dcb ,"");};_bbgce ,_gefcb =_bbgce .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _gefcb !=nil {return nil ,nil ,_b .Wrap (_gefcb ,_dcb ,"");};return _fbcg ,_bbgce ,nil ;};func _eefea (_afec *_e .Stack ,_ffda ,_bacg ,_gaggg ,_aedf ,_fgbg int ,_cfdb *_ce .Rectangle )(_dgga error ){const _dfb ="\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 _afec ==nil {return _b .Error (_dfb ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _cfdb ==nil {return _b .Error (_dfb ,"\u0070\u0072\u006f\u0076i\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0069\u006da\u0067e\u002e\u0052\u0065\u0063\u0074\u0061\u006eg\u006c\u0065");
|
|
};_cfdb .Min .X =_e .Min (_cfdb .Min .X ,_ffda );_cfdb .Max .X =_e .Max (_cfdb .Max .X ,_bacg );_cfdb .Min .Y =_e .Min (_cfdb .Min .Y ,_gaggg );_cfdb .Max .Y =_e .Max (_cfdb .Max .Y ,_gaggg );if !(_gaggg +_aedf >=0&&_gaggg +_aedf <=_fgbg ){return nil ;
|
|
};if _afec .Aux ==nil {return _b .Error (_dfb ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};var _cfbff *fillSegment ;_ecddd ,_fgbf :=_afec .Aux .Pop ();if _fgbf {if _cfbff ,_fgbf =_ecddd .(*fillSegment );
|
|
!_fgbf {return _b .Error (_dfb ,"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 {_cfbff =&fillSegment {};
|
|
};_cfbff ._gbdag =_ffda ;_cfbff ._fddc =_bacg ;_cfbff ._ecggb =_gaggg ;_cfbff ._ccbb =_aedf ;_afec .Push (_cfbff );return nil ;};func (_abcce *Bitmap )clipRectangle (_fef ,_dge *_ce .Rectangle )(_fcf *Bitmap ,_edgf error ){const _ebeb ="\u0063\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
if _fef ==nil {return nil ,_b .Error (_ebeb ,"\u0070r\u006fv\u0069\u0064\u0065\u0064\u0020n\u0069\u006c \u0027\u0062\u006f\u0078\u0027");};_gbdc ,_fgf :=_abcce .Width ,_abcce .Height ;_aede ,_edgf :=ClipBoxToRectangle (_fef ,_gbdc ,_fgf );if _edgf !=nil {_g .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",_edgf );
|
|
return nil ,nil ;};_fgbc ,_agbf :=_aede .Min .X ,_aede .Min .Y ;_gdfg ,_ggaeg :=_aede .Max .X -_aede .Min .X ,_aede .Max .Y -_aede .Min .Y ;_fcf =New (_gdfg ,_ggaeg );_fcf .Text =_abcce .Text ;if _edgf =_fcf .RasterOperation (0,0,_gdfg ,_ggaeg ,PixSrc ,_abcce ,_fgbc ,_agbf );
|
|
_edgf !=nil {return nil ,_b .Wrap (_edgf ,_ebeb ,"");};if _dge !=nil {*_dge =*_aede ;};return _fcf ,nil ;};func _adec (_abadd ,_cbea *Bitmap ,_edcf *Selection )(*Bitmap ,error ){const _ffaa ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0032";
|
|
var _ccdb ,_gagg int ;if _cbea ==nil {return nil ,_b .Error (_ffaa ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _edcf ==nil {return nil ,_b .Error (_ffaa ,"\u0073e\u006c \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};_ccdb =_edcf .Width ;_gagg =_edcf .Height ;if _ccdb ==0||_gagg ==0{return nil ,_b .Error (_ffaa ,"\u0073\u0065\u006c\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _abadd ==nil {return _cbea .createTemplate (),nil ;};if _edcb :=_abadd .resizeImageData (_cbea );
|
|
_edcb !=nil {return nil ,_edcb ;};return _abadd ,nil ;};func (_facb *Bitmaps )WidthSorter ()func (_fdgd ,_egab int )bool {return func (_fgedg ,_caeg int )bool {return _facb .Values [_fgedg ].Width < _facb .Values [_caeg ].Width };};func (_cgge *Bitmap )countPixels ()int {var (_gaa int ;
|
|
_bdagf uint8 ;_dced byte ;_fedg int ;);_gfg :=_cgge .RowStride ;_cca :=uint (_cgge .Width &0x07);if _cca !=0{_bdagf =uint8 ((0xff<<(8-_cca ))&0xff);_gfg --;};for _cfef :=0;_cfef < _cgge .Height ;_cfef ++{for _fedg =0;_fedg < _gfg ;_fedg ++{_dced =_cgge .Data [_cfef *_cgge .RowStride +_fedg ];
|
|
_gaa +=int (_fcbf [_dced ]);};if _cca !=0{_gaa +=int (_fcbf [_cgge .Data [_cfef *_cgge .RowStride +_fedg ]&_bdagf ]);};};return _gaa ;};func TstImageBitmap ()*Bitmap {return _aebbc .Copy ()};func _edbfa (_fedb *Bitmap ,_gdfda ,_ggg ,_gageb ,_ggef int ,_fdfe RasterOperator ,_gbca *Bitmap ,_bffd ,_bfca int )error {const _ffbdd ="\u0072a\u0073t\u0065\u0072\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e";
|
|
if _fedb ==nil {return _b .Error (_ffbdd ,"\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");};if _fdfe ==PixDst {return nil ;};switch _fdfe {case PixClr ,PixSet ,PixNotDst :_ecacd (_fedb ,_gdfda ,_ggg ,_gageb ,_ggef ,_fdfe );
|
|
return nil ;};if _gbca ==nil {_g .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 _b .Error (_ffbdd ,"\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _faaab :=_gdeg (_fedb ,_gdfda ,_ggg ,_gageb ,_ggef ,_fdfe ,_gbca ,_bffd ,_bfca );_faaab !=nil {return _b .Wrap (_faaab ,_ffbdd ,"");
|
|
};return nil ;};func (_dgbd *Bitmap )setPadBits (_dfae int ){_bdc :=8-_dgbd .Width %8;if _bdc ==8{return ;};_eacc :=_dgbd .Width /8;_dbdb :=_feba [_bdc ];if _dfae ==0{_dbdb ^=_dbdb ;};var _gabc int ;for _bea :=0;_bea < _dgbd .Height ;_bea ++{_gabc =_bea *_dgbd .RowStride +_eacc ;
|
|
if _dfae ==0{_dgbd .Data [_gabc ]&=_dbdb ;}else {_dgbd .Data [_gabc ]|=_dbdb ;};};};var _fbgd =[]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 (_dagd *ClassedPoints )xSortFunction ()func (_bgdg int ,_fdfbc int )bool {return func (_effc ,_ffg int )bool {return _dagd .XAtIndex (_effc )< _dagd .XAtIndex (_ffg )};};type Bitmap struct{Width ,Height int ;BitmapNumber int ;RowStride int ;Data []byte ;
|
|
Color Color ;Special int ;Text string ;XResolution ,YResolution int ;};const (_ SizeSelection =iota ;SizeSelectByWidth ;SizeSelectByHeight ;SizeSelectByMaxDimension ;SizeSelectByArea ;SizeSelectByPerimeter ;);func (_cfdc *BitmapsArray )GetBox (i int )(*_ce .Rectangle ,error ){const _abbba ="\u0042\u0069\u0074\u006dap\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u006f\u0078";
|
|
if _cfdc ==nil {return nil ,_b .Error (_abbba ,"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 (_cfdc .Boxes )-1{return nil ,_b .Errorf (_abbba ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _cfdc .Boxes [i ],nil ;};func (_gef *Bitmap )ClipRectangle (box *_ce .Rectangle )(_bfbd *Bitmap ,_dcff *_ce .Rectangle ,_fce error ){const _fbce ="\u0043\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,nil ,_b .Error (_fbce ,"\u0062o\u0078 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};_abe ,_bbe :=_gef .Width ,_gef .Height ;_gdda :=_ce .Rect (0,0,_abe ,_bbe );if !box .Overlaps (_gdda ){return nil ,nil ,_b .Error (_fbce ,"b\u006f\u0078\u0020\u0064oe\u0073n\u0027\u0074\u0020\u006f\u0076e\u0072\u006c\u0061\u0070\u0020\u0062");};_ecbd :=box .Intersect (_gdda );
|
|
_fag ,_gfb :=_ecbd .Min .X ,_ecbd .Min .Y ;_ggb ,_eff :=_ecbd .Dx (),_ecbd .Dy ();_bfbd =New (_ggb ,_eff );_bfbd .Text =_gef .Text ;if _fce =_bfbd .RasterOperation (0,0,_ggb ,_eff ,PixSrc ,_gef ,_fag ,_gfb );_fce !=nil {return nil ,nil ,_b .Wrap (_fce ,_fbce ,"\u0050\u0069\u0078\u0053\u0072\u0063\u0020\u0074\u006f\u0020\u0063\u006ci\u0070\u0070\u0065\u0064");
|
|
};_dcff =&_ecbd ;return _bfbd ,_dcff ,nil ;};type LocationFilter int ;func (_dcgeb *Selection )findMaxTranslations ()(_adda ,_ccfgf ,_cgcg ,_deaa int ){for _gdae :=0;_gdae < _dcgeb .Height ;_gdae ++{for _daac :=0;_daac < _dcgeb .Width ;_daac ++{if _dcgeb .Data [_gdae ][_daac ]==SelHit {_adda =_fbfae (_adda ,_dcgeb .Cx -_daac );
|
|
_ccfgf =_fbfae (_ccfgf ,_dcgeb .Cy -_gdae );_cgcg =_fbfae (_cgcg ,_daac -_dcgeb .Cx );_deaa =_fbfae (_deaa ,_gdae -_dcgeb .Cy );};};};return _adda ,_ccfgf ,_cgcg ,_deaa ;};func TstFrameBitmapData ()[]byte {return _acca .Data };func (_dafa *Bitmaps )SortByHeight (){_abfbc :=(*byHeight )(_dafa );
|
|
_dd .Sort (_abfbc )};func init (){const _edef ="\u0062\u0069\u0074\u006dap\u0073\u002e\u0069\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0061\u0074\u0069o\u006e";_acca =New (50,40);var _aaeee error ;_acca ,_aaeee =_acca .AddBorder (2,1);if _aaeee !=nil {panic (_b .Wrap (_aaeee ,_edef ,"f\u0072\u0061\u006d\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));
|
|
};_aebbc ,_aaeee =NewWithData (50,22,_fbgd );if _aaeee !=nil {panic (_b .Wrap (_aaeee ,_edef ,"i\u006d\u0061\u0067\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};};func (_caggc *Bitmap )AddBorder (borderSize ,val int )(*Bitmap ,error ){if borderSize ==0{return _caggc .Copy (),nil ;
|
|
};_ecg ,_bgg :=_caggc .addBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize ,val );if _bgg !=nil {return nil ,_b .Wrap (_bgg ,"\u0041d\u0064\u0042\u006f\u0072\u0064\u0065r","");};return _ecg ,nil ;};func (_fggf Points )Size ()int {return len (_fggf )};
|
|
func (_cgcf *byHeight )Swap (i ,j int ){_cgcf .Values [i ],_cgcf .Values [j ]=_cgcf .Values [j ],_cgcf .Values [i ];if _cgcf .Boxes !=nil {_cgcf .Boxes [i ],_cgcf .Boxes [j ]=_cgcf .Boxes [j ],_cgcf .Boxes [i ];};};func (_fggb *Boxes )Add (box *_ce .Rectangle )error {if _fggb ==nil {return _b .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");
|
|
};*_fggb =append (*_fggb ,box );return nil ;};func _acbbf (_aebbd *Bitmap ,_dade ...MorphProcess )(_bfac *Bitmap ,_gafa error ){const _edae ="\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065";if _aebbd ==nil {return nil ,_b .Error (_edae ,"\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 (_dade )==0{return nil ,_b .Error (_edae ,"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 _gafa =_dbdd (_dade ...);
|
|
_gafa !=nil {return nil ,_b .Wrap (_gafa ,_edae ,"");};var _gddb ,_aaee ,_fcdf int ;_bfac =_aebbd .Copy ();for _ ,_fffdd :=range _dade {switch _fffdd .Operation {case MopDilation :_gddb ,_aaee =_fffdd .getWidthHeight ();_bfac ,_gafa =DilateBrick (nil ,_bfac ,_gddb ,_aaee );
|
|
if _gafa !=nil {return nil ,_b .Wrap (_gafa ,_edae ,"");};case MopErosion :_gddb ,_aaee =_fffdd .getWidthHeight ();_bfac ,_gafa =_bfbc (nil ,_bfac ,_gddb ,_aaee );if _gafa !=nil {return nil ,_b .Wrap (_gafa ,_edae ,"");};case MopOpening :_gddb ,_aaee =_fffdd .getWidthHeight ();
|
|
_bfac ,_gafa =_fdae (nil ,_bfac ,_gddb ,_aaee );if _gafa !=nil {return nil ,_b .Wrap (_gafa ,_edae ,"");};case MopClosing :_gddb ,_aaee =_fffdd .getWidthHeight ();_bfac ,_gafa =_edbf (nil ,_bfac ,_gddb ,_aaee );if _gafa !=nil {return nil ,_b .Wrap (_gafa ,_edae ,"");
|
|
};case MopRankBinaryReduction :_bfac ,_gafa =_aa (_bfac ,_fffdd .Arguments ...);if _gafa !=nil {return nil ,_b .Wrap (_gafa ,_edae ,"");};case MopReplicativeBinaryExpansion :_bfac ,_gafa =_cbgc (_bfac ,_fffdd .Arguments [0]);if _gafa !=nil {return nil ,_b .Wrap (_gafa ,_edae ,"");
|
|
};case MopAddBorder :_fcdf =_fffdd .Arguments [0];_bfac ,_gafa =_bfac .AddBorder (_fcdf ,0);if _gafa !=nil {return nil ,_b .Wrap (_gafa ,_edae ,"");};default:return nil ,_b .Error (_edae ,"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 _fcdf > 0{_bfac ,_gafa =_bfac .RemoveBorder (_fcdf );if _gafa !=nil {return nil ,_b .Wrap (_gafa ,_edae ,"\u0062\u006f\u0072\u0064\u0065\u0072\u0020\u003e\u0020\u0030");};};return _bfac ,nil ;};func CombineBytes (oldByte ,newByte byte ,op CombinationOperator )byte {return _cee (oldByte ,newByte ,op );
|
|
};func TstNSymbol (t *_d .T ,scale ...int )*Bitmap {_fbgg ,_afeb :=NewWithData (4,5,[]byte {0x90,0xD0,0xB0,0x90,0x90});_fg .NoError (t ,_afeb );return TstGetScaledSymbol (t ,_fbgg ,scale ...);};func _daca (_cdgd *Bitmap ,_bdcg ,_bace ,_ebec ,_dafg int ,_ecgce RasterOperator ,_cfab *Bitmap ,_gcee ,_eacg int )error {var (_bdea byte ;
|
|
_bcfe int ;_cagd int ;_fbfbf ,_ffdec int ;_acdc ,_fdef int ;);_baba :=_ebec >>3;_ecdf :=_ebec &7;if _ecdf > 0{_bdea =_ddge [_ecdf ];};_bcfe =_cfab .RowStride *_eacg +(_gcee >>3);_cagd =_cdgd .RowStride *_bace +(_bdcg >>3);switch _ecgce {case PixSrc :for _acdc =0;
|
|
_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]=_cfab .Data [_fbfbf ];_ffdec ++;_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],_cfab .Data [_fbfbf ],_bdea );
|
|
};};case PixNotSrc :for _acdc =0;_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]=^(_cfab .Data [_fbfbf ]);_ffdec ++;_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],^_cfab .Data [_fbfbf ],_bdea );
|
|
};};case PixSrcOrDst :for _acdc =0;_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]|=_cfab .Data [_fbfbf ];_ffdec ++;_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],_cfab .Data [_fbfbf ]|_cdgd .Data [_ffdec ],_bdea );
|
|
};};case PixSrcAndDst :for _acdc =0;_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]&=_cfab .Data [_fbfbf ];_ffdec ++;_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],_cfab .Data [_fbfbf ]&_cdgd .Data [_ffdec ],_bdea );
|
|
};};case PixSrcXorDst :for _acdc =0;_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]^=_cfab .Data [_fbfbf ];_ffdec ++;_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],_cfab .Data [_fbfbf ]^_cdgd .Data [_ffdec ],_bdea );
|
|
};};case PixNotSrcOrDst :for _acdc =0;_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]|=^(_cfab .Data [_fbfbf ]);_ffdec ++;_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],^(_cfab .Data [_fbfbf ])|_cdgd .Data [_ffdec ],_bdea );
|
|
};};case PixNotSrcAndDst :for _acdc =0;_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]&=^(_cfab .Data [_fbfbf ]);_ffdec ++;_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],^(_cfab .Data [_fbfbf ])&_cdgd .Data [_ffdec ],_bdea );
|
|
};};case PixSrcOrNotDst :for _acdc =0;_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]=_cfab .Data [_fbfbf ]|^(_cdgd .Data [_ffdec ]);_ffdec ++;
|
|
_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],_cfab .Data [_fbfbf ]|^(_cdgd .Data [_ffdec ]),_bdea );};};case PixSrcAndNotDst :for _acdc =0;_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;
|
|
for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]=_cfab .Data [_fbfbf ]&^(_cdgd .Data [_ffdec ]);_ffdec ++;_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],_cfab .Data [_fbfbf ]&^(_cdgd .Data [_ffdec ]),_bdea );};};
|
|
case PixNotPixSrcOrDst :for _acdc =0;_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]=^(_cfab .Data [_fbfbf ]|_cdgd .Data [_ffdec ]);_ffdec ++;
|
|
_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],^(_cfab .Data [_fbfbf ]|_cdgd .Data [_ffdec ]),_bdea );};};case PixNotPixSrcAndDst :for _acdc =0;_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;
|
|
for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]=^(_cfab .Data [_fbfbf ]&_cdgd .Data [_ffdec ]);_ffdec ++;_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],^(_cfab .Data [_fbfbf ]&_cdgd .Data [_ffdec ]),_bdea );};};
|
|
case PixNotPixSrcXorDst :for _acdc =0;_acdc < _dafg ;_acdc ++{_fbfbf =_bcfe +_acdc *_cfab .RowStride ;_ffdec =_cagd +_acdc *_cdgd .RowStride ;for _fdef =0;_fdef < _baba ;_fdef ++{_cdgd .Data [_ffdec ]=^(_cfab .Data [_fbfbf ]^_cdgd .Data [_ffdec ]);_ffdec ++;
|
|
_fbfbf ++;};if _ecdf > 0{_cdgd .Data [_ffdec ]=_fgcdb (_cdgd .Data [_ffdec ],^(_cfab .Data [_fbfbf ]^_cdgd .Data [_ffdec ]),_bdea );};};default:_g .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",_ecgce );
|
|
return _b .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 (_eege *ClassedPoints )GroupByY ()([]*ClassedPoints ,error ){const _bdaga ="\u0043\u006c\u0061\u0073se\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0072\u006f\u0075\u0070\u0042y\u0059";if _afcf :=_eege .validateIntSlice ();
|
|
_afcf !=nil {return nil ,_b .Wrap (_afcf ,_bdaga ,"");};if _eege .IntSlice .Size ()==0{return nil ,_b .Error (_bdaga ,"\u004e\u006f\u0020\u0063la\u0073\u0073\u0065\u0073\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");};_eege .SortByY ();var (_eafgd []*ClassedPoints ;
|
|
_fgbcb int ;);_aebc :=-1;var _cbbc *ClassedPoints ;for _fbbd :=0;_fbbd < len (_eege .IntSlice );_fbbd ++{_fgbcb =int (_eege .YAtIndex (_fbbd ));if _fgbcb !=_aebc {_cbbc =&ClassedPoints {Points :_eege .Points };_aebc =_fgbcb ;_eafgd =append (_eafgd ,_cbbc );
|
|
};_cbbc .IntSlice =append (_cbbc .IntSlice ,_eege .IntSlice [_fbbd ]);};for _ ,_befd :=range _eafgd {_befd .SortByX ();};return _eafgd ,nil ;};func New (width ,height int )*Bitmap {_gdc :=_dda (width ,height );_gdc .Data =make ([]byte ,height *_gdc .RowStride );
|
|
return _gdc ;};func _fdbf (_dbfg ,_cdg *Bitmap ,_fdd ,_gfac ,_gbgc uint ,_cfde ,_fade int ,_fbg bool ,_acc ,_bafd int )error {for _eddag :=_cfde ;_eddag < _fade ;_eddag ++{if _acc +1< len (_dbfg .Data ){_gfdff :=_eddag +1==_fade ;_gefcf ,_aabb :=_dbfg .GetByte (_acc );
|
|
if _aabb !=nil {return _aabb ;};_acc ++;_gefcf <<=_fdd ;_abbb ,_aabb :=_dbfg .GetByte (_acc );if _aabb !=nil {return _aabb ;};_abbb >>=_gfac ;_dfcd :=_gefcf |_abbb ;if _gfdff &&!_fbg {_dfcd =_eeff (_gbgc ,_dfcd );};_aabb =_cdg .SetByte (_bafd ,_dfcd );
|
|
if _aabb !=nil {return _aabb ;};_bafd ++;if _gfdff &&_fbg {_edad ,_bcgbc :=_dbfg .GetByte (_acc );if _bcgbc !=nil {return _bcgbc ;};_edad <<=_fdd ;_dfcd =_eeff (_gbgc ,_edad );if _bcgbc =_cdg .SetByte (_bafd ,_dfcd );_bcgbc !=nil {return _bcgbc ;};};continue ;
|
|
};_abfg ,_bgbb :=_dbfg .GetByte (_acc );if _bgbb !=nil {_g .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",_acc ,_bgbb );
|
|
return _bgbb ;};_abfg <<=_fdd ;_acc ++;_bgbb =_cdg .SetByte (_bafd ,_abfg );if _bgbb !=nil {return _bgbb ;};_bafd ++;};return nil ;};const (_ LocationFilter =iota ;LocSelectWidth ;LocSelectHeight ;LocSelectXVal ;LocSelectYVal ;LocSelectIfEither ;LocSelectIfBoth ;
|
|
);func TstISymbol (t *_d .T ,scale ...int )*Bitmap {_gfea ,_ecbbc :=NewWithData (1,5,[]byte {0x80,0x80,0x80,0x80,0x80});_fg .NoError (t ,_ecbbc );return TstGetScaledSymbol (t ,_gfea ,scale ...);};const (AsymmetricMorphBC BoundaryCondition =iota ;SymmetricMorphBC ;
|
|
);func Centroids (bms []*Bitmap )(*Points ,error ){_ega :=make ([]Point ,len (bms ));_agdc :=_fbde ();_aaad :=_bbgf ();var _eedc error ;for _aeg ,_dbab :=range bms {_ega [_aeg ],_eedc =_dbab .centroid (_agdc ,_aaad );if _eedc !=nil {return nil ,_eedc ;
|
|
};};_cdeg :=Points (_ega );return &_cdeg ,nil ;};func _bfbc (_gefa ,_cgbe *Bitmap ,_gfff ,_aagc int )(*Bitmap ,error ){const _cafea ="\u0065\u0072\u006f\u0064\u0065\u0042\u0072\u0069\u0063\u006b";if _cgbe ==nil {return nil ,_b .Error (_cafea ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _gfff < 1||_aagc < 1{return nil ,_b .Error (_cafea ,"\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 _gfff ==1&&_aagc ==1{_gabe ,_aege :=_daef (_gefa ,_cgbe );if _aege !=nil {return nil ,_b .Wrap (_aege ,_cafea ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _gabe ,nil ;};if _gfff ==1||_aagc ==1{_aeee :=SelCreateBrick (_aagc ,_gfff ,_aagc /2,_gfff /2,SelHit );_eece ,_agge :=_edab (_gefa ,_cgbe ,_aeee );if _agge !=nil {return nil ,_b .Wrap (_agge ,_cafea ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _eece ,nil ;};_cfeb :=SelCreateBrick (1,_gfff ,0,_gfff /2,SelHit );_cgbeb :=SelCreateBrick (_aagc ,1,_aagc /2,0,SelHit );_fefe ,_eeef :=_edab (nil ,_cgbe ,_cfeb );if _eeef !=nil {return nil ,_b .Wrap (_eeef ,_cafea ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_gefa ,_eeef =_edab (_gefa ,_fefe ,_cgbeb );if _eeef !=nil {return nil ,_b .Wrap (_eeef ,_cafea ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _gefa ,nil ;};func _dbdd (_aggd ...MorphProcess )(_aacc error ){const _efge ="v\u0065r\u0069\u0066\u0079\u004d\u006f\u0072\u0070\u0068P\u0072\u006f\u0063\u0065ss\u0065\u0073";
|
|
var _cafb ,_fedc int ;for _fdgb ,_ffdcd :=range _aggd {if _aacc =_ffdcd .verify (_fdgb ,&_cafb ,&_fedc );_aacc !=nil {return _b .Wrap (_aacc ,_efge ,"");};};if _fedc !=0&&_cafb !=0{return _b .Error (_efge ,"\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 _cgbb (_fdac *Bitmap ,_abfb *Bitmap ,_daeag *Selection )(*Bitmap ,error ){var (_ecfg *Bitmap ;_ecea error ;);_fdac ,_ecea =_gcbf (_fdac ,_abfb ,_daeag ,&_ecfg );if _ecea !=nil {return nil ,_ecea ;};if _ecea =_fdac .clearAll ();_ecea !=nil {return nil ,_ecea ;
|
|
};var _ddda SelectionValue ;for _bgcg :=0;_bgcg < _daeag .Height ;_bgcg ++{for _feeg :=0;_feeg < _daeag .Width ;_feeg ++{_ddda =_daeag .Data [_bgcg ][_feeg ];if _ddda ==SelHit {if _ecea =_fdac .RasterOperation (_feeg -_daeag .Cx ,_bgcg -_daeag .Cy ,_abfb .Width ,_abfb .Height ,PixSrcOrDst ,_ecfg ,0,0);
|
|
_ecea !=nil {return nil ,_ecea ;};};};};return _fdac ,nil ;};func _eefeb (_cbda ,_fefd ,_fbbdg *Bitmap ,_dfcb int )(*Bitmap ,error ){const _fadde ="\u0073\u0065\u0065\u0064\u0046\u0069\u006c\u006c\u0042i\u006e\u0061\u0072\u0079";if _fefd ==nil {return nil ,_b .Error (_fadde ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
};if _fbbdg ==nil {return nil ,_b .Error (_fadde ,"'\u006da\u0073\u006b\u0027\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _dfcb !=4&&_dfcb !=8{return nil ,_b .Error (_fadde ,"\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 _fddf error ;_cbda ,_fddf =_daef (_cbda ,_fefd );if _fddf !=nil {return nil ,_b .Wrap (_fddf ,_fadde ,"\u0063o\u0070y\u0020\u0073\u006f\u0075\u0072c\u0065\u0020t\u006f\u0020\u0027\u0064\u0027");};_baebf :=_fefd .createTemplate ();_fbbdg .setPadBits (0);
|
|
for _affge :=0;_affge < _bcac ;_affge ++{_baebf ,_fddf =_daef (_baebf ,_cbda );if _fddf !=nil {return nil ,_b .Wrapf (_fddf ,_fadde ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_affge );};if _fddf =_dadfb (_cbda ,_fbbdg ,_dfcb );
|
|
_fddf !=nil {return nil ,_b .Wrapf (_fddf ,_fadde ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_affge );};if _baebf .Equals (_cbda ){break ;};};return _cbda ,nil ;};func _fbde ()[]int {_gdde :=make ([]int ,256);_gdde [0]=0;
|
|
_gdde [1]=7;var _gfag int ;for _gfag =2;_gfag < 4;_gfag ++{_gdde [_gfag ]=_gdde [_gfag -2]+6;};for _gfag =4;_gfag < 8;_gfag ++{_gdde [_gfag ]=_gdde [_gfag -4]+5;};for _gfag =8;_gfag < 16;_gfag ++{_gdde [_gfag ]=_gdde [_gfag -8]+4;};for _gfag =16;_gfag < 32;
|
|
_gfag ++{_gdde [_gfag ]=_gdde [_gfag -16]+3;};for _gfag =32;_gfag < 64;_gfag ++{_gdde [_gfag ]=_gdde [_gfag -32]+2;};for _gfag =64;_gfag < 128;_gfag ++{_gdde [_gfag ]=_gdde [_gfag -64]+1;};for _gfag =128;_gfag < 256;_gfag ++{_gdde [_gfag ]=_gdde [_gfag -128];
|
|
};return _gdde ;};func (_dadc Points )GetIntY (i int )(int ,error ){if i >=len (_dadc ){return 0,_b .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 (_dadc [i ].Y ),nil ;};const (PixSrc RasterOperator =0xc;PixDst RasterOperator =0xa;PixNotSrc RasterOperator =0x3;PixNotDst RasterOperator =0x5;PixClr RasterOperator =0x0;PixSet RasterOperator =0xf;PixSrcOrDst RasterOperator =0xe;PixSrcAndDst RasterOperator =0x8;
|
|
PixSrcXorDst RasterOperator =0x6;PixNotSrcOrDst RasterOperator =0xb;PixNotSrcAndDst RasterOperator =0x2;PixSrcOrNotDst RasterOperator =0xd;PixSrcAndNotDst RasterOperator =0x4;PixNotPixSrcOrDst RasterOperator =0x1;PixNotPixSrcAndDst RasterOperator =0x7;
|
|
PixNotPixSrcXorDst RasterOperator =0x9;PixPaint =PixSrcOrDst ;PixSubtract =PixNotSrcAndDst ;PixMask =PixSrcAndDst ;); |