mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-29 13:48:54 +08:00
662 lines
196 KiB
Go
662 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 (_abg "encoding/binary";_a "github.com/stretchr/testify/require";_ca "github.com/unidoc/unipdf/v3/common";_ab "github.com/unidoc/unipdf/v3/internal/bitwise";_ac "github.com/unidoc/unipdf/v3/internal/imageutil";_gb "github.com/unidoc/unipdf/v3/internal/jbig2/basic";
|
|
_f "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_be "image";_gg "math";_cc "sort";_c "strings";_b "testing";);func (_ebc *Bitmap )ClipRectangle (box *_be .Rectangle )(_gbcb *Bitmap ,_cgf *_be .Rectangle ,_gba error ){const _bcbg ="\u0043\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
if box ==nil {return nil ,nil ,_f .Error (_bcbg ,"\u0062o\u0078 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};_efce ,_gecf :=_ebc .Width ,_ebc .Height ;_ddf :=_be .Rect (0,0,_efce ,_gecf );if !box .Overlaps (_ddf ){return nil ,nil ,_f .Error (_bcbg ,"b\u006f\u0078\u0020\u0064oe\u0073n\u0027\u0074\u0020\u006f\u0076e\u0072\u006c\u0061\u0070\u0020\u0062");
|
|
};_daa :=box .Intersect (_ddf );_dfgc ,_gbca :=_daa .Min .X ,_daa .Min .Y ;_cacc ,_dcdf :=_daa .Dx (),_daa .Dy ();_gbcb =New (_cacc ,_dcdf );_gbcb .Text =_ebc .Text ;if _gba =_gbcb .RasterOperation (0,0,_cacc ,_dcdf ,PixSrc ,_ebc ,_dfgc ,_gbca );_gba !=nil {return nil ,nil ,_f .Wrap (_gba ,_bcbg ,"\u0050\u0069\u0078\u0053\u0072\u0063\u0020\u0074\u006f\u0020\u0063\u006ci\u0070\u0070\u0065\u0064");
|
|
};_cgf =&_daa ;return _gbcb ,_cgf ,nil ;};func _agcee (_fbfb ,_bfbgb *Bitmap ,_dbd ,_cdaag int )(*Bitmap ,error ){const _egbc ="d\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063\u006b";if _bfbgb ==nil {_ca .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 ,_f .Error (_egbc ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _dbd < 1||_cdaag < 1{return nil ,_f .Error (_egbc ,"\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 _dbd ==1&&_cdaag ==1{_ccafb ,_cbbe :=_dgf (_fbfb ,_bfbgb );if _cbbe !=nil {return nil ,_f .Wrap (_cbbe ,_egbc ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _ccafb ,nil ;};if _dbd ==1||_cdaag ==1{_eegcb :=SelCreateBrick (_cdaag ,_dbd ,_cdaag /2,_dbd /2,SelHit );_dcgd ,_cage :=_bece (_fbfb ,_bfbgb ,_eegcb );if _cage !=nil {return nil ,_f .Wrap (_cage ,_egbc ,"\u0068s\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _dcgd ,nil ;};_deda :=SelCreateBrick (1,_dbd ,0,_dbd /2,SelHit );_caed :=SelCreateBrick (_cdaag ,1,_cdaag /2,0,SelHit );_ddb ,_ggfgf :=_bece (nil ,_bfbgb ,_deda );if _ggfgf !=nil {return nil ,_f .Wrap (_ggfgf ,_egbc ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_fbfb ,_ggfgf =_bece (_fbfb ,_ddb ,_caed );if _ggfgf !=nil {return nil ,_f .Wrap (_ggfgf ,_egbc ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _fbfb ,nil ;};const (_ LocationFilter =iota ;LocSelectWidth ;LocSelectHeight ;LocSelectXVal ;
|
|
LocSelectYVal ;LocSelectIfEither ;LocSelectIfBoth ;);type shift int ;const (CmbOpOr CombinationOperator =iota ;CmbOpAnd ;CmbOpXor ;CmbOpXNor ;CmbOpReplace ;CmbOpNot ;);func _eba (_cga *Bitmap ,_aabb int ,_cbd []byte )(_gaa *Bitmap ,_fd error ){const _gfd ="\u0072\u0065\u0064\u0075\u0063\u0065\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0032";
|
|
if _cga ==nil {return nil ,_f .Error (_gfd ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _aabb < 1||_aabb > 4{return nil ,_f .Error (_gfd ,"\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 _cga .Height <=1{return nil ,_f .Errorf (_gfd ,"\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",_cga .Height );
|
|
};_gaa =New (_cga .Width /2,_cga .Height /2);if _cbd ==nil {_cbd =_dgc ();};_edc :=_aggf (_cga .RowStride ,2*_gaa .RowStride );switch _aabb {case 1:_fd =_ccbb (_cga ,_gaa ,_aabb ,_cbd ,_edc );case 2:_fd =_cbdb (_cga ,_gaa ,_aabb ,_cbd ,_edc );case 3:_fd =_gfdf (_cga ,_gaa ,_aabb ,_cbd ,_edc );
|
|
case 4:_fd =_gefe (_cga ,_gaa ,_aabb ,_cbd ,_edc );};if _fd !=nil {return nil ,_fd ;};return _gaa ,nil ;};func (_ecgg *Bitmaps )makeSizeIndicator (_agaaa ,_dbggc int ,_efaf LocationFilter ,_fcgc SizeComparison )(_dbgd *_gb .NumSlice ,_ecefa error ){const _gdfe ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u006d\u0061\u006b\u0065S\u0069z\u0065I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _ecgg ==nil {return nil ,_f .Error (_gdfe ,"\u0062\u0069\u0074ma\u0070\u0073\u0020\u0027\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch _efaf {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_f .Errorf (_gdfe ,"\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",_efaf );
|
|
};switch _fcgc {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_f .Errorf (_gdfe ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",_fcgc );
|
|
};_dbgd =&_gb .NumSlice {};var (_cecgc ,_febf ,_dddd int ;_gbcbc *Bitmap ;);for _ ,_gbcbc =range _ecgg .Values {_cecgc =0;_febf ,_dddd =_gbcbc .Width ,_gbcbc .Height ;switch _efaf {case LocSelectWidth :if (_fcgc ==SizeSelectIfLT &&_febf < _agaaa )||(_fcgc ==SizeSelectIfGT &&_febf > _agaaa )||(_fcgc ==SizeSelectIfLTE &&_febf <=_agaaa )||(_fcgc ==SizeSelectIfGTE &&_febf >=_agaaa )||(_fcgc ==SizeSelectIfEQ &&_febf ==_agaaa ){_cecgc =1;
|
|
};case LocSelectHeight :if (_fcgc ==SizeSelectIfLT &&_dddd < _dbggc )||(_fcgc ==SizeSelectIfGT &&_dddd > _dbggc )||(_fcgc ==SizeSelectIfLTE &&_dddd <=_dbggc )||(_fcgc ==SizeSelectIfGTE &&_dddd >=_dbggc )||(_fcgc ==SizeSelectIfEQ &&_dddd ==_dbggc ){_cecgc =1;
|
|
};case LocSelectIfEither :if (_fcgc ==SizeSelectIfLT &&(_febf < _agaaa ||_dddd < _dbggc ))||(_fcgc ==SizeSelectIfGT &&(_febf > _agaaa ||_dddd > _dbggc ))||(_fcgc ==SizeSelectIfLTE &&(_febf <=_agaaa ||_dddd <=_dbggc ))||(_fcgc ==SizeSelectIfGTE &&(_febf >=_agaaa ||_dddd >=_dbggc ))||(_fcgc ==SizeSelectIfEQ &&(_febf ==_agaaa ||_dddd ==_dbggc )){_cecgc =1;
|
|
};case LocSelectIfBoth :if (_fcgc ==SizeSelectIfLT &&(_febf < _agaaa &&_dddd < _dbggc ))||(_fcgc ==SizeSelectIfGT &&(_febf > _agaaa &&_dddd > _dbggc ))||(_fcgc ==SizeSelectIfLTE &&(_febf <=_agaaa &&_dddd <=_dbggc ))||(_fcgc ==SizeSelectIfGTE &&(_febf >=_agaaa &&_dddd >=_dbggc ))||(_fcgc ==SizeSelectIfEQ &&(_febf ==_agaaa &&_dddd ==_dbggc )){_cecgc =1;
|
|
};};_dbgd .AddInt (_cecgc );};return _dbgd ,nil ;};func (_cgc *Points )Add (pt *Points )error {const _adaa ="\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0041\u0064\u0064";if _cgc ==nil {return _f .Error (_adaa ,"\u0070o\u0069n\u0074\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if pt ==nil {return _f .Error (_adaa ,"a\u0072\u0067\u0075\u006d\u0065\u006et\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");};*_cgc =append (*_cgc ,*pt ...);return nil ;};func (_bbf *Bitmap )SetPadBits (value int ){_bbf .setPadBits (value )};
|
|
func _ggeb (_gedf ,_bfg ,_eggef *Bitmap )(*Bitmap ,error ){const _cecg ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0078\u006f\u0072";if _bfg ==nil {return nil ,_f .Error (_cecg ,"'\u0062\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _eggef ==nil {return nil ,_f .Error (_cecg ,"'\u0062\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
};if _gedf ==_eggef {return nil ,_f .Error (_cecg ,"'\u0064\u0027\u0020\u003d\u003d\u0020\u0027\u0062\u0032\u0027");};if !_bfg .SizesEqual (_eggef ){_ca .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",_cecg );
|
|
};var _aabc error ;if _gedf ,_aabc =_dgf (_gedf ,_bfg );_aabc !=nil {return nil ,_f .Wrap (_aabc ,_cecg ,"\u0063\u0061n\u0027\u0074\u0020c\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027");};if _aabc =_gedf .RasterOperation (0,0,_gedf .Width ,_gedf .Height ,PixSrcXorDst ,_eggef ,0,0);
|
|
_aabc !=nil {return nil ,_f .Wrap (_aabc ,_cecg ,"");};return _gedf ,nil ;};func (_cdcc *Bitmap )setFourBytes (_cead int ,_fgfd uint32 )error {if _cead +3> len (_cdcc .Data )-1{return _f .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",_cead );
|
|
};_cdcc .Data [_cead ]=byte ((_fgfd &0xff000000)>>24);_cdcc .Data [_cead +1]=byte ((_fgfd &0xff0000)>>16);_cdcc .Data [_cead +2]=byte ((_fgfd &0xff00)>>8);_cdcc .Data [_cead +3]=byte (_fgfd &0xff);return nil ;};func _dbad (_febec *Bitmap ,_dffbe *_gb .Stack ,_fcgg ,_ddfg int )(_egdd *_be .Rectangle ,_gdfca error ){const _abadf ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _febec ==nil {return nil ,_f .Error (_abadf ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _dffbe ==nil {return nil ,_f .Error (_abadf ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_cdddb ,_caab :=_febec .Width ,_febec .Height ;_afcg :=_cdddb -1;_gaeeg :=_caab -1;if _fcgg < 0||_fcgg > _afcg ||_ddfg < 0||_ddfg > _gaeeg ||!_febec .GetPixel (_fcgg ,_ddfg ){return nil ,nil ;};_fgeb :=_be .Rect (100000,100000,0,0);if _gdfca =_ecff (_dffbe ,_fcgg ,_fcgg ,_ddfg ,1,_gaeeg ,&_fgeb );
|
|
_gdfca !=nil {return nil ,_f .Wrap (_gdfca ,_abadf ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _gdfca =_ecff (_dffbe ,_fcgg ,_fcgg ,_ddfg +1,-1,_gaeeg ,&_fgeb );_gdfca !=nil {return nil ,_f .Wrap (_gdfca ,_abadf ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};_fgeb .Min .X ,_fgeb .Max .X =_fcgg ,_fcgg ;_fgeb .Min .Y ,_fgeb .Max .Y =_ddfg ,_ddfg ;var (_egda *fillSegment ;_gada int ;);for _dffbe .Len ()> 0{if _egda ,_gdfca =_aebf (_dffbe );_gdfca !=nil {return nil ,_f .Wrap (_gdfca ,_abadf ,"");};_ddfg =_egda ._deba ;
|
|
for _fcgg =_egda ._egca -1;_fcgg >=0&&_febec .GetPixel (_fcgg ,_ddfg );_fcgg --{if _gdfca =_febec .SetPixel (_fcgg ,_ddfg ,0);_gdfca !=nil {return nil ,_f .Wrap (_gdfca ,_abadf ,"\u0031s\u0074\u0020\u0073\u0065\u0074");};};if _fcgg >=_egda ._egca -1{for {for _fcgg ++;
|
|
_fcgg <=_egda ._efbba +1&&_fcgg <=_afcg &&!_febec .GetPixel (_fcgg ,_ddfg );_fcgg ++{};_gada =_fcgg ;if !(_fcgg <=_egda ._efbba +1&&_fcgg <=_afcg ){break ;};for ;_fcgg <=_afcg &&_febec .GetPixel (_fcgg ,_ddfg );_fcgg ++{if _gdfca =_febec .SetPixel (_fcgg ,_ddfg ,0);
|
|
_gdfca !=nil {return nil ,_f .Wrap (_gdfca ,_abadf ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _gdfca =_ecff (_dffbe ,_gada ,_fcgg -1,_egda ._deba ,_egda ._bfabf ,_gaeeg ,&_fgeb );_gdfca !=nil {return nil ,_f .Wrap (_gdfca ,_abadf ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};if _fcgg > _egda ._efbba {if _gdfca =_ecff (_dffbe ,_egda ._efbba +1,_fcgg -1,_egda ._deba ,-_egda ._bfabf ,_gaeeg ,&_fgeb );_gdfca !=nil {return nil ,_f .Wrap (_gdfca ,_abadf ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};};continue ;};_gada =_fcgg +1;if _gada < _egda ._egca {if _gdfca =_ecff (_dffbe ,_gada ,_egda ._egca -1,_egda ._deba ,-_egda ._bfabf ,_gaeeg ,&_fgeb );_gdfca !=nil {return nil ,_f .Wrap (_gdfca ,_abadf ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_fcgg =_egda ._egca ;for {for ;_fcgg <=_afcg &&_febec .GetPixel (_fcgg ,_ddfg );_fcgg ++{if _gdfca =_febec .SetPixel (_fcgg ,_ddfg ,0);_gdfca !=nil {return nil ,_f .Wrap (_gdfca ,_abadf ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _gdfca =_ecff (_dffbe ,_gada ,_fcgg -1,_egda ._deba ,_egda ._bfabf ,_gaeeg ,&_fgeb );
|
|
_gdfca !=nil {return nil ,_f .Wrap (_gdfca ,_abadf ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _fcgg > _egda ._efbba {if _gdfca =_ecff (_dffbe ,_egda ._efbba +1,_fcgg -1,_egda ._deba ,-_egda ._bfabf ,_gaeeg ,&_fgeb );_gdfca !=nil {return nil ,_f .Wrap (_gdfca ,_abadf ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _fcgg ++;_fcgg <=_egda ._efbba +1&&_fcgg <=_afcg &&!_febec .GetPixel (_fcgg ,_ddfg );_fcgg ++{};_gada =_fcgg ;if !(_fcgg <=_egda ._efbba +1&&_fcgg <=_afcg ){break ;};};};_fgeb .Max .X ++;_fgeb .Max .Y ++;return &_fgeb ,nil ;};func (_gabe *ClassedPoints )validateIntSlice ()error {const _dcbb ="\u0076\u0061l\u0069\u0064\u0061t\u0065\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065";
|
|
for _ ,_acda :=range _gabe .IntSlice {if _acda >=(_gabe .Points .Size ()){return _f .Errorf (_dcbb ,"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",_acda ,_gabe .Points .Size ());
|
|
};};return nil ;};func (_deeeb *ClassedPoints )Len ()int {return _deeeb .IntSlice .Size ()};func TstImageBitmap ()*Bitmap {return _cbafa .Copy ()};func _dedfd (_bffa *Bitmap ,_eegfc *Bitmap ,_acfg *Selection ,_ggfc **Bitmap )(*Bitmap ,error ){const _cfbaf ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0031";
|
|
if _eegfc ==nil {return nil ,_f .Error (_cfbaf ,"\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 _acfg ==nil {return nil ,_f .Error (_cfbaf ,"\u004d\u006f\u0072\u0068p\u0041\u0072\u0067\u0073\u0031\u0020\u0027\u0073\u0065\u006c'\u0020n\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064");
|
|
};_cgfd ,_fgec :=_acfg .Height ,_acfg .Width ;if _cgfd ==0||_fgec ==0{return nil ,_f .Error (_cfbaf ,"\u0073\u0065\u006c\u0065ct\u0069\u006f\u006e\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _bffa ==nil {_bffa =_eegfc .createTemplate ();
|
|
*_ggfc =_eegfc ;return _bffa ,nil ;};_bffa .Width =_eegfc .Width ;_bffa .Height =_eegfc .Height ;_bffa .RowStride =_eegfc .RowStride ;_bffa .Color =_eegfc .Color ;_bffa .Data =make ([]byte ,_eegfc .RowStride *_eegfc .Height );if _bffa ==_eegfc {*_ggfc =_eegfc .Copy ();
|
|
}else {*_ggfc =_eegfc ;};return _bffa ,nil ;};func (_fefb *Bitmap )GetComponents (components Component ,maxWidth ,maxHeight int )(_cacde *Bitmaps ,_bcfa *Boxes ,_aegd error ){const _edab ="B\u0069t\u006d\u0061\u0070\u002e\u0047\u0065\u0074\u0043o\u006d\u0070\u006f\u006een\u0074\u0073";
|
|
if _fefb ==nil {return nil ,nil ,_f .Error (_edab ,"\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 ,_f .Error (_edab ,"\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 _fefb .Zero (){_bcfa =&Boxes {};_cacde =&Bitmaps {};return _cacde ,_bcfa ,nil ;};switch components {case ComponentConn :_cacde =&Bitmaps {};if _bcfa ,_aegd =_fefb .ConnComponents (_cacde ,8);_aegd !=nil {return nil ,nil ,_f .Wrap (_aegd ,_edab ,"\u006e\u006f \u0070\u0072\u0065p\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};case ComponentCharacters :_dab ,_fcb :=MorphSequence (_fefb ,MorphProcess {Operation :MopClosing ,Arguments :[]int {1,6}});if _fcb !=nil {return nil ,nil ,_f .Wrap (_fcb ,_edab ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _ca .Log .IsLogLevel (_ca .LogLevelTrace ){_ca .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",_dab .String ());
|
|
};_afeg :=&Bitmaps {};_bcfa ,_fcb =_dab .ConnComponents (_afeg ,8);if _fcb !=nil {return nil ,nil ,_f .Wrap (_fcb ,_edab ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _ca .Log .IsLogLevel (_ca .LogLevelTrace ){_ca .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",_afeg .String ());
|
|
};if _cacde ,_fcb =_afeg .ClipToBitmap (_fefb );_fcb !=nil {return nil ,nil ,_f .Wrap (_fcb ,_edab ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentWords :_adea :=1;
|
|
var _gabg *Bitmap ;switch {case _fefb .XResolution <=200:_gabg =_fefb ;case _fefb .XResolution <=400:_adea =2;_gabg ,_aegd =_aeb (_fefb ,1,0,0,0);if _aegd !=nil {return nil ,nil ,_f .Wrap (_aegd ,_edab ,"w\u006f\u0072\u0064\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u002d \u0078\u0072\u0065s\u003c=\u0034\u0030\u0030");
|
|
};default:_adea =4;_gabg ,_aegd =_aeb (_fefb ,1,1,0,0);if _aegd !=nil {return nil ,nil ,_f .Wrap (_aegd ,_edab ,"\u0077\u006f\u0072\u0064 \u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073 \u002d \u0078\u0072\u0065\u0073\u0020\u003e\u00204\u0030\u0030");
|
|
};};_cfbc ,_ ,_cfbe :=_daacc (_gabg );if _cfbe !=nil {return nil ,nil ,_f .Wrap (_cfbe ,_edab ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_ccae ,_cfbe :=_adbcb (_cfbc ,_adea );if _cfbe !=nil {return nil ,nil ,_f .Wrap (_cfbe ,_edab ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");
|
|
};_gag :=&Bitmaps {};if _bcfa ,_cfbe =_ccae .ConnComponents (_gag ,4);_cfbe !=nil {return nil ,nil ,_f .Wrap (_cfbe ,_edab ,"\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 _cacde ,_cfbe =_gag .ClipToBitmap (_fefb );_cfbe !=nil {return nil ,nil ,_f .Wrap (_cfbe ,_edab ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};};_cacde ,_aegd =_cacde .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );
|
|
if _aegd !=nil {return nil ,nil ,_f .Wrap (_aegd ,_edab ,"");};_bcfa ,_aegd =_bcfa .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _aegd !=nil {return nil ,nil ,_f .Wrap (_aegd ,_edab ,"");};return _cacde ,_bcfa ,nil ;};func init (){for _fgf :=0;
|
|
_fgf < 256;_fgf ++{_ffb [_fgf ]=uint8 (_fgf &0x1)+(uint8 (_fgf >>1)&0x1)+(uint8 (_fgf >>2)&0x1)+(uint8 (_fgf >>3)&0x1)+(uint8 (_fgf >>4)&0x1)+(uint8 (_fgf >>5)&0x1)+(uint8 (_fgf >>6)&0x1)+(uint8 (_fgf >>7)&0x1);};};func (_add *Bitmap )Copy ()*Bitmap {_egd :=make ([]byte ,len (_add .Data ));
|
|
copy (_egd ,_add .Data );return &Bitmap {Width :_add .Width ,Height :_add .Height ,RowStride :_add .RowStride ,Data :_egd ,Color :_add .Color ,Text :_add .Text ,BitmapNumber :_add .BitmapNumber ,Special :_add .Special };};func (_beb *Bitmap )SetByte (index int ,v byte )error {if index > len (_beb .Data )-1||index < 0{return _f .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 );
|
|
};_beb .Data [index ]=v ;return nil ;};func _daacc (_bggb *Bitmap )(_gcgbc *Bitmap ,_bbeb int ,_dfdc error ){const _egff ="\u0042i\u0074\u006d\u0061\u0070.\u0077\u006f\u0072\u0064\u004da\u0073k\u0042y\u0044\u0069\u006c\u0061\u0074\u0069\u006fn";if _bggb ==nil {return nil ,0,_f .Errorf (_egff ,"\u0027\u0073\u0027\u0020bi\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");
|
|
};var _ggab ,_aadbg *Bitmap ;if _ggab ,_dfdc =_dgf (nil ,_bggb );_dfdc !=nil {return nil ,0,_f .Wrap (_dfdc ,_egff ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0073\u0027");};var (_acde [13]int ;_gaeg ,_cade int ;);_affd :=12;_affa :=_gb .NewNumSlice (_affd +1);
|
|
_bdeb :=_gb .NewNumSlice (_affd +1);var _gdfb *Boxes ;for _abgf :=0;_abgf <=_affd ;_abgf ++{if _abgf ==0{if _aadbg ,_dfdc =_dgf (nil ,_ggab );_dfdc !=nil {return nil ,0,_f .Wrap (_dfdc ,_egff ,"\u0066i\u0072\u0073\u0074\u0020\u0062\u006d2");};}else {if _aadbg ,_dfdc =_aege (_ggab ,MorphProcess {Operation :MopDilation ,Arguments :[]int {2,1}});
|
|
_dfdc !=nil {return nil ,0,_f .Wrap (_dfdc ,_egff ,"\u0064\u0069\u006ca\u0074\u0069\u006f\u006e\u0020\u0062\u006d\u0032");};};if _gdfb ,_dfdc =_aadbg .connComponentsBB (4);_dfdc !=nil {return nil ,0,_f .Wrap (_dfdc ,_egff ,"");};_acde [_abgf ]=len (*_gdfb );
|
|
_affa .AddInt (_acde [_abgf ]);switch _abgf {case 0:_gaeg =_acde [0];default:_cade =_acde [_abgf -1]-_acde [_abgf ];_bdeb .AddInt (_cade );};_ggab =_aadbg ;};_aefd :=true ;_efdea :=2;var _faac ,_bgeac int ;for _ecfc :=1;_ecfc < len (*_bdeb );_ecfc ++{if _faac ,_dfdc =_affa .GetInt (_ecfc );
|
|
_dfdc !=nil {return nil ,0,_f .Wrap (_dfdc ,_egff ,"\u0043\u0068\u0065\u0063ki\u006e\u0067\u0020\u0062\u0065\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0069o\u006e");};if _aefd &&_faac < int (0.3*float32 (_gaeg )){_efdea =_ecfc +1;_aefd =false ;};
|
|
if _cade ,_dfdc =_bdeb .GetInt (_ecfc );_dfdc !=nil {return nil ,0,_f .Wrap (_dfdc ,_egff ,"\u0067\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006ea\u0044\u0069\u0066\u0066");};if _cade > _bgeac {_bgeac =_cade ;};};_bebg :=_bggb .XResolution ;if _bebg ==0{_bebg =150;
|
|
};if _bebg > 110{_efdea ++;};if _efdea < 2{_ca .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");
|
|
_efdea =2;};_bbeb =_efdea +1;if _gcgbc ,_dfdc =_adfa (nil ,_bggb ,_efdea +1,1);_dfdc !=nil {return nil ,0,_f .Wrap (_dfdc ,_egff ,"\u0067\u0065\u0074\u0074in\u0067\u0020\u006d\u0061\u0073\u006b\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};return _gcgbc ,_bbeb ,nil ;
|
|
};type byWidth Bitmaps ;func TstImageBitmapInverseData ()[]byte {_fcfbf :=_cbafa .Copy ();_fcfbf .InverseData ();return _fcfbf .Data ;};func (_eegc *Bitmap )clipRectangle (_dffg ,_fcg *_be .Rectangle )(_aeaf *Bitmap ,_edfg error ){const _edd ="\u0063\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
if _dffg ==nil {return nil ,_f .Error (_edd ,"\u0070r\u006fv\u0069\u0064\u0065\u0064\u0020n\u0069\u006c \u0027\u0062\u006f\u0078\u0027");};_dfda ,_dbf :=_eegc .Width ,_eegc .Height ;_egg ,_edfg :=ClipBoxToRectangle (_dffg ,_dfda ,_dbf );if _edfg !=nil {_ca .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",_edfg );
|
|
return nil ,nil ;};_eeff ,_egc :=_egg .Min .X ,_egg .Min .Y ;_agef ,_aac :=_egg .Max .X -_egg .Min .X ,_egg .Max .Y -_egg .Min .Y ;_aeaf =New (_agef ,_aac );_aeaf .Text =_eegc .Text ;if _edfg =_aeaf .RasterOperation (0,0,_agef ,_aac ,PixSrc ,_eegc ,_eeff ,_egc );
|
|
_edfg !=nil {return nil ,_f .Wrap (_edfg ,_edd ,"");};if _fcg !=nil {*_fcg =*_egg ;};return _aeaf ,nil ;};func (_dagf *Bitmap )nextOnPixel (_agg ,_becb int )(_ccea _be .Point ,_abd bool ,_gaee error ){const _efcc ="n\u0065\u0078\u0074\u004f\u006e\u0050\u0069\u0078\u0065\u006c";
|
|
_ccea ,_abd ,_gaee =_dagf .nextOnPixelLow (_dagf .Width ,_dagf .Height ,_dagf .RowStride ,_agg ,_becb );if _gaee !=nil {return _ccea ,false ,_f .Wrap (_gaee ,_efcc ,"");};return _ccea ,_abd ,nil ;};func (_cda *Bitmap )GetByte (index int )(byte ,error ){if index > len (_cda .Data )-1||index < 0{return 0,_f .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 _cda .Data [index ],nil ;};const (ComponentConn Component =iota ;ComponentCharacters ;ComponentWords ;);func (_gegf *Bitmap )setAll ()error {_ggg :=_bbec (_gegf ,0,0,_gegf .Width ,_gegf .Height ,PixSet ,nil ,0,0);if _ggg !=nil {return _f .Wrap (_ggg ,"\u0073\u0065\u0074\u0041\u006c\u006c","");
|
|
};return nil ;};func (_cgdd *BitmapsArray )AddBox (box *_be .Rectangle ){_cgdd .Boxes =append (_cgdd .Boxes ,box )};func Centroid (bm *Bitmap ,centTab ,sumTab []int )(Point ,error ){return bm .centroid (centTab ,sumTab )};func (_daca *Bitmaps )selectByIndexes (_gebbb []int )(*Bitmaps ,error ){_adfc :=&Bitmaps {};
|
|
for _ ,_eabdc :=range _gebbb {_fadcf ,_gaacc :=_daca .GetBitmap (_eabdc );if _gaacc !=nil {return nil ,_f .Wrap (_gaacc ,"\u0073e\u006ce\u0063\u0074\u0042\u0079\u0049\u006e\u0064\u0065\u0078\u0065\u0073","");};_adfc .AddBitmap (_fadcf );};return _adfc ,nil ;
|
|
};func (_egb *Bitmap )setEightBytes (_abcg int ,_acag uint64 )error {_cdcf :=_egb .RowStride -(_abcg %_egb .RowStride );if _egb .RowStride !=_egb .Width >>3{_cdcf --;};if _cdcf >=8{return _egb .setEightFullBytes (_abcg ,_acag );};return _egb .setEightPartlyBytes (_abcg ,_cdcf ,_acag );
|
|
};func (_eefa *Bitmap )connComponentsBitmapsBB (_fdbe *Bitmaps ,_cdcb int )(_fede *Boxes ,_fgaf error ){const _eabd ="\u0063\u006f\u006enC\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0069\u0074\u006d\u0061\u0070\u0073\u0042\u0042";if _cdcb !=4&&_cdcb !=8{return nil ,_f .Error (_eabd ,"\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 _fdbe ==nil {return nil ,_f .Error (_eabd ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");};if len (_fdbe .Values )> 0{return nil ,_f .Error (_eabd ,"\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 _eefa .Zero (){return &Boxes {},nil ;};var (_egcc ,_gggg ,_cbde ,_fedb *Bitmap ;);_eefa .setPadBits (0);if _egcc ,_fgaf =_dgf (nil ,_eefa );_fgaf !=nil {return nil ,_f .Wrap (_fgaf ,_eabd ,"\u0062\u006d\u0031");};if _gggg ,_fgaf =_dgf (nil ,_eefa );
|
|
_fgaf !=nil {return nil ,_f .Wrap (_fgaf ,_eabd ,"\u0062\u006d\u0032");};_cbdeb :=&_gb .Stack {};_cbdeb .Aux =&_gb .Stack {};_fede =&Boxes {};var (_ceca ,_ebfdc int ;_bgea _be .Point ;_fdfe bool ;_cffa *_be .Rectangle ;);for {if _bgea ,_fdfe ,_fgaf =_egcc .nextOnPixel (_ceca ,_ebfdc );
|
|
_fgaf !=nil {return nil ,_f .Wrap (_fgaf ,_eabd ,"");};if !_fdfe {break ;};if _cffa ,_fgaf =_eefdb (_egcc ,_cbdeb ,_bgea .X ,_bgea .Y ,_cdcb );_fgaf !=nil {return nil ,_f .Wrap (_fgaf ,_eabd ,"");};if _fgaf =_fede .Add (_cffa );_fgaf !=nil {return nil ,_f .Wrap (_fgaf ,_eabd ,"");
|
|
};if _cbde ,_fgaf =_egcc .clipRectangle (_cffa ,nil );_fgaf !=nil {return nil ,_f .Wrap (_fgaf ,_eabd ,"\u0062\u006d\u0033");};if _fedb ,_fgaf =_gggg .clipRectangle (_cffa ,nil );_fgaf !=nil {return nil ,_f .Wrap (_fgaf ,_eabd ,"\u0062\u006d\u0034");};
|
|
if _ ,_fgaf =_ggeb (_cbde ,_cbde ,_fedb );_fgaf !=nil {return nil ,_f .Wrap (_fgaf ,_eabd ,"\u0062m\u0033\u0020\u005e\u0020\u0062\u006d4");};if _fgaf =_gggg .RasterOperation (_cffa .Min .X ,_cffa .Min .Y ,_cffa .Dx (),_cffa .Dy (),PixSrcXorDst ,_cbde ,0,0);
|
|
_fgaf !=nil {return nil ,_f .Wrap (_fgaf ,_eabd ,"\u0062\u006d\u0032\u0020\u002d\u0058\u004f\u0052\u002d>\u0020\u0062\u006d\u0033");};_fdbe .AddBitmap (_cbde );_ceca =_bgea .X ;_ebfdc =_bgea .Y ;};_fdbe .Boxes =*_fede ;return _fede ,nil ;};func (_adee *Bitmaps )WidthSorter ()func (_ebbe ,_gadea int )bool {return func (_fedcf ,_facgb int )bool {return _adee .Values [_fedcf ].Width < _adee .Values [_facgb ].Width };
|
|
};func (_abc *Bitmap )Equals (s *Bitmap )bool {if len (_abc .Data )!=len (s .Data )||_abc .Width !=s .Width ||_abc .Height !=s .Height {return false ;};for _aga :=0;_aga < _abc .Height ;_aga ++{_abgb :=_aga *_abc .RowStride ;for _bca :=0;_bca < _abc .RowStride ;
|
|
_bca ++{if _abc .Data [_abgb +_bca ]!=s .Data [_abgb +_bca ]{return false ;};};};return true ;};func (_gcea *Bitmap )And (s *Bitmap )(_fedc *Bitmap ,_bafe error ){const _cff ="\u0042\u0069\u0074\u006d\u0061\u0070\u002e\u0041\u006e\u0064";if _gcea ==nil {return nil ,_f .Error (_cff ,"\u0027b\u0069t\u006d\u0061\u0070\u0020\u0027b\u0027\u0020i\u0073\u0020\u006e\u0069\u006c");
|
|
};if s ==nil {return nil ,_f .Error (_cff ,"\u0062\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069s\u0020\u006e\u0069\u006c");};if !_gcea .SizesEqual (s ){_ca .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",_cff );
|
|
};if _fedc ,_bafe =_dgf (_fedc ,_gcea );_bafe !=nil {return nil ,_f .Wrap (_bafe ,_cff ,"\u0063\u0061\u006e't\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _bafe =_fedc .RasterOperation (0,0,_fedc .Width ,_fedc .Height ,PixSrcAndDst ,s ,0,0);
|
|
_bafe !=nil {return nil ,_f .Wrap (_bafe ,_cff ,"");};return _fedc ,nil ;};func _aeb (_ebg *Bitmap ,_cgg ...int )(_gec *Bitmap ,_age error ){const _fgb ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0043\u0061\u0073\u0063\u0061\u0064\u0065";
|
|
if _ebg ==nil {return nil ,_f .Error (_fgb ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if len (_cgg )==0||len (_cgg )> 4{return nil ,_f .Error (_fgb ,"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 _cgg [0]<=0{_ca .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");_gec ,_age =_dgf (nil ,_ebg );if _age !=nil {return nil ,_f .Wrap (_age ,_fgb ,"l\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030");
|
|
};return _gec ,nil ;};_ged :=_dgc ();_gec =_ebg ;for _aab ,_dec :=range _cgg {if _dec <=0{break ;};_gec ,_age =_eba (_gec ,_dec ,_ged );if _age !=nil {return nil ,_f .Wrapf (_age ,_fgb ,"\u006c\u0065\u0076\u0065\u006c\u0025\u0064\u0020\u0072\u0065\u0064\u0075c\u0074\u0069\u006f\u006e",_aab );
|
|
};};return _gec ,nil ;};func (_adbg *Bitmap )countPixels ()int {var (_fcd int ;_abcd uint8 ;_cfdd byte ;_cbeg int ;);_adeg :=_adbg .RowStride ;_gcd :=uint (_adbg .Width &0x07);if _gcd !=0{_abcd =uint8 ((0xff<<(8-_gcd ))&0xff);_adeg --;};for _cgad :=0;_cgad < _adbg .Height ;
|
|
_cgad ++{for _cbeg =0;_cbeg < _adeg ;_cbeg ++{_cfdd =_adbg .Data [_cgad *_adbg .RowStride +_cbeg ];_fcd +=int (_ffb [_cfdd ]);};if _gcd !=0{_fcd +=int (_ffb [_adbg .Data [_cgad *_adbg .RowStride +_cbeg ]&_abcd ]);};};return _fcd ;};func (_gacg *Bitmap )Equivalent (s *Bitmap )bool {return _gacg .equivalent (s )};
|
|
func (_ffeg *ClassedPoints )Swap (i ,j int ){_ffeg .IntSlice [i ],_ffeg .IntSlice [j ]=_ffeg .IntSlice [j ],_ffeg .IntSlice [i ];};func (_gffd *Bitmap )GetVanillaData ()[]byte {if _gffd .Color ==Chocolate {_gffd .inverseData ();};return _gffd .Data ;};
|
|
func (_aba *Bitmap )AddBorderGeneral (left ,right ,top ,bot int ,val int )(*Bitmap ,error ){return _aba .addBorderGeneral (left ,right ,top ,bot ,val );};func CombineBytes (oldByte ,newByte byte ,op CombinationOperator )byte {return _begf (oldByte ,newByte ,op );
|
|
};type SelectionValue int ;func ClipBoxToRectangle (box *_be .Rectangle ,wi ,hi int )(_fee *_be .Rectangle ,_adcb error ){const _dafab ="\u0043l\u0069p\u0042\u006f\u0078\u0054\u006fR\u0065\u0063t\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,_f .Error (_dafab ,"\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 ,_f .Error (_dafab ,"\u0027\u0062\u006fx'\u0020\u006f\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0072\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065");};_ecaa :=*box ;
|
|
_fee =&_ecaa ;if _fee .Min .X < 0{_fee .Max .X +=_fee .Min .X ;_fee .Min .X =0;};if _fee .Min .Y < 0{_fee .Max .Y +=_fee .Min .Y ;_fee .Min .Y =0;};if _fee .Max .X > wi {_fee .Max .X =wi ;};if _fee .Max .Y > hi {_fee .Max .Y =hi ;};return _fee ,nil ;};
|
|
func _bcee (_bgdd ...MorphProcess )(_feba error ){const _ceed ="v\u0065r\u0069\u0066\u0079\u004d\u006f\u0072\u0070\u0068P\u0072\u006f\u0063\u0065ss\u0065\u0073";var _acab ,_efcea int ;for _aaeg ,_ffag :=range _bgdd {if _feba =_ffag .verify (_aaeg ,&_acab ,&_efcea );
|
|
_feba !=nil {return _f .Wrap (_feba ,_ceed ,"");};};if _efcea !=0&&_acab !=0{return _f .Error (_ceed ,"\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 (_cbed *Bitmap )setEightPartlyBytes (_cdg ,_efaa int ,_ggc uint64 )(_aacc error ){var (_fbbe byte ;_edcg int ;);const _ggbc ="\u0073\u0065\u0074\u0045ig\u0068\u0074\u0050\u0061\u0072\u0074\u006c\u0079\u0042\u0079\u0074\u0065\u0073";
|
|
for _bgee :=1;_bgee <=_efaa ;_bgee ++{_edcg =64-_bgee *8;_fbbe =byte (_ggc >>uint (_edcg )&0xff);_ca .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",_fbbe ,_cdg ,_cdg +_bgee -1,_efaa ,_edcg );
|
|
if _aacc =_cbed .SetByte (_cdg +_bgee -1,_fbbe );_aacc !=nil {return _f .Wrap (_aacc ,_ggbc ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};};_bggf :=_cbed .RowStride *8-_cbed .Width ;if _bggf ==0{return nil ;};_edcg -=8;_fbbe =byte (_ggc >>uint (_edcg )&0xff)<<uint (_bggf );
|
|
if _aacc =_cbed .SetByte (_cdg +_efaa ,_fbbe );_aacc !=nil {return _f .Wrap (_aacc ,_ggbc ,"\u0070\u0061\u0064\u0064\u0065\u0064");};return nil ;};func TstESymbol (t *_b .T ,scale ...int )*Bitmap {_cbfce ,_abedg :=NewWithData (4,5,[]byte {0xF0,0x80,0xE0,0x80,0xF0});
|
|
_a .NoError (t ,_abedg );return TstGetScaledSymbol (t ,_cbfce ,scale ...);};const (SelDontCare SelectionValue =iota ;SelHit ;SelMiss ;);func (_dadc *byHeight )Swap (i ,j int ){_dadc .Values [i ],_dadc .Values [j ]=_dadc .Values [j ],_dadc .Values [i ];
|
|
if _dadc .Boxes !=nil {_dadc .Boxes [i ],_dadc .Boxes [j ]=_dadc .Boxes [j ],_dadc .Boxes [i ];};};func (_eagc *Bitmaps )AddBox (box *_be .Rectangle ){_eagc .Boxes =append (_eagc .Boxes ,box )};func _baca (_ffaf ,_afbe *Bitmap ,_cdgf *Selection )(*Bitmap ,error ){const _fbag ="\u006f\u0070\u0065\u006e";
|
|
var _fdgb error ;_ffaf ,_fdgb =_gadd (_ffaf ,_afbe ,_cdgf );if _fdgb !=nil {return nil ,_f .Wrap (_fdgb ,_fbag ,"");};_cacce ,_fdgb :=_acca (nil ,_afbe ,_cdgf );if _fdgb !=nil {return nil ,_f .Wrap (_fdgb ,_fbag ,"");};_ ,_fdgb =_bece (_ffaf ,_cacce ,_cdgf );
|
|
if _fdgb !=nil {return nil ,_f .Wrap (_fdgb ,_fbag ,"");};return _ffaf ,nil ;};func TstGetScaledSymbol (t *_b .T ,sm *Bitmap ,scale ...int )*Bitmap {if len (scale )==0{return sm ;};if scale [0]==1{return sm ;};_cgadc ,_caea :=MorphSequence (sm ,MorphProcess {Operation :MopReplicativeBinaryExpansion ,Arguments :scale });
|
|
_a .NoError (t ,_caea );return _cgadc ;};func _ecdc (_acfa uint ,_bafg byte )byte {return _bafg >>_acfa <<_acfa };func _gbcbe (_gbac ,_gcgb *Bitmap ,_dacf ,_dbe ,_egfc ,_cfa ,_bagc int ,_eefb CombinationOperator )error {var _aff int ;_fgdb :=func (){_aff ++;
|
|
_egfc +=_gcgb .RowStride ;_cfa +=_gbac .RowStride ;_bagc +=_gbac .RowStride };for _aff =_dacf ;_aff < _dbe ;_fgdb (){_fddf :=_egfc ;for _bed :=_cfa ;_bed <=_bagc ;_bed ++{_addd ,_ebfa :=_gcgb .GetByte (_fddf );if _ebfa !=nil {return _ebfa ;};_dcg ,_ebfa :=_gbac .GetByte (_bed );
|
|
if _ebfa !=nil {return _ebfa ;};if _ebfa =_gcgb .SetByte (_fddf ,_begf (_addd ,_dcg ,_eefb ));_ebfa !=nil {return _ebfa ;};_fddf ++;};};return nil ;};var _ _cc .Interface =&ClassedPoints {};func (_fga *Bitmap )CountPixels ()int {return _fga .countPixels ()};
|
|
func _fca (_bde ,_ebcg ,_aebd *Bitmap )(*Bitmap ,error ){const _dcbf ="\u0073\u0075\u0062\u0074\u0072\u0061\u0063\u0074";if _ebcg ==nil {return nil ,_f .Error (_dcbf ,"'\u0073\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _aebd ==nil {return nil ,_f .Error (_dcbf ,"'\u0073\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
};var _bdcd error ;switch {case _bde ==_ebcg :if _bdcd =_bde .RasterOperation (0,0,_ebcg .Width ,_ebcg .Height ,PixNotSrcAndDst ,_aebd ,0,0);_bdcd !=nil {return nil ,_f .Wrap (_bdcd ,_dcbf ,"\u0064 \u003d\u003d\u0020\u0073\u0031");};case _bde ==_aebd :if _bdcd =_bde .RasterOperation (0,0,_ebcg .Width ,_ebcg .Height ,PixNotSrcAndDst ,_ebcg ,0,0);
|
|
_bdcd !=nil {return nil ,_f .Wrap (_bdcd ,_dcbf ,"\u0064 \u003d\u003d\u0020\u0073\u0032");};default:_bde ,_bdcd =_dgf (_bde ,_ebcg );if _bdcd !=nil {return nil ,_f .Wrap (_bdcd ,_dcbf ,"");};if _bdcd =_bde .RasterOperation (0,0,_ebcg .Width ,_ebcg .Height ,PixNotSrcAndDst ,_aebd ,0,0);
|
|
_bdcd !=nil {return nil ,_f .Wrap (_bdcd ,_dcbf ,"\u0064e\u0066\u0061\u0075\u006c\u0074");};};return _bde ,nil ;};func (_edb *Bitmaps )GetBitmap (i int )(*Bitmap ,error ){const _begg ="\u0047e\u0074\u0042\u0069\u0074\u006d\u0061p";if _edb ==nil {return nil ,_f .Error (_begg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
};if i > len (_edb .Values )-1{return nil ,_f .Errorf (_begg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _edb .Values [i ],nil ;};func (_bga *Bitmap )clearAll ()error {return _bga .RasterOperation (0,0,_bga .Width ,_bga .Height ,PixClr ,nil ,0,0);
|
|
};func _dgc ()(_aae []byte ){_aae =make ([]byte ,256);for _eaa :=0;_eaa < 256;_eaa ++{_daf :=byte (_eaa );_aae [_daf ]=(_daf &0x01)|((_daf &0x04)>>1)|((_daf &0x10)>>2)|((_daf &0x40)>>3)|((_daf &0x02)<<3)|((_daf &0x08)<<2)|((_daf &0x20)<<1)|(_daf &0x80);
|
|
};return _aae ;};func New (width ,height int )*Bitmap {_aabd :=_eed (width ,height );_aabd .Data =make ([]byte ,height *_aabd .RowStride );return _aabd ;};type Points []Point ;func _agac (_aabf ,_bcfg *Bitmap ,_ceef ,_ggag ,_dcfa uint ,_bgede ,_fef int ,_fbec bool ,_fafd ,_bgde int )error {for _fefc :=_bgede ;
|
|
_fefc < _fef ;_fefc ++{if _fafd +1< len (_aabf .Data ){_gfa :=_fefc +1==_fef ;_fegf ,_dedf :=_aabf .GetByte (_fafd );if _dedf !=nil {return _dedf ;};_fafd ++;_fegf <<=_ceef ;_dgg ,_dedf :=_aabf .GetByte (_fafd );if _dedf !=nil {return _dedf ;};_dgg >>=_ggag ;
|
|
_ggbe :=_fegf |_dgg ;if _gfa &&!_fbec {_ggbe =_ecdc (_dcfa ,_ggbe );};_dedf =_bcfg .SetByte (_bgde ,_ggbe );if _dedf !=nil {return _dedf ;};_bgde ++;if _gfa &&_fbec {_fbdc ,_acge :=_aabf .GetByte (_fafd );if _acge !=nil {return _acge ;};_fbdc <<=_ceef ;
|
|
_ggbe =_ecdc (_dcfa ,_fbdc );if _acge =_bcfg .SetByte (_bgde ,_ggbe );_acge !=nil {return _acge ;};};continue ;};_cfga ,_aedcf :=_aabf .GetByte (_fafd );if _aedcf !=nil {_ca .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",_fafd ,_aedcf );
|
|
return _aedcf ;};_cfga <<=_ceef ;_fafd ++;_aedcf =_bcfg .SetByte (_bgde ,_cfga );if _aedcf !=nil {return _aedcf ;};_bgde ++;};return nil ;};func (_ebcb *Bitmaps )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_caf *Bitmaps ,_abdb error ){const _geff ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0053\u0065\u006ce\u0063\u0074\u0042\u0079Si\u007a\u0065";
|
|
if _ebcb ==nil {return nil ,_f .Error (_geff ,"\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 ,_f .Errorf (_geff ,"\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 ,_f .Errorf (_geff ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",relation );
|
|
};_fcfa ,_abdb :=_ebcb .makeSizeIndicator (width ,height ,tp ,relation );if _abdb !=nil {return nil ,_f .Wrap (_abdb ,_geff ,"");};_caf ,_abdb =_ebcb .selectByIndicator (_fcfa );if _abdb !=nil {return nil ,_f .Wrap (_abdb ,_geff ,"");};return _caf ,nil ;
|
|
};func (_gfggc *Bitmap )GetPixel (x ,y int )bool {_gbaf :=_gfggc .GetByteIndex (x ,y );_geg :=_gfggc .GetBitOffset (x );_adf :=uint (7-_geg );if _gbaf > len (_gfggc .Data )-1{_ca .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 ,_gfggc );
|
|
return false ;};if (_gfggc .Data [_gbaf ]>>_adf )&0x01>=1{return true ;};return false ;};func _cbdb (_ega ,_gbb *Bitmap ,_fgd int ,_aaa []byte ,_fff int )(_ebf error ){const _baa ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0032";
|
|
var (_cbgf ,_gac ,_feg ,_bgdc ,_fbd ,_ccg ,_cde ,_fce int ;_ccgf ,_ecb ,_dad ,_bfb uint32 ;_bda ,_bag byte ;_bbb uint16 ;);_aag :=make ([]byte ,4);_gae :=make ([]byte ,4);for _feg =0;_feg < _ega .Height -1;_feg ,_bgdc =_feg +2,_bgdc +1{_cbgf =_feg *_ega .RowStride ;
|
|
_gac =_bgdc *_gbb .RowStride ;for _fbd ,_ccg =0,0;_fbd < _fff ;_fbd ,_ccg =_fbd +4,_ccg +1{for _cde =0;_cde < 4;_cde ++{_fce =_cbgf +_fbd +_cde ;if _fce <=len (_ega .Data )-1&&_fce < _cbgf +_ega .RowStride {_aag [_cde ]=_ega .Data [_fce ];}else {_aag [_cde ]=0x00;
|
|
};_fce =_cbgf +_ega .RowStride +_fbd +_cde ;if _fce <=len (_ega .Data )-1&&_fce < _cbgf +(2*_ega .RowStride ){_gae [_cde ]=_ega .Data [_fce ];}else {_gae [_cde ]=0x00;};};_ccgf =_abg .BigEndian .Uint32 (_aag );_ecb =_abg .BigEndian .Uint32 (_gae );_dad =_ccgf &_ecb ;
|
|
_dad |=_dad <<1;_bfb =_ccgf |_ecb ;_bfb &=_bfb <<1;_ecb =_dad |_bfb ;_ecb &=0xaaaaaaaa;_ccgf =_ecb |(_ecb <<7);_bda =byte (_ccgf >>24);_bag =byte ((_ccgf >>8)&0xff);_fce =_gac +_ccg ;if _fce +1==len (_gbb .Data )-1||_fce +1>=_gac +_gbb .RowStride {if _ebf =_gbb .SetByte (_fce ,_aaa [_bda ]);
|
|
_ebf !=nil {return _f .Wrapf (_ebf ,_baa ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_fce );};}else {_bbb =(uint16 (_aaa [_bda ])<<8)|uint16 (_aaa [_bag ]);if _ebf =_gbb .setTwoBytes (_fce ,_bbb );_ebf !=nil {return _f .Wrapf (_ebf ,_baa ,"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",_fce );
|
|
};_ccg ++;};};};return nil ;};type BoundaryCondition int ;type SizeSelection int ;type MorphProcess struct{Operation MorphOperation ;Arguments []int ;};const (_ SizeSelection =iota ;SizeSelectByWidth ;SizeSelectByHeight ;SizeSelectByMaxDimension ;SizeSelectByArea ;
|
|
SizeSelectByPerimeter ;);func DilateBrick (d ,s *Bitmap ,hSize ,vSize int )(*Bitmap ,error ){return _agcee (d ,s ,hSize ,vSize )};func (_gaeb *Bitmap )RemoveBorderGeneral (left ,right ,top ,bot int )(*Bitmap ,error ){return _gaeb .removeBorderGeneral (left ,right ,top ,bot );
|
|
};func (_fddfa Points )XSorter ()func (_gbba ,_gffb int )bool {return func (_eegfb ,_dbgc int )bool {return _fddfa [_eegfb ].X < _fddfa [_dbgc ].X };};func (_adecb *Bitmaps )String ()string {_bdfc :=_c .Builder {};for _ ,_aebg :=range _adecb .Values {_bdfc .WriteString (_aebg .String ());
|
|
_bdfc .WriteRune ('\n');};return _bdfc .String ();};func CorrelationScoreThresholded (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab ,downcount []int ,scoreThreshold float32 )(bool ,error ){const _gdbd ="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 ,_f .Error (_gdbd ,"\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 ,_f .Error (_gdbd ,"\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 ,_f .Error (_gdbd ,"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 ,_f .Error (_gdbd ,"\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 ,_f .Error (_gdbd ,"p\u0072\u006f\u0076\u0069de\u0064 \u006e\u0069\u006c\u0020\u0027s\u0075\u006d\u0074\u0061\u0062\u0027");
|
|
};_bgeded ,_ffg :=bm1 .Width ,bm1 .Height ;_adef ,_cfdg :=bm2 .Width ,bm2 .Height ;if _gb .Abs (_bgeded -_adef )> maxDiffW {return false ,nil ;};if _gb .Abs (_ffg -_cfdg )> maxDiffH {return false ,nil ;};_ddfe :=int (delX +_gb .Sign (delX )*0.5);_gadb :=int (delY +_gb .Sign (delY )*0.5);
|
|
_caaf :=int (_gg .Ceil (_gg .Sqrt (float64 (scoreThreshold )*float64 (area1 )*float64 (area2 ))));_cgfef :=bm2 .RowStride ;_ecef :=_dgfg (_gadb ,0);_bbge :=_aggf (_cfdg +_gadb ,_ffg );_cbec :=bm1 .RowStride *_ecef ;_cgb :=bm2 .RowStride *(_ecef -_gadb );
|
|
var _eefde int ;if _bbge <=_ffg {_eefde =downcount [_bbge -1];};_dabc :=_dgfg (_ddfe ,0);_cgee :=_aggf (_adef +_ddfe ,_bgeded );var _aagc ,_cdgb int ;if _ddfe >=8{_aagc =_ddfe >>3;_cbec +=_aagc ;_dabc -=_aagc <<3;_cgee -=_aagc <<3;_ddfe &=7;}else if _ddfe <=-8{_cdgb =-((_ddfe +7)>>3);
|
|
_cgb +=_cdgb ;_cgfef -=_cdgb ;_ddfe +=_cdgb <<3;};var (_ecab ,_eeda ,_gfca int ;_cebbd ,_fceg ,_dcad byte ;);if _dabc >=_cgee ||_ecef >=_bbge {return false ,nil ;};_baaed :=(_cgee +7)>>3;switch {case _ddfe ==0:for _eeda =_ecef ;_eeda < _bbge ;_eeda ,_cbec ,_cgb =_eeda +1,_cbec +bm1 .RowStride ,_cgb +bm2 .RowStride {for _gfca =0;
|
|
_gfca < _baaed ;_gfca ++{_cebbd =bm1 .Data [_cbec +_gfca ]&bm2 .Data [_cgb +_gfca ];_ecab +=tab [_cebbd ];};if _ecab >=_caaf {return true ,nil ;};if _abgfe :=_ecab +downcount [_eeda ]-_eefde ;_abgfe < _caaf {return false ,nil ;};};case _ddfe > 0&&_cgfef < _baaed :for _eeda =_ecef ;
|
|
_eeda < _bbge ;_eeda ,_cbec ,_cgb =_eeda +1,_cbec +bm1 .RowStride ,_cgb +bm2 .RowStride {_fceg =bm1 .Data [_cbec ];_dcad =bm2 .Data [_cgb ]>>uint (_ddfe );_cebbd =_fceg &_dcad ;_ecab +=tab [_cebbd ];for _gfca =1;_gfca < _cgfef ;_gfca ++{_fceg =bm1 .Data [_cbec +_gfca ];
|
|
_dcad =bm2 .Data [_cgb +_gfca ]>>uint (_ddfe )|bm2 .Data [_cgb +_gfca -1]<<uint (8-_ddfe );_cebbd =_fceg &_dcad ;_ecab +=tab [_cebbd ];};_fceg =bm1 .Data [_cbec +_gfca ];_dcad =bm2 .Data [_cgb +_gfca -1]<<uint (8-_ddfe );_cebbd =_fceg &_dcad ;_ecab +=tab [_cebbd ];
|
|
if _ecab >=_caaf {return true ,nil ;}else if _ecab +downcount [_eeda ]-_eefde < _caaf {return false ,nil ;};};case _ddfe > 0&&_cgfef >=_baaed :for _eeda =_ecef ;_eeda < _bbge ;_eeda ,_cbec ,_cgb =_eeda +1,_cbec +bm1 .RowStride ,_cgb +bm2 .RowStride {_fceg =bm1 .Data [_cbec ];
|
|
_dcad =bm2 .Data [_cgb ]>>uint (_ddfe );_cebbd =_fceg &_dcad ;_ecab +=tab [_cebbd ];for _gfca =1;_gfca < _baaed ;_gfca ++{_fceg =bm1 .Data [_cbec +_gfca ];_dcad =bm2 .Data [_cgb +_gfca ]>>uint (_ddfe );_dcad |=bm2 .Data [_cgb +_gfca -1]<<uint (8-_ddfe );
|
|
_cebbd =_fceg &_dcad ;_ecab +=tab [_cebbd ];};if _ecab >=_caaf {return true ,nil ;}else if _ecab +downcount [_eeda ]-_eefde < _caaf {return false ,nil ;};};case _baaed < _cgfef :for _eeda =_ecef ;_eeda < _bbge ;_eeda ,_cbec ,_cgb =_eeda +1,_cbec +bm1 .RowStride ,_cgb +bm2 .RowStride {for _gfca =0;
|
|
_gfca < _baaed ;_gfca ++{_fceg =bm1 .Data [_cbec +_gfca ];_dcad =bm2 .Data [_cgb +_gfca ]<<uint (-_ddfe );_dcad |=bm2 .Data [_cgb +_gfca +1]>>uint (8+_ddfe );_cebbd =_fceg &_dcad ;_ecab +=tab [_cebbd ];};if _ecab >=_caaf {return true ,nil ;}else if _geag :=_ecab +downcount [_eeda ]-_eefde ;
|
|
_geag < _caaf {return false ,nil ;};};case _cgfef >=_baaed :for _eeda =_ecef ;_eeda < _bbge ;_eeda ,_cbec ,_cgb =_eeda +1,_cbec +bm1 .RowStride ,_cgb +bm2 .RowStride {for _gfca =0;_gfca < _baaed ;_gfca ++{_fceg =bm1 .Data [_cbec +_gfca ];_dcad =bm2 .Data [_cgb +_gfca ]<<uint (-_ddfe );
|
|
_dcad |=bm2 .Data [_cgb +_gfca +1]>>uint (8+_ddfe );_cebbd =_fceg &_dcad ;_ecab +=tab [_cebbd ];};_fceg =bm1 .Data [_cbec +_gfca ];_dcad =bm2 .Data [_cgb +_gfca ]<<uint (-_ddfe );_cebbd =_fceg &_dcad ;_ecab +=tab [_cebbd ];if _ecab >=_caaf {return true ,nil ;
|
|
}else if _ecab +downcount [_eeda ]-_eefde < _caaf {return false ,nil ;};};};_daaf :=float32 (_ecab )*float32 (_ecab )/(float32 (area1 )*float32 (area2 ));if _daaf >=scoreThreshold {_ca .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",_ecab ,_caaf ,_daaf ,scoreThreshold );
|
|
};return false ,nil ;};func (_dgec *Bitmap )resizeImageData (_fac *Bitmap )error {if _fac ==nil {return _f .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 _dgec .SizesEqual (_fac ){return nil ;};_dgec .Data =make ([]byte ,len (_fac .Data ));_dgec .Width =_fac .Width ;_dgec .Height =_fac .Height ;_dgec .RowStride =_fac .RowStride ;return nil ;};func _daafb (_gdad *Bitmap ,_begfa ,_bead int ,_dfae ,_caba int ,_gfgca RasterOperator ,_aafa *Bitmap ,_agdg ,_bedbb int )error {var _gebf ,_gbbe ,_cfbac ,_fbbb int ;
|
|
if _begfa < 0{_agdg -=_begfa ;_dfae +=_begfa ;_begfa =0;};if _agdg < 0{_begfa -=_agdg ;_dfae +=_agdg ;_agdg =0;};_gebf =_begfa +_dfae -_gdad .Width ;if _gebf > 0{_dfae -=_gebf ;};_gbbe =_agdg +_dfae -_aafa .Width ;if _gbbe > 0{_dfae -=_gbbe ;};if _bead < 0{_bedbb -=_bead ;
|
|
_caba +=_bead ;_bead =0;};if _bedbb < 0{_bead -=_bedbb ;_caba +=_bedbb ;_bedbb =0;};_cfbac =_bead +_caba -_gdad .Height ;if _cfbac > 0{_caba -=_cfbac ;};_fbbb =_bedbb +_caba -_aafa .Height ;if _fbbb > 0{_caba -=_fbbb ;};if _dfae <=0||_caba <=0{return nil ;
|
|
};var _cddd error ;switch {case _begfa &7==0&&_agdg &7==0:_cddd =_cfdaa (_gdad ,_begfa ,_bead ,_dfae ,_caba ,_gfgca ,_aafa ,_agdg ,_bedbb );case _begfa &7==_agdg &7:_cddd =_gfece (_gdad ,_begfa ,_bead ,_dfae ,_caba ,_gfgca ,_aafa ,_agdg ,_bedbb );default:_cddd =_fafba (_gdad ,_begfa ,_bead ,_dfae ,_caba ,_gfgca ,_aafa ,_agdg ,_bedbb );
|
|
};if _cddd !=nil {return _f .Wrap (_cddd ,"r\u0061\u0073\u0074\u0065\u0072\u004f\u0070\u004c\u006f\u0077","");};return nil ;};func (_dage *Bitmaps )GroupByHeight ()(*BitmapsArray ,error ){const _bcce ="\u0047\u0072\u006f\u0075\u0070\u0042\u0079\u0048\u0065\u0069\u0067\u0068\u0074";
|
|
if len (_dage .Values )==0{return nil ,_f .Error (_bcce ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_cdab :=&BitmapsArray {};_dage .SortByHeight ();_agfaa :=-1;_gbee :=-1;for _eaeg :=0;_eaeg < len (_dage .Values );
|
|
_eaeg ++{_bfcg :=_dage .Values [_eaeg ].Height ;if _bfcg > _agfaa {_agfaa =_bfcg ;_gbee ++;_cdab .Values =append (_cdab .Values ,&Bitmaps {});};_cdab .Values [_gbee ].AddBitmap (_dage .Values [_eaeg ]);};return _cdab ,nil ;};func (_fged *Bitmap )centroid (_cddb ,_badc []int )(Point ,error ){_cgac :=Point {};
|
|
_fged .setPadBits (0);if len (_cddb )==0{_cddb =_cfda ();};if len (_badc )==0{_badc =_ddc ();};var _cbafd ,_cgd ,_aec ,_eefbg ,_ffcc ,_eeeg int ;var _gdae byte ;for _ffcc =0;_ffcc < _fged .Height ;_ffcc ++{_abfc :=_fged .RowStride *_ffcc ;_eefbg =0;for _eeeg =0;
|
|
_eeeg < _fged .RowStride ;_eeeg ++{_gdae =_fged .Data [_abfc +_eeeg ];if _gdae !=0{_eefbg +=_badc [_gdae ];_cbafd +=_cddb [_gdae ]+_eeeg *8*_badc [_gdae ];};};_aec +=_eefbg ;_cgd +=_eefbg *_ffcc ;};if _aec !=0{_cgac .X =float32 (_cbafd )/float32 (_aec );
|
|
_cgac .Y =float32 (_cgd )/float32 (_aec );};return _cgac ,nil ;};func _dada (_bgfe ,_bdab *Bitmap ,_fecd ,_gbaa ,_becc ,_afdg ,_agab ,_ecf ,_eaac ,_bae int ,_eegf CombinationOperator ,_deg int )error {var _dedc int ;_dafa :=func (){_dedc ++;_becc +=_bdab .RowStride ;
|
|
_afdg +=_bgfe .RowStride ;_agab +=_bgfe .RowStride };for _dedc =_fecd ;_dedc < _gbaa ;_dafa (){var _gad uint16 ;_cbdd :=_becc ;for _adba :=_afdg ;_adba <=_agab ;_adba ++{_bbbc ,_acba :=_bdab .GetByte (_cbdd );if _acba !=nil {return _acba ;};_bcfd ,_acba :=_bgfe .GetByte (_adba );
|
|
if _acba !=nil {return _acba ;};_gad =(_gad |(uint16 (_bcfd )&0xff))<<uint (_bae );_bcfd =byte (_gad >>8);if _acba =_bdab .SetByte (_cbdd ,_begf (_bbbc ,_bcfd ,_eegf ));_acba !=nil {return _acba ;};_cbdd ++;_gad <<=uint (_eaac );if _adba ==_agab {_bcfd =byte (_gad >>(8-uint8 (_bae )));
|
|
if _deg !=0{_bcfd =_ecdc (uint (8+_ecf ),_bcfd );};_bbbc ,_acba =_bdab .GetByte (_cbdd );if _acba !=nil {return _acba ;};if _acba =_bdab .SetByte (_cbdd ,_begf (_bbbc ,_bcfd ,_eegf ));_acba !=nil {return _acba ;};};};};return nil ;};func _egeae (_afbc *Bitmap ,_egbga ,_ecec int ,_fadc ,_bgbg int ,_debf RasterOperator ){var (_fdgaa int ;
|
|
_bfbed byte ;_bcg ,_geaeg int ;_bdgf int ;);_ggad :=_fadc >>3;_abbc :=_fadc &7;if _abbc > 0{_bfbed =_afcbe [_abbc ];};_fdgaa =_afbc .RowStride *_ecec +(_egbga >>3);switch _debf {case PixClr :for _bcg =0;_bcg < _bgbg ;_bcg ++{_bdgf =_fdgaa +_bcg *_afbc .RowStride ;
|
|
for _geaeg =0;_geaeg < _ggad ;_geaeg ++{_afbc .Data [_bdgf ]=0x0;_bdgf ++;};if _abbc > 0{_afbc .Data [_bdgf ]=_beabb (_afbc .Data [_bdgf ],0x0,_bfbed );};};case PixSet :for _bcg =0;_bcg < _bgbg ;_bcg ++{_bdgf =_fdgaa +_bcg *_afbc .RowStride ;for _geaeg =0;
|
|
_geaeg < _ggad ;_geaeg ++{_afbc .Data [_bdgf ]=0xff;_bdgf ++;};if _abbc > 0{_afbc .Data [_bdgf ]=_beabb (_afbc .Data [_bdgf ],0xff,_bfbed );};};case PixNotDst :for _bcg =0;_bcg < _bgbg ;_bcg ++{_bdgf =_fdgaa +_bcg *_afbc .RowStride ;for _geaeg =0;_geaeg < _ggad ;
|
|
_geaeg ++{_afbc .Data [_bdgf ]=^_afbc .Data [_bdgf ];_bdgf ++;};if _abbc > 0{_afbc .Data [_bdgf ]=_beabb (_afbc .Data [_bdgf ],^_afbc .Data [_bdgf ],_bfbed );};};};};func TstISymbol (t *_b .T ,scale ...int )*Bitmap {_cddba ,_ccga :=NewWithData (1,5,[]byte {0x80,0x80,0x80,0x80,0x80});
|
|
_a .NoError (t ,_ccga );return TstGetScaledSymbol (t ,_cddba ,scale ...);};func TstFrameBitmap ()*Bitmap {return _facgf .Copy ()};func (_cceb *ClassedPoints )SortByX (){_cceb ._fdfc =_cceb .xSortFunction ();_cc .Sort (_cceb )};func (_cfec *Boxes )makeSizeIndicator (_gaea ,_gdcb int ,_acfb LocationFilter ,_cbdf SizeComparison )*_gb .NumSlice {_bfdg :=&_gb .NumSlice {};
|
|
var _edcec ,_adgc ,_edde int ;for _ ,_bef :=range *_cfec {_edcec =0;_adgc ,_edde =_bef .Dx (),_bef .Dy ();switch _acfb {case LocSelectWidth :if (_cbdf ==SizeSelectIfLT &&_adgc < _gaea )||(_cbdf ==SizeSelectIfGT &&_adgc > _gaea )||(_cbdf ==SizeSelectIfLTE &&_adgc <=_gaea )||(_cbdf ==SizeSelectIfGTE &&_adgc >=_gaea ){_edcec =1;
|
|
};case LocSelectHeight :if (_cbdf ==SizeSelectIfLT &&_edde < _gdcb )||(_cbdf ==SizeSelectIfGT &&_edde > _gdcb )||(_cbdf ==SizeSelectIfLTE &&_edde <=_gdcb )||(_cbdf ==SizeSelectIfGTE &&_edde >=_gdcb ){_edcec =1;};case LocSelectIfEither :if (_cbdf ==SizeSelectIfLT &&(_edde < _gdcb ||_adgc < _gaea ))||(_cbdf ==SizeSelectIfGT &&(_edde > _gdcb ||_adgc > _gaea ))||(_cbdf ==SizeSelectIfLTE &&(_edde <=_gdcb ||_adgc <=_gaea ))||(_cbdf ==SizeSelectIfGTE &&(_edde >=_gdcb ||_adgc >=_gaea )){_edcec =1;
|
|
};case LocSelectIfBoth :if (_cbdf ==SizeSelectIfLT &&(_edde < _gdcb &&_adgc < _gaea ))||(_cbdf ==SizeSelectIfGT &&(_edde > _gdcb &&_adgc > _gaea ))||(_cbdf ==SizeSelectIfLTE &&(_edde <=_gdcb &&_adgc <=_gaea ))||(_cbdf ==SizeSelectIfGTE &&(_edde >=_gdcb &&_adgc >=_gaea )){_edcec =1;
|
|
};};_bfdg .AddInt (_edcec );};return _bfdg ;};func (_fad *Bitmap )Zero ()bool {_ffed :=_fad .Width /8;_aaff :=_fad .Width &7;var _eaae byte ;if _aaff !=0{_eaae =byte (0xff<<uint (8-_aaff ));};var _geae ,_cec ,_abcf int ;for _cec =0;_cec < _fad .Height ;
|
|
_cec ++{_geae =_fad .RowStride *_cec ;for _abcf =0;_abcf < _ffed ;_abcf ,_geae =_abcf +1,_geae +1{if _fad .Data [_geae ]!=0{return false ;};};if _aaff > 0{if _fad .Data [_geae ]&_eaae !=0{return false ;};};};return true ;};func _dgfg (_dcdb ,_gdfc int )int {if _dcdb > _gdfc {return _dcdb ;
|
|
};return _gdfc ;};func _acca (_bce ,_fefe *Bitmap ,_fbbc *Selection )(*Bitmap ,error ){const _deac ="\u0065\u0072\u006fd\u0065";var (_egbg error ;_fgda *Bitmap ;);_bce ,_egbg =_dedfd (_bce ,_fefe ,_fbbc ,&_fgda );if _egbg !=nil {return nil ,_f .Wrap (_egbg ,_deac ,"");
|
|
};if _egbg =_bce .setAll ();_egbg !=nil {return nil ,_f .Wrap (_egbg ,_deac ,"");};var _acec SelectionValue ;for _bgb :=0;_bgb < _fbbc .Height ;_bgb ++{for _gbfe :=0;_gbfe < _fbbc .Width ;_gbfe ++{_acec =_fbbc .Data [_bgb ][_gbfe ];if _acec ==SelHit {_egbg =_bbec (_bce ,_fbbc .Cx -_gbfe ,_fbbc .Cy -_bgb ,_fefe .Width ,_fefe .Height ,PixSrcAndDst ,_fgda ,0,0);
|
|
if _egbg !=nil {return nil ,_f .Wrap (_egbg ,_deac ,"");};};};};if MorphBC ==SymmetricMorphBC {return _bce ,nil ;};_dedd ,_bbab ,_afga ,_bfgc :=_fbbc .findMaxTranslations ();if _dedd > 0{if _egbg =_bce .RasterOperation (0,0,_dedd ,_fefe .Height ,PixClr ,nil ,0,0);
|
|
_egbg !=nil {return nil ,_f .Wrap (_egbg ,_deac ,"\u0078\u0070\u0020\u003e\u0020\u0030");};};if _afga > 0{if _egbg =_bce .RasterOperation (_fefe .Width -_afga ,0,_afga ,_fefe .Height ,PixClr ,nil ,0,0);_egbg !=nil {return nil ,_f .Wrap (_egbg ,_deac ,"\u0078\u006e\u0020\u003e\u0020\u0030");
|
|
};};if _bbab > 0{if _egbg =_bce .RasterOperation (0,0,_fefe .Width ,_bbab ,PixClr ,nil ,0,0);_egbg !=nil {return nil ,_f .Wrap (_egbg ,_deac ,"\u0079\u0070\u0020\u003e\u0020\u0030");};};if _bfgc > 0{if _egbg =_bce .RasterOperation (0,_fefe .Height -_bfgc ,_fefe .Width ,_bfgc ,PixClr ,nil ,0,0);
|
|
_egbg !=nil {return nil ,_f .Wrap (_egbg ,_deac ,"\u0079\u006e\u0020\u003e\u0020\u0030");};};return _bce ,nil ;};func (_gdd *Bitmap )GetBitOffset (x int )int {return x &0x07};func (_eegcd *Boxes )selectWithIndicator (_bged *_gb .NumSlice )(_dcdc *Boxes ,_bade error ){const _bbbce ="\u0042o\u0078\u0065\u0073\u002es\u0065\u006c\u0065\u0063\u0074W\u0069t\u0068I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _eegcd ==nil {return nil ,_f .Error (_bbbce ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if _bged ==nil {return nil ,_f .Error (_bbbce ,"\u0027\u006ea\u0027\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if len (*_bged )!=len (*_eegcd ){return nil ,_f .Error (_bbbce ,"\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 _gcaf ,_ceeg int ;for _ebd :=0;_ebd < len (*_bged );_ebd ++{if _gcaf ,_bade =_bged .GetInt (_ebd );_bade !=nil {return nil ,_f .Wrap (_bade ,_bbbce ,"\u0063\u0068\u0065\u0063\u006b\u0069\u006e\u0067\u0020c\u006f\u0075\u006e\u0074");};if _gcaf ==1{_ceeg ++;
|
|
};};if _ceeg ==len (*_eegcd ){return _eegcd ,nil ;};_bfgdb :=Boxes {};for _dgaa :=0;_dgaa < len (*_bged );_dgaa ++{_gcaf =int ((*_bged )[_dgaa ]);if _gcaf ==0{continue ;};_bfgdb =append (_bfgdb ,(*_eegcd )[_dgaa ]);};_dcdc =&_bfgdb ;return _dcdc ,nil ;
|
|
};func TstOSymbol (t *_b .T ,scale ...int )*Bitmap {_fffda ,_gcda :=NewWithData (4,5,[]byte {0xF0,0x90,0x90,0x90,0xF0});_a .NoError (t ,_gcda );return TstGetScaledSymbol (t ,_fffda ,scale ...);};func (_fegc *Bitmaps )SelectByIndexes (idx []int )(*Bitmaps ,error ){const _caac ="B\u0069\u0074\u006d\u0061\u0070\u0073.\u0053\u006f\u0072\u0074\u0049\u006e\u0064\u0065\u0078e\u0073\u0042\u0079H\u0065i\u0067\u0068\u0074";
|
|
_acdf ,_fbbca :=_fegc .selectByIndexes (idx );if _fbbca !=nil {return nil ,_f .Wrap (_fbbca ,_caac ,"");};return _acdf ,nil ;};const (_ SizeComparison =iota ;SizeSelectIfLT ;SizeSelectIfGT ;SizeSelectIfLTE ;SizeSelectIfGTE ;SizeSelectIfEQ ;);func (_aaac *Bitmaps )selectByIndicator (_dafdg *_gb .NumSlice )(_bgfa *Bitmaps ,_ffabg error ){const _degba ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u0073\u0065\u006c\u0065c\u0074B\u0079I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _aaac ==nil {return nil ,_f .Error (_degba ,"\u0027\u0062\u0027 b\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _dafdg ==nil {return nil ,_f .Error (_degba ,"'\u006e\u0061\u0027\u0020\u0069\u006ed\u0069\u0063\u0061\u0074\u006f\u0072\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
};if len (_aaac .Values )==0{return _aaac ,nil ;};if len (*_dafdg )!=len (_aaac .Values ){return nil ,_f .Errorf (_degba ,"\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 (*_dafdg ),len (_aaac .Values ));
|
|
};var _feag ,_bebgb ,_cccd int ;for _bebgb =0;_bebgb < len (*_dafdg );_bebgb ++{if _feag ,_ffabg =_dafdg .GetInt (_bebgb );_ffabg !=nil {return nil ,_f .Wrap (_ffabg ,_degba ,"f\u0069\u0072\u0073\u0074\u0020\u0063\u0068\u0065\u0063\u006b");};if _feag ==1{_cccd ++;
|
|
};};if _cccd ==len (_aaac .Values ){return _aaac ,nil ;};_bgfa =&Bitmaps {};_eeceg :=len (_aaac .Values )==len (_aaac .Boxes );for _bebgb =0;_bebgb < len (*_dafdg );_bebgb ++{if _feag =int ((*_dafdg )[_bebgb ]);_feag ==0{continue ;};_bgfa .Values =append (_bgfa .Values ,_aaac .Values [_bebgb ]);
|
|
if _eeceg {_bgfa .Boxes =append (_bgfa .Boxes ,_aaac .Boxes [_bebgb ]);};};return _bgfa ,nil ;};type fillSegment struct{_egca int ;_efbba int ;_deba int ;_bfabf int ;};func _adbcb (_gacgf *Bitmap ,_eagee int )(*Bitmap ,error ){const _cggd ="\u0065x\u0070a\u006e\u0064\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0065";
|
|
if _gacgf ==nil {return nil ,_f .Error (_cggd ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _eagee <=0{return nil ,_f .Error (_cggd ,"i\u006e\u0076\u0061\u006cid\u0020f\u0061\u0063\u0074\u006f\u0072 \u002d\u0020\u003c\u003d\u0020\u0030");
|
|
};if _eagee ==1{_acfdg ,_abdg :=_dgf (nil ,_gacgf );if _abdg !=nil {return nil ,_f .Wrap (_abdg ,_cggd ,"\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u003d\u0020\u0031");};return _acfdg ,nil ;};_dbbd ,_cffc :=_gee (_gacgf ,_eagee ,_eagee );if _cffc !=nil {return nil ,_f .Wrap (_cffc ,_cggd ,"");
|
|
};return _dbbd ,nil ;};func (_gdga *Selection )findMaxTranslations ()(_gaeeb ,_fdac ,_dda ,_bacf int ){for _bccbf :=0;_bccbf < _gdga .Height ;_bccbf ++{for _defaf :=0;_defaf < _gdga .Width ;_defaf ++{if _gdga .Data [_bccbf ][_defaf ]==SelHit {_gaeeb =_dgfg (_gaeeb ,_gdga .Cx -_defaf );
|
|
_fdac =_dgfg (_fdac ,_gdga .Cy -_bccbf );_dda =_dgfg (_dda ,_defaf -_gdga .Cx );_bacf =_dgfg (_bacf ,_bccbf -_gdga .Cy );};};};return _gaeeb ,_fdac ,_dda ,_bacf ;};func _aege (_cfbgd *Bitmap ,_dagff ...MorphProcess )(_ddce *Bitmap ,_acdb error ){const _dddf ="\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065";
|
|
if _cfbgd ==nil {return nil ,_f .Error (_dddf ,"\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 (_dagff )==0{return nil ,_f .Error (_dddf ,"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 _acdb =_bcee (_dagff ...);
|
|
_acdb !=nil {return nil ,_f .Wrap (_acdb ,_dddf ,"");};var _gged ,_bggfb ,_eeaa int ;_ddce =_cfbgd .Copy ();for _ ,_ebee :=range _dagff {switch _ebee .Operation {case MopDilation :_gged ,_bggfb =_ebee .getWidthHeight ();_ddce ,_acdb =DilateBrick (nil ,_ddce ,_gged ,_bggfb );
|
|
if _acdb !=nil {return nil ,_f .Wrap (_acdb ,_dddf ,"");};case MopErosion :_gged ,_bggfb =_ebee .getWidthHeight ();_ddce ,_acdb =_dgb (nil ,_ddce ,_gged ,_bggfb );if _acdb !=nil {return nil ,_f .Wrap (_acdb ,_dddf ,"");};case MopOpening :_gged ,_bggfb =_ebee .getWidthHeight ();
|
|
_ddce ,_acdb =_ceba (nil ,_ddce ,_gged ,_bggfb );if _acdb !=nil {return nil ,_f .Wrap (_acdb ,_dddf ,"");};case MopClosing :_gged ,_bggfb =_ebee .getWidthHeight ();_ddce ,_acdb =_feaa (nil ,_ddce ,_gged ,_bggfb );if _acdb !=nil {return nil ,_f .Wrap (_acdb ,_dddf ,"");
|
|
};case MopRankBinaryReduction :_ddce ,_acdb =_aeb (_ddce ,_ebee .Arguments ...);if _acdb !=nil {return nil ,_f .Wrap (_acdb ,_dddf ,"");};case MopReplicativeBinaryExpansion :_ddce ,_acdb =_adbcb (_ddce ,_ebee .Arguments [0]);if _acdb !=nil {return nil ,_f .Wrap (_acdb ,_dddf ,"");
|
|
};case MopAddBorder :_eeaa =_ebee .Arguments [0];_ddce ,_acdb =_ddce .AddBorder (_eeaa ,0);if _acdb !=nil {return nil ,_f .Wrap (_acdb ,_dddf ,"");};default:return nil ,_f .Error (_dddf ,"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 _eeaa > 0{_ddce ,_acdb =_ddce .RemoveBorder (_eeaa );if _acdb !=nil {return nil ,_f .Wrap (_acdb ,_dddf ,"\u0062\u006f\u0072\u0064\u0065\u0072\u0020\u003e\u0020\u0030");};};return _ddce ,nil ;};func _bece (_cdee *Bitmap ,_cggc *Bitmap ,_gbce *Selection )(*Bitmap ,error ){var (_geef *Bitmap ;
|
|
_adec error ;);_cdee ,_adec =_dedfd (_cdee ,_cggc ,_gbce ,&_geef );if _adec !=nil {return nil ,_adec ;};if _adec =_cdee .clearAll ();_adec !=nil {return nil ,_adec ;};var _bdaa SelectionValue ;for _bcdf :=0;_bcdf < _gbce .Height ;_bcdf ++{for _dcc :=0;
|
|
_dcc < _gbce .Width ;_dcc ++{_bdaa =_gbce .Data [_bcdf ][_dcc ];if _bdaa ==SelHit {if _adec =_cdee .RasterOperation (_dcc -_gbce .Cx ,_bcdf -_gbce .Cy ,_cggc .Width ,_cggc .Height ,PixSrcOrDst ,_geef ,0,0);_adec !=nil {return nil ,_adec ;};};};};return _cdee ,nil ;
|
|
};const (Vanilla Color =iota ;Chocolate ;);func _eefdb (_aabed *Bitmap ,_gbbcef *_gb .Stack ,_fffed ,_bafc ,_fgcg int )(_dfcb *_be .Rectangle ,_cbfg error ){const _cdbg ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _aabed ==nil {return nil ,_f .Error (_cdbg ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _gbbcef ==nil {return nil ,_f .Error (_cdbg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};switch _fgcg {case 4:if _dfcb ,_cbfg =_agae (_aabed ,_gbbcef ,_fffed ,_bafc );_cbfg !=nil {return nil ,_f .Wrap (_cbfg ,_cdbg ,"");};return _dfcb ,nil ;case 8:if _dfcb ,_cbfg =_dbad (_aabed ,_gbbcef ,_fffed ,_bafc );_cbfg !=nil {return nil ,_f .Wrap (_cbfg ,_cdbg ,"");
|
|
};return _dfcb ,nil ;default:return nil ,_f .Errorf (_cdbg ,"\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",_fgcg );
|
|
};};func _ccbb (_aaf ,_abgaf *Bitmap ,_adaf int ,_beeb []byte ,_faf int )(_dag error ){const _efe ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0031";var (_eef ,_dfg ,_af ,_cbbd ,_fbc ,_bgg ,_gea ,_ageb int ;
|
|
_cbe ,_ded uint32 ;_cfe ,_def byte ;_gccg uint16 ;);_bfa :=make ([]byte ,4);_ggd :=make ([]byte ,4);for _af =0;_af < _aaf .Height -1;_af ,_cbbd =_af +2,_cbbd +1{_eef =_af *_aaf .RowStride ;_dfg =_cbbd *_abgaf .RowStride ;for _fbc ,_bgg =0,0;_fbc < _faf ;
|
|
_fbc ,_bgg =_fbc +4,_bgg +1{for _gea =0;_gea < 4;_gea ++{_ageb =_eef +_fbc +_gea ;if _ageb <=len (_aaf .Data )-1&&_ageb < _eef +_aaf .RowStride {_bfa [_gea ]=_aaf .Data [_ageb ];}else {_bfa [_gea ]=0x00;};_ageb =_eef +_aaf .RowStride +_fbc +_gea ;if _ageb <=len (_aaf .Data )-1&&_ageb < _eef +(2*_aaf .RowStride ){_ggd [_gea ]=_aaf .Data [_ageb ];
|
|
}else {_ggd [_gea ]=0x00;};};_cbe =_abg .BigEndian .Uint32 (_bfa );_ded =_abg .BigEndian .Uint32 (_ggd );_ded |=_cbe ;_ded |=_ded <<1;_ded &=0xaaaaaaaa;_cbe =_ded |(_ded <<7);_cfe =byte (_cbe >>24);_def =byte ((_cbe >>8)&0xff);_ageb =_dfg +_bgg ;if _ageb +1==len (_abgaf .Data )-1||_ageb +1>=_dfg +_abgaf .RowStride {_abgaf .Data [_ageb ]=_beeb [_cfe ];
|
|
}else {_gccg =(uint16 (_beeb [_cfe ])<<8)|uint16 (_beeb [_def ]);if _dag =_abgaf .setTwoBytes (_ageb ,_gccg );_dag !=nil {return _f .Wrapf (_dag ,_efe ,"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",_ageb );
|
|
};_bgg ++;};};};return nil ;};func (_daec *ClassedPoints )GroupByY ()([]*ClassedPoints ,error ){const _beaga ="\u0043\u006c\u0061\u0073se\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0072\u006f\u0075\u0070\u0042y\u0059";if _cadg :=_daec .validateIntSlice ();
|
|
_cadg !=nil {return nil ,_f .Wrap (_cadg ,_beaga ,"");};if _daec .IntSlice .Size ()==0{return nil ,_f .Error (_beaga ,"\u004e\u006f\u0020\u0063la\u0073\u0073\u0065\u0073\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");};_daec .SortByY ();var (_bcbd []*ClassedPoints ;
|
|
_bbfe int ;);_geefd :=-1;var _ccba *ClassedPoints ;for _eaf :=0;_eaf < len (_daec .IntSlice );_eaf ++{_bbfe =int (_daec .YAtIndex (_eaf ));if _bbfe !=_geefd {_ccba =&ClassedPoints {Points :_daec .Points };_geefd =_bbfe ;_bcbd =append (_bcbd ,_ccba );};
|
|
_ccba .IntSlice =append (_ccba .IntSlice ,_daec .IntSlice [_eaf ]);};for _ ,_ddeg :=range _bcbd {_ddeg .SortByX ();};return _bcbd ,nil ;};const (AsymmetricMorphBC BoundaryCondition =iota ;SymmetricMorphBC ;);func (_gdgf *ClassedPoints )YAtIndex (i int )float32 {return (*_gdgf .Points )[_gdgf .IntSlice [i ]].Y };
|
|
type Getter interface{GetBitmap ()*Bitmap ;};type MorphOperation int ;func _ffgf (_fdab ,_aadf ,_gegg *Bitmap ,_cgaf int )(*Bitmap ,error ){const _gcee ="\u0073\u0065\u0065\u0064\u0046\u0069\u006c\u006c\u0042i\u006e\u0061\u0072\u0079";if _aadf ==nil {return nil ,_f .Error (_gcee ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
};if _gegg ==nil {return nil ,_f .Error (_gcee ,"'\u006da\u0073\u006b\u0027\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _cgaf !=4&&_cgaf !=8{return nil ,_f .Error (_gcee ,"\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 _dgcg error ;_fdab ,_dgcg =_dgf (_fdab ,_aadf );if _dgcg !=nil {return nil ,_f .Wrap (_dgcg ,_gcee ,"\u0063o\u0070y\u0020\u0073\u006f\u0075\u0072c\u0065\u0020t\u006f\u0020\u0027\u0064\u0027");};_bcae :=_aadf .createTemplate ();_gegg .setPadBits (0);
|
|
for _abedb :=0;_abedb < _bceb ;_abedb ++{_bcae ,_dgcg =_dgf (_bcae ,_fdab );if _dgcg !=nil {return nil ,_f .Wrapf (_dgcg ,_gcee ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_abedb );};if _dgcg =_ceg (_fdab ,_gegg ,_cgaf );
|
|
_dgcg !=nil {return nil ,_f .Wrapf (_dgcg ,_gcee ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_abedb );};if _bcae .Equals (_fdab ){break ;};};return _fdab ,nil ;};func (_begb *byWidth )Less (i ,j int )bool {return _begb .Values [i ].Width < _begb .Values [j ].Width };
|
|
func (_ggfa *ClassedPoints )Less (i ,j int )bool {return _ggfa ._fdfc (i ,j )};func (_gbec *ClassedPoints )GetIntYByClass (i int )(int ,error ){const _edga ="\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 >=_gbec .IntSlice .Size (){return 0,_f .Errorf (_edga ,"\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 (_gbec .YAtIndex (i )),nil ;};var _ffb [256]uint8 ;func (_bbe *Bitmap )CreateTemplate ()*Bitmap {return _bbe .createTemplate ()};func _ceba (_gcec ,_aade *Bitmap ,_fedcg ,_geea int )(*Bitmap ,error ){const _eabb ="\u006fp\u0065\u006e\u0042\u0072\u0069\u0063k";
|
|
if _aade ==nil {return nil ,_f .Error (_eabb ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _fedcg < 1&&_geea < 1{return nil ,_f .Error (_eabb ,"\u0068\u0053\u0069\u007ae \u003c\u0020\u0031\u0020\u0026\u0026\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u003c \u0031");
|
|
};if _fedcg ==1&&_geea ==1{return _aade .Copy (),nil ;};if _fedcg ==1||_geea ==1{var _egfb error ;_afaf :=SelCreateBrick (_geea ,_fedcg ,_geea /2,_fedcg /2,SelHit );_gcec ,_egfb =_baca (_gcec ,_aade ,_afaf );if _egfb !=nil {return nil ,_f .Wrap (_egfb ,_eabb ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _gcec ,nil ;};_deddc :=SelCreateBrick (1,_fedcg ,0,_fedcg /2,SelHit );_dfeag :=SelCreateBrick (_geea ,1,_geea /2,0,SelHit );_cbcf ,_baad :=_acca (nil ,_aade ,_deddc );if _baad !=nil {return nil ,_f .Wrap (_baad ,_eabb ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_gcec ,_baad =_acca (_gcec ,_cbcf ,_dfeag );if _baad !=nil {return nil ,_f .Wrap (_baad ,_eabb ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};_ ,_baad =_bece (_cbcf ,_gcec ,_deddc );if _baad !=nil {return nil ,_f .Wrap (_baad ,_eabb ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_ ,_baad =_bece (_gcec ,_cbcf ,_dfeag );if _baad !=nil {return nil ,_f .Wrap (_baad ,_eabb ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _gcec ,nil ;};func (_dbcb Points )YSorter ()func (_badeg ,_egbd int )bool {return func (_ceab ,_abeda int )bool {return _dbcb [_ceab ].Y < _dbcb [_abeda ].Y };
|
|
};func _facg (_bdac ,_gacf *Bitmap ,_ccgb ,_bege int )(_bede error ){const _ddde ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0038";var (_bccb ,_dbdea ,_deed ,_eddb int ;_fgcd ,_ccde ,_bfeb ,_adefa ,_abad ,_fdefc ,_feae ,_gcdgg byte ;
|
|
);for _bccb =0;_bccb < _ccgb ;_bccb ++{_deed =_bccb *_bdac .RowStride ;_eddb =_bccb *_gacf .RowStride ;for _dbdea =0;_dbdea < _bege ;_dbdea ++{if _fgcd ,_bede =_bdac .GetByte (_deed +_dbdea );_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\u0067e\u0074 \u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _ccde ,_bede =_gacf .GetByte (_eddb +_dbdea );_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\u0067\u0065\u0074\u0020\u006d\u0061\u0073\u006b\u0020\u0062\u0079\u0074\u0065");};if _bccb > 0{if _bfeb ,_bede =_bdac .GetByte (_deed -_bdac .RowStride +_dbdea );
|
|
_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\u0069\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_fgcd |=_bfeb |(_bfeb <<1)|(_bfeb >>1);if _dbdea > 0{if _gcdgg ,_bede =_bdac .GetByte (_deed -_bdac .RowStride +_dbdea -1);_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\u0069\u0020\u003e\u00200 \u0026\u0026\u0020\u006a\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");
|
|
};_fgcd |=_gcdgg <<7;};if _dbdea < _bege -1{if _gcdgg ,_bede =_bdac .GetByte (_deed -_bdac .RowStride +_dbdea +1);_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\u006a\u0020<\u0020\u0077\u0070l\u0020\u002d\u0020\u0031\u0020\u0062\u0079\u0074\u0065");};_fgcd |=_gcdgg >>7;
|
|
};};if _dbdea > 0{if _adefa ,_bede =_bdac .GetByte (_deed +_dbdea -1);_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\u006a\u0020\u003e \u0030");};_fgcd |=_adefa <<7;};_fgcd &=_ccde ;if _fgcd ==0||^_fgcd ==0{if _bede =_bdac .SetByte (_deed +_dbdea ,_fgcd );
|
|
_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\u0073e\u0074t\u0069\u006e\u0067\u0020\u0065m\u0070\u0074y\u0020\u0062\u0079\u0074\u0065");};};for {_feae =_fgcd ;_fgcd =(_fgcd |(_fgcd >>1)|(_fgcd <<1))&_ccde ;if (_fgcd ^_feae )==0{if _bede =_bdac .SetByte (_deed +_dbdea ,_fgcd );
|
|
_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _bccb =_ccgb -1;_bccb >=0;_bccb --{_deed =_bccb *_bdac .RowStride ;_eddb =_bccb *_gacf .RowStride ;
|
|
for _dbdea =_bege -1;_dbdea >=0;_dbdea --{if _fgcd ,_bede =_bdac .GetByte (_deed +_dbdea );_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\u0072\u0065\u0076er\u0073\u0065\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _ccde ,_bede =_gacf .GetByte (_eddb +_dbdea );_bede !=nil {return _f .Wrap (_bede ,_ddde ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _bccb < _ccgb -1{if _abad ,_bede =_bdac .GetByte (_deed +_bdac .RowStride +_dbdea );
|
|
_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\u0069\u0020\u003c\u0020h\u0020\u002d\u0020\u0031\u0020\u002d\u003e\u0020\u0067\u0065t\u0020s\u006f\u0075\u0072\u0063\u0065\u0020\u0062y\u0074\u0065");};_fgcd |=_abad |(_abad <<1)|_abad >>1;if _dbdea > 0{if _gcdgg ,_bede =_bdac .GetByte (_deed +_bdac .RowStride +_dbdea -1);
|
|
_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\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");};_fgcd |=_gcdgg <<7;};if _dbdea < _bege -1{if _gcdgg ,_bede =_bdac .GetByte (_deed +_bdac .RowStride +_dbdea +1);
|
|
_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\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");
|
|
};_fgcd |=_gcdgg >>7;};};if _dbdea < _bege -1{if _fdefc ,_bede =_bdac .GetByte (_deed +_dbdea +1);_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\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");
|
|
};_fgcd |=_fdefc >>7;};_fgcd &=_ccde ;if _fgcd ==0||(^_fgcd )==0{if _bede =_bdac .SetByte (_deed +_dbdea ,_fgcd );_bede !=nil {return _f .Wrap (_bede ,_ddde ,"\u0073e\u0074 \u006d\u0061\u0073\u006b\u0065\u0064\u0020\u0062\u0079\u0074\u0065");};};for {_feae =_fgcd ;
|
|
_fgcd =(_fgcd |(_fgcd >>1)|(_fgcd <<1))&_ccde ;if (_fgcd ^_feae )==0{if _bede =_bdac .SetByte (_deed +_dbdea ,_fgcd );_bede !=nil {return _f .Wrap (_bede ,_ddde ,"r\u0065\u0076\u0065\u0072se\u0020s\u0065\u0074\u0020\u0070\u0072e\u0076\u0020\u0062\u0079\u0074\u0065");
|
|
};break ;};};};};return nil ;};func _dafd (_gddd ,_eddc *Bitmap ,_cbcg CombinationOperator )*Bitmap {_deffc :=New (_gddd .Width ,_gddd .Height );for _dcba :=0;_dcba < len (_deffc .Data );_dcba ++{_deffc .Data [_dcba ]=_begf (_gddd .Data [_dcba ],_eddc .Data [_dcba ],_cbcg );
|
|
};return _deffc ;};func Dilate (d *Bitmap ,s *Bitmap ,sel *Selection )(*Bitmap ,error ){return _bece (d ,s ,sel )};func MakePixelCentroidTab8 ()[]int {return _cfda ()};type Bitmap struct{Width ,Height int ;BitmapNumber int ;RowStride int ;Data []byte ;
|
|
Color Color ;Special int ;Text string ;XResolution ,YResolution int ;};func (_fbf *Bitmap )thresholdPixelSum (_fbfe int )bool {var (_cfge int ;_ecg uint8 ;_ceb byte ;_afe int ;);_bcab :=_fbf .RowStride ;_gbfg :=uint (_fbf .Width &0x07);if _gbfg !=0{_ecg =uint8 ((0xff<<(8-_gbfg ))&0xff);
|
|
_bcab --;};for _eebd :=0;_eebd < _fbf .Height ;_eebd ++{for _afe =0;_afe < _bcab ;_afe ++{_ceb =_fbf .Data [_eebd *_fbf .RowStride +_afe ];_cfge +=int (_ffb [_ceb ]);};if _gbfg !=0{_ceb =_fbf .Data [_eebd *_fbf .RowStride +_afe ]&_ecg ;_cfge +=int (_ffb [_ceb ]);
|
|
};if _cfge > _fbfe {return true ;};};return false ;};func (_dead *ClassedPoints )ySortFunction ()func (_fbbcg int ,_adcf int )bool {return func (_aafb ,_gffe int )bool {return _dead .YAtIndex (_aafb )< _dead .YAtIndex (_gffe )};};func _gefe (_efad ,_bbbg *Bitmap ,_ecbb int ,_ea []byte ,_fbe int )(_gcf error ){const _cae ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0034";
|
|
var (_bdb ,_fbb ,_aafc ,_ggdf ,_bage ,_dce ,_fgc ,_cdd int ;_baf ,_ggde uint32 ;_acg ,_efcb byte ;_dcb uint16 ;);_eab :=make ([]byte ,4);_fdb :=make ([]byte ,4);for _aafc =0;_aafc < _efad .Height -1;_aafc ,_ggdf =_aafc +2,_ggdf +1{_bdb =_aafc *_efad .RowStride ;
|
|
_fbb =_ggdf *_bbbg .RowStride ;for _bage ,_dce =0,0;_bage < _fbe ;_bage ,_dce =_bage +4,_dce +1{for _fgc =0;_fgc < 4;_fgc ++{_cdd =_bdb +_bage +_fgc ;if _cdd <=len (_efad .Data )-1&&_cdd < _bdb +_efad .RowStride {_eab [_fgc ]=_efad .Data [_cdd ];}else {_eab [_fgc ]=0x00;
|
|
};_cdd =_bdb +_efad .RowStride +_bage +_fgc ;if _cdd <=len (_efad .Data )-1&&_cdd < _bdb +(2*_efad .RowStride ){_fdb [_fgc ]=_efad .Data [_cdd ];}else {_fdb [_fgc ]=0x00;};};_baf =_abg .BigEndian .Uint32 (_eab );_ggde =_abg .BigEndian .Uint32 (_fdb );_ggde &=_baf ;
|
|
_ggde &=_ggde <<1;_ggde &=0xaaaaaaaa;_baf =_ggde |(_ggde <<7);_acg =byte (_baf >>24);_efcb =byte ((_baf >>8)&0xff);_cdd =_fbb +_dce ;if _cdd +1==len (_bbbg .Data )-1||_cdd +1>=_fbb +_bbbg .RowStride {_bbbg .Data [_cdd ]=_ea [_acg ];if _gcf =_bbbg .SetByte (_cdd ,_ea [_acg ]);
|
|
_gcf !=nil {return _f .Wrapf (_gcf ,_cae ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_cdd );};}else {_dcb =(uint16 (_ea [_acg ])<<8)|uint16 (_ea [_efcb ]);if _gcf =_bbbg .setTwoBytes (_cdd ,_dcb );_gcf !=nil {return _f .Wrapf (_gcf ,_cae ,"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",_cdd );
|
|
};_dce ++;};};};return nil ;};func (_dggb *Bitmap )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _bbec (_dggb ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func _gbf ()(_gef [256]uint64 ){for _dfa :=0;_dfa < 256;
|
|
_dfa ++{if _dfa &0x01!=0{_gef [_dfa ]|=0xff;};if _dfa &0x02!=0{_gef [_dfa ]|=0xff00;};if _dfa &0x04!=0{_gef [_dfa ]|=0xff0000;};if _dfa &0x08!=0{_gef [_dfa ]|=0xff000000;};if _dfa &0x10!=0{_gef [_dfa ]|=0xff00000000;};if _dfa &0x20!=0{_gef [_dfa ]|=0xff0000000000;
|
|
};if _dfa &0x40!=0{_gef [_dfa ]|=0xff000000000000;};if _dfa &0x80!=0{_gef [_dfa ]|=0xff00000000000000;};};return _gef ;};func (_gbbceb *Bitmaps )GroupByWidth ()(*BitmapsArray ,error ){const _eefe ="\u0047\u0072\u006fu\u0070\u0042\u0079\u0057\u0069\u0064\u0074\u0068";
|
|
if len (_gbbceb .Values )==0{return nil ,_f .Error (_eefe ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_agea :=&BitmapsArray {};_gbbceb .SortByWidth ();_fdefg :=-1;_fcfb :=-1;for _dcgge :=0;_dcgge < len (_gbbceb .Values );
|
|
_dcgge ++{_fafda :=_gbbceb .Values [_dcgge ].Width ;if _fafda > _fdefg {_fdefg =_fafda ;_fcfb ++;_agea .Values =append (_agea .Values ,&Bitmaps {});};_agea .Values [_fcfb ].AddBitmap (_gbbceb .Values [_dcgge ]);};return _agea ,nil ;};const (_fdcb shift =iota ;
|
|
_fced ;);type Color int ;func Rect (x ,y ,w ,h int )(*_be .Rectangle ,error ){const _cfc ="b\u0069\u0074\u006d\u0061\u0070\u002e\u0052\u0065\u0063\u0074";if x < 0{w +=x ;x =0;if w <=0{return nil ,_f .Errorf (_cfc ,"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 ,_f .Error (_cfc ,"\u0079\u0020\u003c 0\u0020\u0061\u006e\u0064\u0020\u0062\u006f\u0078\u0020\u006f\u0066\u0066\u0020\u002b\u0071\u0075\u0061\u0064");};};_dcdd :=_be .Rect (x ,y ,x +w ,y +h );return &_dcdd ,nil ;
|
|
};func (_fbdd MorphProcess )getWidthHeight ()(_gecc ,_aeab int ){return _fbdd .Arguments [0],_fbdd .Arguments [1];};func (_dcea *Bitmaps )HeightSorter ()func (_gbcc ,_bcff int )bool {return func (_gecg ,_bgddc int )bool {_afaaf :=_dcea .Values [_gecg ].Height < _dcea .Values [_bgddc ].Height ;
|
|
_ca .Log .Debug ("H\u0065i\u0067\u0068\u0074\u003a\u0020\u0025\u0076\u0020<\u0020\u0025\u0076\u0020= \u0025\u0076",_dcea .Values [_gecg ].Height ,_dcea .Values [_bgddc ].Height ,_afaaf );return _afaaf ;};};func (_bgfd Points )GetIntX (i int )(int ,error ){if i >=len (_bgfd ){return 0,_f .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 (_bgfd [i ].X ),nil ;};func _defa (_bbaa ,_gbcae *Bitmap ,_gade ,_aeae int )(_dgff error ){const _acac ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0034";var (_adab ,_gbbce ,_gegc ,_gfab int ;_egdb ,_egbcg ,_gdgg ,_dgd ,_bdea ,_ecbc ,_gcece byte ;
|
|
);for _adab =0;_adab < _gade ;_adab ++{_gegc =_adab *_bbaa .RowStride ;_gfab =_adab *_gbcae .RowStride ;for _gbbce =0;_gbbce < _aeae ;_gbbce ++{_egdb ,_dgff =_bbaa .GetByte (_gegc +_gbbce );if _dgff !=nil {return _f .Wrap (_dgff ,_acac ,"\u0066i\u0072\u0073\u0074\u0020\u0067\u0065t");
|
|
};_egbcg ,_dgff =_gbcae .GetByte (_gfab +_gbbce );if _dgff !=nil {return _f .Wrap (_dgff ,_acac ,"\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0067\u0065\u0074");};if _adab > 0{_gdgg ,_dgff =_bbaa .GetByte (_gegc -_bbaa .RowStride +_gbbce );if _dgff !=nil {return _f .Wrap (_dgff ,_acac ,"\u0069\u0020\u003e \u0030");
|
|
};_egdb |=_gdgg ;};if _gbbce > 0{_dgd ,_dgff =_bbaa .GetByte (_gegc +_gbbce -1);if _dgff !=nil {return _f .Wrap (_dgff ,_acac ,"\u006a\u0020\u003e \u0030");};_egdb |=_dgd <<7;};_egdb &=_egbcg ;if _egdb ==0||(^_egdb )==0{if _dgff =_bbaa .SetByte (_gegc +_gbbce ,_egdb );
|
|
_dgff !=nil {return _f .Wrap (_dgff ,_acac ,"b\u0074\u0020\u003d\u003d 0\u0020|\u007c\u0020\u0028\u005e\u0062t\u0029\u0020\u003d\u003d\u0020\u0030");};continue ;};for {_gcece =_egdb ;_egdb =(_egdb |(_egdb >>1)|(_egdb <<1))&_egbcg ;if (_egdb ^_gcece )==0{if _dgff =_bbaa .SetByte (_gegc +_gbbce ,_egdb );
|
|
_dgff !=nil {return _f .Wrap (_dgff ,_acac ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _adab =_gade -1;_adab >=0;_adab --{_gegc =_adab *_bbaa .RowStride ;_gfab =_adab *_gbcae .RowStride ;
|
|
for _gbbce =_aeae -1;_gbbce >=0;_gbbce --{if _egdb ,_dgff =_bbaa .GetByte (_gegc +_gbbce );_dgff !=nil {return _f .Wrap (_dgff ,_acac ,"\u0072\u0065\u0076\u0065\u0072\u0073\u0065\u0020\u0066\u0069\u0072\u0073t\u0020\u0067\u0065\u0074");};if _egbcg ,_dgff =_gbcae .GetByte (_gfab +_gbbce );
|
|
_dgff !=nil {return _f .Wrap (_dgff ,_acac ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _adab < _gade -1{if _bdea ,_dgff =_bbaa .GetByte (_gegc +_bbaa .RowStride +_gbbce );_dgff !=nil {return _f .Wrap (_dgff ,_acac ,"\u0072\u0065v\u0065\u0072\u0073e\u0020\u0069\u0020\u003c\u0020\u0068\u0020\u002d\u0031");
|
|
};_egdb |=_bdea ;};if _gbbce < _aeae -1{if _ecbc ,_dgff =_bbaa .GetByte (_gegc +_gbbce +1);_dgff !=nil {return _f .Wrap (_dgff ,_acac ,"\u0072\u0065\u0076\u0065rs\u0065\u0020\u006a\u0020\u003c\u0020\u0077\u0070\u006c\u0020\u002d\u0020\u0031");};_egdb |=_ecbc >>7;
|
|
};_egdb &=_egbcg ;if _egdb ==0||(^_egdb )==0{if _dgff =_bbaa .SetByte (_gegc +_gbbce ,_egdb );_dgff !=nil {return _f .Wrap (_dgff ,_acac ,"\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 {_gcece =_egdb ;_egdb =(_egdb |(_egdb >>1)|(_egdb <<1))&_egbcg ;if (_egdb ^_gcece )==0{if _dgff =_bbaa .SetByte (_gegc +_gbbce ,_egdb );_dgff !=nil {return _f .Wrap (_dgff ,_acac ,"\u0072e\u0076\u0065\u0072\u0073e\u0020\u0073\u0065\u0074\u0074i\u006eg\u0020p\u0072\u0065\u0076\u0020\u0062\u0079\u0074e");
|
|
};break ;};};};};return nil ;};func _bbec (_gaeba *Bitmap ,_aefdd ,_acecf ,_dadef ,_cbfc int ,_bacaf RasterOperator ,_cbecf *Bitmap ,_fbfg ,_aafd int )error {const _efgd ="\u0072a\u0073t\u0065\u0072\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e";
|
|
if _gaeba ==nil {return _f .Error (_efgd ,"\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");};if _bacaf ==PixDst {return nil ;};switch _bacaf {case PixClr ,PixSet ,PixNotDst :_cabb (_gaeba ,_aefdd ,_acecf ,_dadef ,_cbfc ,_bacaf );
|
|
return nil ;};if _cbecf ==nil {_ca .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 _f .Error (_efgd ,"\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _cbdbe :=_daafb (_gaeba ,_aefdd ,_acecf ,_dadef ,_cbfc ,_bacaf ,_cbecf ,_fbfg ,_aafd );_cbdbe !=nil {return _f .Wrap (_cbdbe ,_efgd ,"");
|
|
};return nil ;};func (_gbcd *Bitmap )inverseData (){if _afde :=_gbcd .RasterOperation (0,0,_gbcd .Width ,_gbcd .Height ,PixNotDst ,nil ,0,0);_afde !=nil {_ca .Log .Debug ("\u0049n\u0076\u0065\u0072\u0073e\u0020\u0064\u0061\u0074\u0061 \u0066a\u0069l\u0065\u0064\u003a\u0020\u0027\u0025\u0076'",_afde );
|
|
};if _gbcd .Color ==Chocolate {_gbcd .Color =Vanilla ;}else {_gbcd .Color =Chocolate ;};};func _gfgg ()(_fed [256]uint32 ){for _dca :=0;_dca < 256;_dca ++{if _dca &0x01!=0{_fed [_dca ]|=0xf;};if _dca &0x02!=0{_fed [_dca ]|=0xf0;};if _dca &0x04!=0{_fed [_dca ]|=0xf00;
|
|
};if _dca &0x08!=0{_fed [_dca ]|=0xf000;};if _dca &0x10!=0{_fed [_dca ]|=0xf0000;};if _dca &0x20!=0{_fed [_dca ]|=0xf00000;};if _dca &0x40!=0{_fed [_dca ]|=0xf000000;};if _dca &0x80!=0{_fed [_dca ]|=0xf0000000;};};return _fed ;};const _bceb =5000;func (_adb *Bitmap )ToImage ()_be .Image {_agb ,_defe :=_ac .NewImage (_adb .Width ,_adb .Height ,1,1,_adb .Data ,nil ,nil );
|
|
if _defe !=nil {_ca .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",_defe );
|
|
};return _agb ;};func _cfdaa (_gfbd *Bitmap ,_defd ,_bada ,_gedg ,_dbeg int ,_bggg RasterOperator ,_ffcf *Bitmap ,_daeg ,_deca int )error {var (_degb byte ;_fdbg int ;_ebfb int ;_cgce ,_abag int ;_ccbe ,_cfgd int ;);_gegdc :=_gedg >>3;_fdag :=_gedg &7;
|
|
if _fdag > 0{_degb =_afcbe [_fdag ];};_fdbg =_ffcf .RowStride *_deca +(_daeg >>3);_ebfb =_gfbd .RowStride *_bada +(_defd >>3);switch _bggg {case PixSrc :for _ccbe =0;_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;_abag =_ebfb +_ccbe *_gfbd .RowStride ;
|
|
for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]=_ffcf .Data [_cgce ];_abag ++;_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],_ffcf .Data [_cgce ],_degb );};};case PixNotSrc :for _ccbe =0;_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;
|
|
_abag =_ebfb +_ccbe *_gfbd .RowStride ;for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]=^(_ffcf .Data [_cgce ]);_abag ++;_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],^_ffcf .Data [_cgce ],_degb );};};case PixSrcOrDst :for _ccbe =0;
|
|
_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;_abag =_ebfb +_ccbe *_gfbd .RowStride ;for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]|=_ffcf .Data [_cgce ];_abag ++;_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],_ffcf .Data [_cgce ]|_gfbd .Data [_abag ],_degb );
|
|
};};case PixSrcAndDst :for _ccbe =0;_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;_abag =_ebfb +_ccbe *_gfbd .RowStride ;for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]&=_ffcf .Data [_cgce ];_abag ++;_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],_ffcf .Data [_cgce ]&_gfbd .Data [_abag ],_degb );
|
|
};};case PixSrcXorDst :for _ccbe =0;_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;_abag =_ebfb +_ccbe *_gfbd .RowStride ;for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]^=_ffcf .Data [_cgce ];_abag ++;_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],_ffcf .Data [_cgce ]^_gfbd .Data [_abag ],_degb );
|
|
};};case PixNotSrcOrDst :for _ccbe =0;_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;_abag =_ebfb +_ccbe *_gfbd .RowStride ;for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]|=^(_ffcf .Data [_cgce ]);_abag ++;_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],^(_ffcf .Data [_cgce ])|_gfbd .Data [_abag ],_degb );
|
|
};};case PixNotSrcAndDst :for _ccbe =0;_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;_abag =_ebfb +_ccbe *_gfbd .RowStride ;for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]&=^(_ffcf .Data [_cgce ]);_abag ++;_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],^(_ffcf .Data [_cgce ])&_gfbd .Data [_abag ],_degb );
|
|
};};case PixSrcOrNotDst :for _ccbe =0;_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;_abag =_ebfb +_ccbe *_gfbd .RowStride ;for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]=_ffcf .Data [_cgce ]|^(_gfbd .Data [_abag ]);_abag ++;
|
|
_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],_ffcf .Data [_cgce ]|^(_gfbd .Data [_abag ]),_degb );};};case PixSrcAndNotDst :for _ccbe =0;_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;_abag =_ebfb +_ccbe *_gfbd .RowStride ;
|
|
for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]=_ffcf .Data [_cgce ]&^(_gfbd .Data [_abag ]);_abag ++;_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],_ffcf .Data [_cgce ]&^(_gfbd .Data [_abag ]),_degb );};};case PixNotPixSrcOrDst :for _ccbe =0;
|
|
_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;_abag =_ebfb +_ccbe *_gfbd .RowStride ;for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]=^(_ffcf .Data [_cgce ]|_gfbd .Data [_abag ]);_abag ++;_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],^(_ffcf .Data [_cgce ]|_gfbd .Data [_abag ]),_degb );
|
|
};};case PixNotPixSrcAndDst :for _ccbe =0;_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;_abag =_ebfb +_ccbe *_gfbd .RowStride ;for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]=^(_ffcf .Data [_cgce ]&_gfbd .Data [_abag ]);_abag ++;
|
|
_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],^(_ffcf .Data [_cgce ]&_gfbd .Data [_abag ]),_degb );};};case PixNotPixSrcXorDst :for _ccbe =0;_ccbe < _dbeg ;_ccbe ++{_cgce =_fdbg +_ccbe *_ffcf .RowStride ;_abag =_ebfb +_ccbe *_gfbd .RowStride ;
|
|
for _cfgd =0;_cfgd < _gegdc ;_cfgd ++{_gfbd .Data [_abag ]=^(_ffcf .Data [_cgce ]^_gfbd .Data [_abag ]);_abag ++;_cgce ++;};if _fdag > 0{_gfbd .Data [_abag ]=_beabb (_gfbd .Data [_abag ],^(_ffcf .Data [_cgce ]^_gfbd .Data [_abag ]),_degb );};};default:_ca .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",_bggg );
|
|
return _f .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 CorrelationScore (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_bfbdd float64 ,_abed error ){const _fbda ="\u0063\u006fr\u0072\u0065\u006ca\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065";
|
|
if bm1 ==nil ||bm2 ==nil {return 0,_f .Error (_fbda ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0062\u0069\u0074ma\u0070\u0073");};if tab ==nil {return 0,_f .Error (_fbda ,"\u0027\u0074\u0061\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
};if area1 <=0||area2 <=0{return 0,_f .Error (_fbda ,"\u0061\u0072\u0065\u0061s\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0067r\u0065a\u0074\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};_abgbe ,_dcgg :=bm1 .Width ,bm1 .Height ;_ggdg ,_bcbe :=bm2 .Width ,bm2 .Height ;
|
|
_bfad :=_dded (_abgbe -_ggdg );if _bfad > maxDiffW {return 0,nil ;};_febc :=_dded (_dcgg -_bcbe );if _febc > maxDiffH {return 0,nil ;};var _cbge ,_gda int ;if delX >=0{_cbge =int (delX +0.5);}else {_cbge =int (delX -0.5);};if delY >=0{_gda =int (delY +0.5);
|
|
}else {_gda =int (delY -0.5);};_cfea :=_dgfg (_gda ,0);_edgb :=_aggf (_bcbe +_gda ,_dcgg );_ceaa :=bm1 .RowStride *_cfea ;_gcce :=bm2 .RowStride *(_cfea -_gda );_gccb :=_dgfg (_cbge ,0);_ebed :=_aggf (_ggdg +_cbge ,_abgbe );_beed :=bm2 .RowStride ;var _ggbea ,_cebb int ;
|
|
if _cbge >=8{_ggbea =_cbge >>3;_ceaa +=_ggbea ;_gccb -=_ggbea <<3;_ebed -=_ggbea <<3;_cbge &=7;}else if _cbge <=-8{_cebb =-((_cbge +7)>>3);_gcce +=_cebb ;_beed -=_cebb ;_cbge +=_cebb <<3;};if _gccb >=_ebed ||_cfea >=_edgb {return 0,nil ;};_dbba :=(_ebed +7)>>3;
|
|
var (_fabfd ,_gbe ,_egec byte ;_agfa ,_bbg ,_dgag int ;);switch {case _cbge ==0:for _dgag =_cfea ;_dgag < _edgb ;_dgag ,_ceaa ,_gcce =_dgag +1,_ceaa +bm1 .RowStride ,_gcce +bm2 .RowStride {for _bbg =0;_bbg < _dbba ;_bbg ++{_egec =bm1 .Data [_ceaa +_bbg ]&bm2 .Data [_gcce +_bbg ];
|
|
_agfa +=tab [_egec ];};};case _cbge > 0:if _beed < _dbba {for _dgag =_cfea ;_dgag < _edgb ;_dgag ,_ceaa ,_gcce =_dgag +1,_ceaa +bm1 .RowStride ,_gcce +bm2 .RowStride {_fabfd ,_gbe =bm1 .Data [_ceaa ],bm2 .Data [_gcce ]>>uint (_cbge );_egec =_fabfd &_gbe ;
|
|
_agfa +=tab [_egec ];for _bbg =1;_bbg < _beed ;_bbg ++{_fabfd ,_gbe =bm1 .Data [_ceaa +_bbg ],(bm2 .Data [_gcce +_bbg ]>>uint (_cbge ))|(bm2 .Data [_gcce +_bbg -1]<<uint (8-_cbge ));_egec =_fabfd &_gbe ;_agfa +=tab [_egec ];};_fabfd =bm1 .Data [_ceaa +_bbg ];
|
|
_gbe =bm2 .Data [_gcce +_bbg -1]<<uint (8-_cbge );_egec =_fabfd &_gbe ;_agfa +=tab [_egec ];};}else {for _dgag =_cfea ;_dgag < _edgb ;_dgag ,_ceaa ,_gcce =_dgag +1,_ceaa +bm1 .RowStride ,_gcce +bm2 .RowStride {_fabfd ,_gbe =bm1 .Data [_ceaa ],bm2 .Data [_gcce ]>>uint (_cbge );
|
|
_egec =_fabfd &_gbe ;_agfa +=tab [_egec ];for _bbg =1;_bbg < _dbba ;_bbg ++{_fabfd =bm1 .Data [_ceaa +_bbg ];_gbe =(bm2 .Data [_gcce +_bbg ]>>uint (_cbge ))|(bm2 .Data [_gcce +_bbg -1]<<uint (8-_cbge ));_egec =_fabfd &_gbe ;_agfa +=tab [_egec ];};};};default:if _dbba < _beed {for _dgag =_cfea ;
|
|
_dgag < _edgb ;_dgag ,_ceaa ,_gcce =_dgag +1,_ceaa +bm1 .RowStride ,_gcce +bm2 .RowStride {for _bbg =0;_bbg < _dbba ;_bbg ++{_fabfd =bm1 .Data [_ceaa +_bbg ];_gbe =bm2 .Data [_gcce +_bbg ]<<uint (-_cbge );_gbe |=bm2 .Data [_gcce +_bbg +1]>>uint (8+_cbge );
|
|
_egec =_fabfd &_gbe ;_agfa +=tab [_egec ];};};}else {for _dgag =_cfea ;_dgag < _edgb ;_dgag ,_ceaa ,_gcce =_dgag +1,_ceaa +bm1 .RowStride ,_gcce +bm2 .RowStride {for _bbg =0;_bbg < _dbba -1;_bbg ++{_fabfd =bm1 .Data [_ceaa +_bbg ];_gbe =bm2 .Data [_gcce +_bbg ]<<uint (-_cbge );
|
|
_gbe |=bm2 .Data [_gcce +_bbg +1]>>uint (8+_cbge );_egec =_fabfd &_gbe ;_agfa +=tab [_egec ];};_fabfd =bm1 .Data [_ceaa +_bbg ];_gbe =bm2 .Data [_gcce +_bbg ]<<uint (-_cbge );_egec =_fabfd &_gbe ;_agfa +=tab [_egec ];};};};_bfbdd =float64 (_agfa )*float64 (_agfa )/(float64 (area1 )*float64 (area2 ));
|
|
return _bfbdd ,nil ;};func RankHausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH ,area1 ,area3 int ,rank float32 ,tab8 []int )(_fbea bool ,_ebad error ){const _cbbae ="\u0052\u0061\u006ek\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";
|
|
_adcg ,_dgac :=p1 .Width ,p1 .Height ;_bfab ,_gfcaa :=p3 .Width ,p3 .Height ;if _gb .Abs (_adcg -_bfab )> maxDiffW {return false ,nil ;};if _gb .Abs (_dgac -_gfcaa )> maxDiffH {return false ,nil ;};_fcgbf :=int (float32 (area1 )*(1.0-rank )+0.5);_eea :=int (float32 (area3 )*(1.0-rank )+0.5);
|
|
var _ccaf ,_acaa int ;if delX >=0{_ccaf =int (delX +0.5);}else {_ccaf =int (delX -0.5);};if delY >=0{_acaa =int (delY +0.5);}else {_acaa =int (delY -0.5);};_gdeg :=p1 .CreateTemplate ();if _ebad =_gdeg .RasterOperation (0,0,_adcg ,_dgac ,PixSrc ,p1 ,0,0);
|
|
_ebad !=nil {return false ,_f .Wrap (_ebad ,_cbbae ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _ebad =_gdeg .RasterOperation (_ccaf ,_acaa ,_adcg ,_dgac ,PixNotSrcAndDst ,p4 ,0,0);_ebad !=nil {return false ,_f .Wrap (_ebad ,_cbbae ,"\u0074 \u0026\u0020\u0021\u0070\u0034");
|
|
};_fbea ,_ebad =_gdeg .ThresholdPixelSum (_fcgbf ,tab8 );if _ebad !=nil {return false ,_f .Wrap (_ebad ,_cbbae ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0031");};if _fbea {return false ,nil ;};if _ebad =_gdeg .RasterOperation (_ccaf ,_acaa ,_bfab ,_gfcaa ,PixSrc ,p3 ,0,0);
|
|
_ebad !=nil {return false ,_f .Wrap (_ebad ,_cbbae ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _ebad =_gdeg .RasterOperation (0,0,_bfab ,_gfcaa ,PixNotSrcAndDst ,p2 ,0,0);_ebad !=nil {return false ,_f .Wrap (_ebad ,_cbbae ,"\u0074 \u0026\u0020\u0021\u0070\u0032");
|
|
};_fbea ,_ebad =_gdeg .ThresholdPixelSum (_eea ,tab8 );if _ebad !=nil {return false ,_f .Wrap (_ebad ,_cbbae ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0033");};return !_fbea ,nil ;};func RasterOperation (dest *Bitmap ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _bbec (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
};func _ddc ()[]int {_fdga :=make ([]int ,256);for _cebc :=0;_cebc <=0xff;_cebc ++{_fbfd :=byte (_cebc );_fdga [_fbfd ]=int (_fbfd &0x1)+(int (_fbfd >>1)&0x1)+(int (_fbfd >>2)&0x1)+(int (_fbfd >>3)&0x1)+(int (_fbfd >>4)&0x1)+(int (_fbfd >>5)&0x1)+(int (_fbfd >>6)&0x1)+(int (_fbfd >>7)&0x1);
|
|
};return _fdga ;};func _abga (_bdg *Bitmap ,_dfe *Bitmap ,_bge int )(_acb error ){const _adg ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0050\u006fw\u0065\u0072\u0032\u004c\u006f\u0077";switch _bge {case 2:_acb =_aca (_bdg ,_dfe );case 4:_acb =_df (_bdg ,_dfe );
|
|
case 8:_acb =_dg (_bdg ,_dfe );default:return _f .Error (_adg ,"\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 _acb !=nil {_acb =_f .Wrap (_acb ,_adg ,"");};return _acb ;};type Bitmaps struct{Values []*Bitmap ;Boxes []*_be .Rectangle ;};func (_gfgc *Bitmap )connComponentsBB (_ggbaa int )(_egea *Boxes ,_gaf error ){const _gbga ="\u0042\u0069\u0074ma\u0070\u002e\u0063\u006f\u006e\u006e\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0042";
|
|
if _ggbaa !=4&&_ggbaa !=8{return nil ,_f .Error (_gbga ,"\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 _gfgc .Zero (){return &Boxes {},nil ;
|
|
};_gfgc .setPadBits (0);_bbfb ,_gaf :=_dgf (nil ,_gfgc );if _gaf !=nil {return nil ,_f .Wrap (_gaf ,_gbga ,"\u0062\u006d\u0031");};_edg :=&_gb .Stack {};_edg .Aux =&_gb .Stack {};_egea =&Boxes {};var (_efba ,_aadb int ;_acc _be .Point ;_gfec bool ;_gfeg *_be .Rectangle ;
|
|
);for {if _acc ,_gfec ,_gaf =_bbfb .nextOnPixel (_aadb ,_efba );_gaf !=nil {return nil ,_f .Wrap (_gaf ,_gbga ,"");};if !_gfec {break ;};if _gfeg ,_gaf =_eefdb (_bbfb ,_edg ,_acc .X ,_acc .Y ,_ggbaa );_gaf !=nil {return nil ,_f .Wrap (_gaf ,_gbga ,"");
|
|
};if _gaf =_egea .Add (_gfeg );_gaf !=nil {return nil ,_f .Wrap (_gaf ,_gbga ,"");};_aadb =_acc .X ;_efba =_acc .Y ;};return _egea ,nil ;};func SelCreateBrick (h ,w int ,cy ,cx int ,tp SelectionValue )*Selection {_bbdc :=_aafbg (h ,w ,"");_bbdc .setOrigin (cy ,cx );
|
|
var _fcgbfb ,_bgdeb int ;for _fcgbfb =0;_fcgbfb < h ;_fcgbfb ++{for _bgdeb =0;_bgdeb < w ;_bgdeb ++{_bbdc .Data [_fcgbfb ][_bgdeb ]=tp ;};};return _bbdc ;};func (_cebaf *Bitmaps )Size ()int {return len (_cebaf .Values )};func TstCSymbol (t *_b .T )*Bitmap {t .Helper ();
|
|
_fedg :=New (6,6);_a .NoError (t ,_fedg .SetPixel (1,0,1));_a .NoError (t ,_fedg .SetPixel (2,0,1));_a .NoError (t ,_fedg .SetPixel (3,0,1));_a .NoError (t ,_fedg .SetPixel (4,0,1));_a .NoError (t ,_fedg .SetPixel (0,1,1));_a .NoError (t ,_fedg .SetPixel (5,1,1));
|
|
_a .NoError (t ,_fedg .SetPixel (0,2,1));_a .NoError (t ,_fedg .SetPixel (0,3,1));_a .NoError (t ,_fedg .SetPixel (0,4,1));_a .NoError (t ,_fedg .SetPixel (5,4,1));_a .NoError (t ,_fedg .SetPixel (1,5,1));_a .NoError (t ,_fedg .SetPixel (2,5,1));_a .NoError (t ,_fedg .SetPixel (3,5,1));
|
|
_a .NoError (t ,_fedg .SetPixel (4,5,1));return _fedg ;};type CombinationOperator int ;func (_geeab *byHeight )Len ()int {return len (_geeab .Values )};func _agae (_efgee *Bitmap ,_adbf *_gb .Stack ,_abfa ,_aecf int )(_bedgd *_be .Rectangle ,_cfcb error ){const _cfdgb ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _efgee ==nil {return nil ,_f .Error (_cfdgb ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _adbf ==nil {return nil ,_f .Error (_cfdgb ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_ccaa ,_edfd :=_efgee .Width ,_efgee .Height ;_fae :=_ccaa -1;_cabc :=_edfd -1;if _abfa < 0||_abfa > _fae ||_aecf < 0||_aecf > _cabc ||!_efgee .GetPixel (_abfa ,_aecf ){return nil ,nil ;};var _dgdd *_be .Rectangle ;_dgdd ,_cfcb =Rect (100000,100000,0,0);
|
|
if _cfcb !=nil {return nil ,_f .Wrap (_cfcb ,_cfdgb ,"");};if _cfcb =_ecff (_adbf ,_abfa ,_abfa ,_aecf ,1,_cabc ,_dgdd );_cfcb !=nil {return nil ,_f .Wrap (_cfcb ,_cfdgb ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _cfcb =_ecff (_adbf ,_abfa ,_abfa ,_aecf +1,-1,_cabc ,_dgdd );
|
|
_cfcb !=nil {return nil ,_f .Wrap (_cfcb ,_cfdgb ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_dgdd .Min .X ,_dgdd .Max .X =_abfa ,_abfa ;_dgdd .Min .Y ,_dgdd .Max .Y =_aecf ,_aecf ;var (_egeg *fillSegment ;
|
|
_bbeg int ;);for _adbf .Len ()> 0{if _egeg ,_cfcb =_aebf (_adbf );_cfcb !=nil {return nil ,_f .Wrap (_cfcb ,_cfdgb ,"");};_aecf =_egeg ._deba ;for _abfa =_egeg ._egca ;_abfa >=0&&_efgee .GetPixel (_abfa ,_aecf );_abfa --{if _cfcb =_efgee .SetPixel (_abfa ,_aecf ,0);
|
|
_cfcb !=nil {return nil ,_f .Wrap (_cfcb ,_cfdgb ,"");};};if _abfa >=_egeg ._egca {for _abfa ++;_abfa <=_egeg ._efbba &&_abfa <=_fae &&!_efgee .GetPixel (_abfa ,_aecf );_abfa ++{};_bbeg =_abfa ;if !(_abfa <=_egeg ._efbba &&_abfa <=_fae ){continue ;};}else {_bbeg =_abfa +1;
|
|
if _bbeg < _egeg ._egca -1{if _cfcb =_ecff (_adbf ,_bbeg ,_egeg ._egca -1,_egeg ._deba ,-_egeg ._bfabf ,_cabc ,_dgdd );_cfcb !=nil {return nil ,_f .Wrap (_cfcb ,_cfdgb ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_abfa =_egeg ._egca +1;};for {for ;_abfa <=_fae &&_efgee .GetPixel (_abfa ,_aecf );_abfa ++{if _cfcb =_efgee .SetPixel (_abfa ,_aecf ,0);_cfcb !=nil {return nil ,_f .Wrap (_cfcb ,_cfdgb ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _cfcb =_ecff (_adbf ,_bbeg ,_abfa -1,_egeg ._deba ,_egeg ._bfabf ,_cabc ,_dgdd );
|
|
_cfcb !=nil {return nil ,_f .Wrap (_cfcb ,_cfdgb ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _abfa > _egeg ._efbba +1{if _cfcb =_ecff (_adbf ,_egeg ._efbba +1,_abfa -1,_egeg ._deba ,-_egeg ._bfabf ,_cabc ,_dgdd );_cfcb !=nil {return nil ,_f .Wrap (_cfcb ,_cfdgb ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _abfa ++;_abfa <=_egeg ._efbba &&_abfa <=_fae &&!_efgee .GetPixel (_abfa ,_aecf );_abfa ++{};_bbeg =_abfa ;if !(_abfa <=_egeg ._efbba &&_abfa <=_fae ){break ;};};};_dgdd .Max .X ++;_dgdd .Max .Y ++;return _dgdd ,nil ;};func (_afb *Bitmap )addPadBits ()(_bad error ){const _ggeg ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0061\u0064\u0064\u0050\u0061d\u0042\u0069\u0074\u0073";
|
|
_efge :=_afb .Width %8;if _efge ==0{return nil ;};_dac :=_afb .Width /8;_bddf :=_ab .NewReader (_afb .Data );_agce :=make ([]byte ,_afb .Height *_afb .RowStride );_gdc :=_ab .NewWriterMSB (_agce );_cca :=make ([]byte ,_dac );var (_acgfa int ;_bea uint64 ;
|
|
);for _acgfa =0;_acgfa < _afb .Height ;_acgfa ++{if _ ,_bad =_bddf .Read (_cca );_bad !=nil {return _f .Wrap (_bad ,_ggeg ,"\u0066u\u006c\u006c\u0020\u0062\u0079\u0074e");};if _ ,_bad =_gdc .Write (_cca );_bad !=nil {return _f .Wrap (_bad ,_ggeg ,"\u0066\u0075\u006c\u006c\u0020\u0062\u0079\u0074\u0065\u0073");
|
|
};if _bea ,_bad =_bddf .ReadBits (byte (_efge ));_bad !=nil {return _f .Wrap (_bad ,_ggeg ,"\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067\u0020\u0062\u0069\u0074\u0073");};if _bad =_gdc .WriteByte (byte (_bea )<<uint (8-_efge ));_bad !=nil {return _f .Wrap (_bad ,_ggeg ,"\u006ca\u0073\u0074\u0020\u0062\u0079\u0074e");
|
|
};};_afb .Data =_gdc .Data ();return nil ;};func _dgf (_geb ,_dfff *Bitmap )(*Bitmap ,error ){if _dfff ==nil {return nil ,_f .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 _dfff ==_geb {return _geb ,nil ;};if _geb ==nil {_geb =_dfff .createTemplate ();copy (_geb .Data ,_dfff .Data );return _geb ,nil ;};_aegc :=_geb .resizeImageData (_dfff );if _aegc !=nil {return nil ,_f .Wrap (_aegc ,"\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","");
|
|
};_geb .Text =_dfff .Text ;copy (_geb .Data ,_dfff .Data );return _geb ,nil ;};func (_cge *Bitmap )ThresholdPixelSum (thresh int ,tab8 []int )(_deff bool ,_acbg error ){const _edfb ="\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 =_ddc ();};_eff :=_cge .Width >>3;_gfc :=_cge .Width &7;_ffab :=byte (0xff<<uint (8-_gfc ));var (_bfbd ,_fea ,_eabf ,_egagf int ;_eabe byte ;);for _bfbd =0;_bfbd < _cge .Height ;_bfbd ++{_eabf =_cge .RowStride *_bfbd ;for _fea =0;_fea < _eff ;
|
|
_fea ++{_eabe ,_acbg =_cge .GetByte (_eabf +_fea );if _acbg !=nil {return false ,_f .Wrap (_acbg ,_edfb ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};_egagf +=tab8 [_eabe ];};if _gfc !=0{_eabe ,_acbg =_cge .GetByte (_eabf +_fea );if _acbg !=nil {return false ,_f .Wrap (_acbg ,_edfb ,"p\u0061\u0072\u0074\u0069\u0061\u006c\u0042\u0079\u0074\u0065");
|
|
};_eabe &=_ffab ;_egagf +=tab8 [_eabe ];};if _egagf > thresh {return true ,nil ;};};return _deff ,nil ;};func _dg (_bec ,_ada *Bitmap )(_db error ){const _bc ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0038";
|
|
_cf :=_ada .RowStride ;_efg :=_bec .RowStride ;var _ggf ,_fe ,_bgd ,_bb ,_cbg int ;for _bgd =0;_bgd < _ada .Height ;_bgd ++{_ggf =_bgd *_cf ;_fe =8*_bgd *_efg ;for _bb =0;_bb < _cf ;_bb ++{if _db =_bec .setEightBytes (_fe +_bb *8,_ceag [_ada .Data [_ggf +_bb ]]);
|
|
_db !=nil {return _f .Wrap (_db ,_bc ,"");};};for _cbg =1;_cbg < 8;_cbg ++{for _bb =0;_bb < _efg ;_bb ++{if _db =_bec .SetByte (_fe +_cbg *_efg +_bb ,_bec .Data [_fe +_bb ]);_db !=nil {return _f .Wrap (_db ,_bc ,"");};};};};return nil ;};func (_dbed Points )GetIntY (i int )(int ,error ){if i >=len (_dbed ){return 0,_f .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 (_dbed [i ].Y ),nil ;};func _gcc (_gff *Bitmap ,_ce int )(*Bitmap ,error ){const _cdc ="\u0065x\u0070a\u006e\u0064\u0042\u0069\u006ea\u0072\u0079P\u006f\u0077\u0065\u0072\u0032";if _gff ==nil {return nil ,_f .Error (_cdc ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _ce ==1{return _dgf (nil ,_gff );};if _ce !=2&&_ce !=4&&_ce !=8{return nil ,_f .Error (_cdc ,"\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");
|
|
};_gde :=_ce *_gff .Width ;_efc :=_ce *_gff .Height ;_dfb :=New (_gde ,_efc );var _cce error ;switch _ce {case 2:_cce =_aca (_dfb ,_gff );case 4:_cce =_df (_dfb ,_gff );case 8:_cce =_dg (_dfb ,_gff );};if _cce !=nil {return nil ,_f .Wrap (_cce ,_cdc ,"");
|
|
};return _dfb ,nil ;};type RasterOperator int ;func (_bcea *byWidth )Swap (i ,j int ){_bcea .Values [i ],_bcea .Values [j ]=_bcea .Values [j ],_bcea .Values [i ];if _bcea .Boxes !=nil {_bcea .Boxes [i ],_bcea .Boxes [j ]=_bcea .Boxes [j ],_bcea .Boxes [i ];
|
|
};};func _fbef (_cgdc *Bitmap ,_bbgeb ,_aabe int ,_dbde ,_ffgd int ,_dadb RasterOperator ){var (_dabd bool ;_eeegf bool ;_cagec int ;_gfcf int ;_eaee int ;_aaaa int ;_adcec bool ;_feeb byte ;);_gaec :=8-(_bbgeb &7);_adae :=_aecd [_gaec ];_fagg :=_cgdc .RowStride *_aabe +(_bbgeb >>3);
|
|
if _dbde < _gaec {_dabd =true ;_adae &=_afcbe [8-_gaec +_dbde ];};if !_dabd {_cagec =(_dbde -_gaec )>>3;if _cagec !=0{_eeegf =true ;_gfcf =_fagg +1;};};_eaee =(_bbgeb +_dbde )&7;if !(_dabd ||_eaee ==0){_adcec =true ;_feeb =_afcbe [_eaee ];_aaaa =_fagg +1+_cagec ;
|
|
};var _bfbdc ,_ddbe int ;switch _dadb {case PixClr :for _bfbdc =0;_bfbdc < _ffgd ;_bfbdc ++{_cgdc .Data [_fagg ]=_beabb (_cgdc .Data [_fagg ],0x0,_adae );_fagg +=_cgdc .RowStride ;};if _eeegf {for _bfbdc =0;_bfbdc < _ffgd ;_bfbdc ++{for _ddbe =0;_ddbe < _cagec ;
|
|
_ddbe ++{_cgdc .Data [_gfcf +_ddbe ]=0x0;};_gfcf +=_cgdc .RowStride ;};};if _adcec {for _bfbdc =0;_bfbdc < _ffgd ;_bfbdc ++{_cgdc .Data [_aaaa ]=_beabb (_cgdc .Data [_aaaa ],0x0,_feeb );_aaaa +=_cgdc .RowStride ;};};case PixSet :for _bfbdc =0;_bfbdc < _ffgd ;
|
|
_bfbdc ++{_cgdc .Data [_fagg ]=_beabb (_cgdc .Data [_fagg ],0xff,_adae );_fagg +=_cgdc .RowStride ;};if _eeegf {for _bfbdc =0;_bfbdc < _ffgd ;_bfbdc ++{for _ddbe =0;_ddbe < _cagec ;_ddbe ++{_cgdc .Data [_gfcf +_ddbe ]=0xff;};_gfcf +=_cgdc .RowStride ;};
|
|
};if _adcec {for _bfbdc =0;_bfbdc < _ffgd ;_bfbdc ++{_cgdc .Data [_aaaa ]=_beabb (_cgdc .Data [_aaaa ],0xff,_feeb );_aaaa +=_cgdc .RowStride ;};};case PixNotDst :for _bfbdc =0;_bfbdc < _ffgd ;_bfbdc ++{_cgdc .Data [_fagg ]=_beabb (_cgdc .Data [_fagg ],^_cgdc .Data [_fagg ],_adae );
|
|
_fagg +=_cgdc .RowStride ;};if _eeegf {for _bfbdc =0;_bfbdc < _ffgd ;_bfbdc ++{for _ddbe =0;_ddbe < _cagec ;_ddbe ++{_cgdc .Data [_gfcf +_ddbe ]=^(_cgdc .Data [_gfcf +_ddbe ]);};_gfcf +=_cgdc .RowStride ;};};if _adcec {for _bfbdc =0;_bfbdc < _ffgd ;_bfbdc ++{_cgdc .Data [_aaaa ]=_beabb (_cgdc .Data [_aaaa ],^_cgdc .Data [_aaaa ],_feeb );
|
|
_aaaa +=_cgdc .RowStride ;};};};};func (_adag *ClassedPoints )xSortFunction ()func (_gacgg int ,_edfbc int )bool {return func (_bgbb ,_fgca int )bool {return _adag .XAtIndex (_bgbb )< _adag .XAtIndex (_fgca )};};func (_aea *Bitmap )InverseData (){_aea .inverseData ()};
|
|
func _aca (_cd ,_bd *Bitmap )(_ge error ){const _gf ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0032";_e :=_bd .RowStride ;_gc :=_cd .RowStride ;var (_ad byte ;_ff uint16 ;_ag ,_cb ,_fc ,_bee ,_d int ;
|
|
);for _fc =0;_fc < _bd .Height ;_fc ++{_ag =_fc *_e ;_cb =2*_fc *_gc ;for _bee =0;_bee < _e ;_bee ++{_ad =_bd .Data [_ag +_bee ];_ff =_fgab [_ad ];_d =_cb +_bee *2;if _cd .RowStride !=_bd .RowStride *2&&(_bee +1)*2> _cd .RowStride {_ge =_cd .SetByte (_d ,byte (_ff >>8));
|
|
}else {_ge =_cd .setTwoBytes (_d ,_ff );};if _ge !=nil {return _f .Wrap (_ge ,_gf ,"");};};for _bee =0;_bee < _gc ;_bee ++{_d =_cb +_gc +_bee ;_ad =_cd .Data [_cb +_bee ];if _ge =_cd .SetByte (_d ,_ad );_ge !=nil {return _f .Wrapf (_ge ,_gf ,"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",_cb +_bee ,_cb +_gc +_bee );
|
|
};};};return nil ;};func TstASymbol (t *_b .T )*Bitmap {t .Helper ();_cgafa :=New (6,6);_a .NoError (t ,_cgafa .SetPixel (1,0,1));_a .NoError (t ,_cgafa .SetPixel (2,0,1));_a .NoError (t ,_cgafa .SetPixel (3,0,1));_a .NoError (t ,_cgafa .SetPixel (4,0,1));
|
|
_a .NoError (t ,_cgafa .SetPixel (5,1,1));_a .NoError (t ,_cgafa .SetPixel (1,2,1));_a .NoError (t ,_cgafa .SetPixel (2,2,1));_a .NoError (t ,_cgafa .SetPixel (3,2,1));_a .NoError (t ,_cgafa .SetPixel (4,2,1));_a .NoError (t ,_cgafa .SetPixel (5,2,1));
|
|
_a .NoError (t ,_cgafa .SetPixel (0,3,1));_a .NoError (t ,_cgafa .SetPixel (5,3,1));_a .NoError (t ,_cgafa .SetPixel (0,4,1));_a .NoError (t ,_cgafa .SetPixel (5,4,1));_a .NoError (t ,_cgafa .SetPixel (1,5,1));_a .NoError (t ,_cgafa .SetPixel (2,5,1));
|
|
_a .NoError (t ,_cgafa .SetPixel (3,5,1));_a .NoError (t ,_cgafa .SetPixel (4,5,1));_a .NoError (t ,_cgafa .SetPixel (5,5,1));return _cgafa ;};func (_aefda *Bitmaps )CountPixels ()*_gb .NumSlice {_bbcf :=&_gb .NumSlice {};for _ ,_egde :=range _aefda .Values {_bbcf .AddInt (_egde .CountPixels ());
|
|
};return _bbcf ;};type Boxes []*_be .Rectangle ;func TstVSymbol (t *_b .T ,scale ...int )*Bitmap {_fceb ,_gbbdb :=NewWithData (5,5,[]byte {0x88,0x88,0x88,0x50,0x20});_a .NoError (t ,_gbbdb );return TstGetScaledSymbol (t ,_fceb ,scale ...);};func (_afge Points )GetGeometry (i int )(_ggdb ,_edfe float32 ,_cbddg error ){if i > len (_afge )-1{return 0,0,_f .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 );
|
|
};_ffgg :=_afge [i ];return _ffgg .X ,_ffgg .Y ,nil ;};func (_afdeg *ClassedPoints )GetIntXByClass (i int )(int ,error ){const _ebac ="\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 >=_afdeg .IntSlice .Size (){return 0,_f .Errorf (_ebac ,"\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 (_afdeg .XAtIndex (i )),nil ;};func _dded (_fafa int )int {if _fafa < 0{return -_fafa ;};return _fafa ;};func (_bdbb *Bitmap )createTemplate ()*Bitmap {return &Bitmap {Width :_bdbb .Width ,Height :_bdbb .Height ,RowStride :_bdbb .RowStride ,Color :_bdbb .Color ,Text :_bdbb .Text ,BitmapNumber :_bdbb .BitmapNumber ,Special :_bdbb .Special ,Data :make ([]byte ,len (_bdbb .Data ))};
|
|
};func (_cab *Bitmap )setBit (_fdd int ){_cab .Data [(_fdd >>3)]|=0x80>>uint (_fdd &7)};func (_bdgd CombinationOperator )String ()string {var _cdeec string ;switch _bdgd {case CmbOpOr :_cdeec ="\u004f\u0052";case CmbOpAnd :_cdeec ="\u0041\u004e\u0044";
|
|
case CmbOpXor :_cdeec ="\u0058\u004f\u0052";case CmbOpXNor :_cdeec ="\u0058\u004e\u004f\u0052";case CmbOpReplace :_cdeec ="\u0052E\u0050\u004c\u0041\u0043\u0045";case CmbOpNot :_cdeec ="\u004e\u004f\u0054";};return _cdeec ;};func _gee (_ga *Bitmap ,_ccb ,_gdg int )(*Bitmap ,error ){const _ed ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0052\u0065p\u006c\u0069\u0063\u0061\u0074\u0065";
|
|
if _ga ==nil {return nil ,_f .Error (_ed ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _ccb <=0||_gdg <=0{return nil ,_f .Error (_ed ,"\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 _ccb ==_gdg {if _ccb ==1{_gce ,_bf :=_dgf (nil ,_ga );if _bf !=nil {return nil ,_f .Wrap (_bf ,_ed ,"\u0078\u0046\u0061\u0063\u0074\u0020\u003d\u003d\u0020y\u0046\u0061\u0063\u0074");};return _gce ,nil ;};if _ccb ==2||_ccb ==4||_ccb ==8{_edf ,_caa :=_gcc (_ga ,_ccb );
|
|
if _caa !=nil {return nil ,_f .Wrap (_caa ,_ed ,"\u0078\u0046a\u0063\u0074\u0020i\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");};return _edf ,nil ;};};_agc :=_ccb *_ga .Width ;_ee :=_gdg *_ga .Height ;_gcg :=New (_agc ,_ee );_ae :=_gcg .RowStride ;
|
|
var (_fa ,_ace ,_gfe ,_eg ,_eb int ;_gdf byte ;_beg error ;);for _ace =0;_ace < _ga .Height ;_ace ++{_fa =_gdg *_ace *_ae ;for _gfe =0;_gfe < _ga .Width ;_gfe ++{if _dd :=_ga .GetPixel (_gfe ,_ace );_dd {_eb =_ccb *_gfe ;for _eg =0;_eg < _ccb ;_eg ++{_gcg .setBit (_fa *8+_eb +_eg );
|
|
};};};for _eg =1;_eg < _gdg ;_eg ++{_cfb :=_fa +_eg *_ae ;for _dc :=0;_dc < _ae ;_dc ++{if _gdf ,_beg =_gcg .GetByte (_fa +_dc );_beg !=nil {return nil ,_f .Wrapf (_beg ,_ed ,"\u0072\u0065\u0070\u006cic\u0061\u0074\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u003a\u0020\u0027\u0025d\u0027",_eg );
|
|
};if _beg =_gcg .SetByte (_cfb +_dc ,_gdf );_beg !=nil {return nil ,_f .Wrap (_beg ,_ed ,"\u0053\u0065\u0074\u0074in\u0067\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};};};};return _gcg ,nil ;};func TstWordBitmap (t *_b .T ,scale ...int )*Bitmap {_bbag :=1;
|
|
if len (scale )> 0{_bbag =scale [0];};_faeg :=3;_dfebg :=9+7+15+2*_faeg ;_ecgf :=5+_faeg +5;_ffcca :=New (_dfebg *_bbag ,_ecgf *_bbag );_adgcf :=&Bitmaps {};var _egef *int ;_faeg *=_bbag ;_dcbfa :=0;_egef =&_dcbfa ;_fegb :=0;_acbcg :=TstDSymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,1*_bbag );_acbcg =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,_faeg );_acbcg =TstISymbol (t ,scale ...);TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,1*_bbag );_acbcg =TstTSymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,_faeg );_acbcg =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,1*_bbag );_acbcg =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,1*_bbag );_acbcg =TstWSymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,0);*_egef =0;_fegb =5*_bbag +_faeg ;_acbcg =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,1*_bbag );_acbcg =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,_faeg );
|
|
_acbcg =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,1*_bbag );_acbcg =TstESymbol (t ,scale ...);TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,1*_bbag );_acbcg =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,1*_bbag );
|
|
_acbcg =TstESymbol (t ,scale ...);TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,1*_bbag );_acbcg =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_adgcf ,_acbcg ,_egef ,_fegb ,0);TstWriteSymbols (t ,_adgcf ,_ffcca );return _ffcca ;};func (_feab *Selection )setOrigin (_dgacc ,_bbcc int ){_feab .Cy ,_feab .Cx =_dgacc ,_bbcc };
|
|
func NewClassedPoints (points *Points ,classes _gb .IntSlice )(*ClassedPoints ,error ){const _egae ="\u004e\u0065w\u0043\u006c\u0061s\u0073\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073";if points ==nil {return nil ,_f .Error (_egae ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0070\u006f\u0069\u006e\u0074\u0073");
|
|
};if classes ==nil {return nil ,_f .Error (_egae ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0063\u006c\u0061ss\u0065\u0073");};_bfgb :=&ClassedPoints {Points :points ,IntSlice :classes };if _accb :=_bfgb .validateIntSlice ();_accb !=nil {return nil ,_f .Wrap (_accb ,_egae ,"");
|
|
};return _bfgb ,nil ;};type SizeComparison int ;func (_afd *Bitmap )String ()string {var _eedc ="\u000a";for _afg :=0;_afg < _afd .Height ;_afg ++{var _ggba string ;for _aceb :=0;_aceb < _afd .Width ;_aceb ++{_ccd :=_afd .GetPixel (_aceb ,_afg );if _ccd {_ggba +="\u0031";
|
|
}else {_ggba +="\u0030";};};_eedc +=_ggba +"\u000a";};return _eedc ;};func (_cfdb *byWidth )Len ()int {return len (_cfdb .Values )};func NewWithData (width ,height int ,data []byte )(*Bitmap ,error ){const _bdc ="N\u0065\u0077\u0057\u0069\u0074\u0068\u0044\u0061\u0074\u0061";
|
|
_fab :=_eed (width ,height );_fab .Data =data ;if len (data )< height *_fab .RowStride {return nil ,_f .Errorf (_bdc ,"\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 *_fab .RowStride );
|
|
};return _fab ,nil ;};func _adfa (_gadbd ,_egbb *Bitmap ,_bfdf ,_eae int )(*Bitmap ,error ){const _ggggb ="\u0063\u006c\u006f\u0073\u0065\u0042\u0072\u0069\u0063\u006b";if _egbb ==nil {return nil ,_f .Error (_ggggb ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _bfdf < 1||_eae < 1{return nil ,_f .Error (_ggggb ,"\u0068S\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0053\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _bfdf ==1&&_eae ==1{return _egbb .Copy (),nil ;};if _bfdf ==1||_eae ==1{_gfb :=SelCreateBrick (_eae ,_bfdf ,_eae /2,_bfdf /2,SelHit );
|
|
var _gbbd error ;_gadbd ,_gbbd =_cfad (_gadbd ,_egbb ,_gfb );if _gbbd !=nil {return nil ,_f .Wrap (_gbbd ,_ggggb ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _gadbd ,nil ;};_cfbg :=SelCreateBrick (1,_bfdf ,0,_bfdf /2,SelHit );_gbd :=SelCreateBrick (_eae ,1,_eae /2,0,SelHit );_aegcd ,_bfbg :=_bece (nil ,_egbb ,_cfbg );if _bfbg !=nil {return nil ,_f .Wrap (_bfbg ,_ggggb ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};if _gadbd ,_bfbg =_bece (_gadbd ,_aegcd ,_gbd );_bfbg !=nil {return nil ,_f .Wrap (_bfbg ,_ggggb ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_bfbg =_acca (_aegcd ,_gadbd ,_cfbg );_bfbg !=nil {return nil ,_f .Wrap (_bfbg ,_ggggb ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};if _ ,_bfbg =_acca (_gadbd ,_aegcd ,_gbd );_bfbg !=nil {return nil ,_f .Wrap (_bfbg ,_ggggb ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _gadbd ,nil ;};func _aebf (_ecdff *_gb .Stack )(_cgdg *fillSegment ,_bbgf error ){const _bbaef ="\u0070\u006f\u0070\u0046\u0069\u006c\u006c\u0053\u0065g\u006d\u0065\u006e\u0074";
|
|
if _ecdff ==nil {return nil ,_f .Error (_bbaef ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _ecdff .Aux ==nil {return nil ,_f .Error (_bbaef ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");
|
|
};_ffbe ,_bdbe :=_ecdff .Pop ();if !_bdbe {return nil ,nil ;};_bbgee ,_bdbe :=_ffbe .(*fillSegment );if !_bdbe {return nil ,_f .Error (_bbaef ,"\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");
|
|
};_cgdg =&fillSegment {_bbgee ._egca ,_bbgee ._efbba ,_bbgee ._deba +_bbgee ._bfabf ,_bbgee ._bfabf };_ecdff .Aux .Push (_bbgee );return _cgdg ,nil ;};func (_daag *Bitmap )GetChocolateData ()[]byte {if _daag .Color ==Vanilla {_daag .inverseData ();};return _daag .Data ;
|
|
};func (_daga *Bitmaps )GetBox (i int )(*_be .Rectangle ,error ){const _abdf ="\u0047\u0065\u0074\u0042\u006f\u0078";if _daga ==nil {return nil ,_f .Error (_abdf ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074\u006d\u0061\u0070s\u0027");
|
|
};if i > len (_daga .Boxes )-1{return nil ,_f .Errorf (_abdf ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _daga .Boxes [i ],nil ;};func TstNSymbol (t *_b .T ,scale ...int )*Bitmap {_gccbd ,_ffccg :=NewWithData (4,5,[]byte {0x90,0xD0,0xB0,0x90,0x90});
|
|
_a .NoError (t ,_ffccg );return TstGetScaledSymbol (t ,_gccbd ,scale ...);};func (_dfbg *Bitmap )equivalent (_adge *Bitmap )bool {if _dfbg ==_adge {return true ;};if !_dfbg .SizesEqual (_adge ){return false ;};_cbaf :=_dafd (_dfbg ,_adge ,CmbOpXor );_ffdc :=_dfbg .countPixels ();
|
|
_gaag :=int (0.25*float32 (_ffdc ));if _cbaf .thresholdPixelSum (_gaag ){return false ;};var (_gaed [9][9]int ;_ceac [18][9]int ;_efac [9][18]int ;_feb int ;_fcgb int ;);_ege :=9;_afaa :=_dfbg .Height /_ege ;_bac :=_dfbg .Width /_ege ;_bgf ,_aebe :=_afaa /2,_bac /2;
|
|
if _afaa < _bac {_bgf =_bac /2;_aebe =_afaa /2;};_adca :=float64 (_bgf )*float64 (_aebe )*_gg .Pi ;_fbeb :=int (float64 (_afaa *_bac /2)*0.9);_gegd :=int (float64 (_bac *_afaa /2)*0.9);for _acgg :=0;_acgg < _ege ;_acgg ++{_gbfb :=_bac *_acgg +_feb ;var _efde int ;
|
|
if _acgg ==_ege -1{_feb =0;_efde =_dfbg .Width ;}else {_efde =_gbfb +_bac ;if ((_dfbg .Width -_feb )%_ege )> 0{_feb ++;_efde ++;};};for _edce :=0;_edce < _ege ;_edce ++{_dea :=_afaa *_edce +_fcgb ;var _cag int ;if _edce ==_ege -1{_fcgb =0;_cag =_dfbg .Height ;
|
|
}else {_cag =_dea +_afaa ;if (_dfbg .Height -_fcgb )%_ege > 0{_fcgb ++;_cag ++;};};var _bbc ,_egge ,_acbe ,_aaad int ;_eda :=(_gbfb +_efde )/2;_acf :=(_dea +_cag )/2;for _gdb :=_gbfb ;_gdb < _efde ;_gdb ++{for _cdb :=_dea ;_cdb < _cag ;_cdb ++{if _cbaf .GetPixel (_gdb ,_cdb ){if _gdb < _eda {_bbc ++;
|
|
}else {_egge ++;};if _cdb < _acf {_aaad ++;}else {_acbe ++;};};};};_gaed [_acgg ][_edce ]=_bbc +_egge ;_ceac [_acgg *2][_edce ]=_bbc ;_ceac [_acgg *2+1][_edce ]=_egge ;_efac [_acgg ][_edce *2]=_aaad ;_efac [_acgg ][_edce *2+1]=_acbe ;};};for _beab :=0;
|
|
_beab < _ege *2-1;_beab ++{for _agdb :=0;_agdb < (_ege -1);_agdb ++{var _begc int ;for _eedb :=0;_eedb < 2;_eedb ++{for _cbba :=0;_cbba < 2;_cbba ++{_begc +=_ceac [_beab +_eedb ][_agdb +_cbba ];};};if _begc > _gegd {return false ;};};};for _dde :=0;_dde < (_ege -1);
|
|
_dde ++{for _gab :=0;_gab < ((_ege *2)-1);_gab ++{var _ecd int ;for _bfc :=0;_bfc < 2;_bfc ++{for _bcdd :=0;_bcdd < 2;_bcdd ++{_ecd +=_efac [_dde +_bfc ][_gab +_bcdd ];};};if _ecd > _fbeb {return false ;};};};for _ddea :=0;_ddea < (_ege -2);_ddea ++{for _dcbg :=0;
|
|
_dcbg < (_ege -2);_dcbg ++{var _beeg ,_gccf int ;for _agf :=0;_agf < 3;_agf ++{for _adbc :=0;_adbc < 3;_adbc ++{if _agf ==_adbc {_beeg +=_gaed [_ddea +_agf ][_dcbg +_adbc ];};if (2-_agf )==_adbc {_gccf +=_gaed [_ddea +_agf ][_dcbg +_adbc ];};};};if _beeg > _gegd ||_gccf > _gegd {return false ;
|
|
};};};for _cbc :=0;_cbc < (_ege -1);_cbc ++{for _gcdc :=0;_gcdc < (_ege -1);_gcdc ++{var _addb int ;for _beebb :=0;_beebb < 2;_beebb ++{for _aed :=0;_aed < 2;_aed ++{_addb +=_gaed [_cbc +_beebb ][_gcdc +_aed ];};};if float64 (_addb )> _adca {return false ;
|
|
};};};return true ;};const (MopDilation MorphOperation =iota ;MopErosion ;MopOpening ;MopClosing ;MopRankBinaryReduction ;MopReplicativeBinaryExpansion ;MopAddBorder ;);func (_dabf *Bitmaps )AddBitmap (bm *Bitmap ){_dabf .Values =append (_dabf .Values ,bm )};
|
|
func _aafbg (_ebag ,_eebe int ,_gfgge string )*Selection {_ddfb :=&Selection {Height :_ebag ,Width :_eebe ,Name :_gfgge };_ddfb .Data =make ([][]SelectionValue ,_ebag );for _ccgba :=0;_ccgba < _ebag ;_ccgba ++{_ddfb .Data [_ccgba ]=make ([]SelectionValue ,_eebe );
|
|
};return _ddfb ;};func (_efceb *ClassedPoints )XAtIndex (i int )float32 {return (*_efceb .Points )[_efceb .IntSlice [i ]].X };func _feaa (_fcef ,_bdf *Bitmap ,_ebbc ,_ddff int )(*Bitmap ,error ){const _ecfg ="\u0063\u006c\u006f\u0073\u0065\u0053\u0061\u0066\u0065B\u0072\u0069\u0063\u006b";
|
|
if _bdf ==nil {return nil ,_f .Error (_ecfg ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _ebbc < 1||_ddff < 1{return nil ,_f .Error (_ecfg ,"\u0068s\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");
|
|
};if _ebbc ==1&&_ddff ==1{return _dgf (_fcef ,_bdf );};if MorphBC ==SymmetricMorphBC {_aecg ,_ccf :=_adfa (_fcef ,_bdf ,_ebbc ,_ddff );if _ccf !=nil {return nil ,_f .Wrap (_ccf ,_ecfg ,"\u0053\u0079m\u006d\u0065\u0074r\u0069\u0063\u004d\u006f\u0072\u0070\u0068\u0042\u0043");
|
|
};return _aecg ,nil ;};_gcfa :=_dgfg (_ebbc /2,_ddff /2);_fgbc :=8*((_gcfa +7)/8);_gfaa ,_ggfg :=_bdf .AddBorder (_fgbc ,0);if _ggfg !=nil {return nil ,_f .Wrapf (_ggfg ,_ecfg ,"\u0042\u006f\u0072\u0064\u0065\u0072\u0053\u0069\u007ae\u003a\u0020\u0025\u0064",_fgbc );
|
|
};var _gffa ,_bfbe *Bitmap ;if _ebbc ==1||_ddff ==1{_dacc :=SelCreateBrick (_ddff ,_ebbc ,_ddff /2,_ebbc /2,SelHit );_gffa ,_ggfg =_cfad (nil ,_gfaa ,_dacc );if _ggfg !=nil {return nil ,_f .Wrap (_ggfg ,_ecfg ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};}else {_gdfg :=SelCreateBrick (1,_ebbc ,0,_ebbc /2,SelHit );_cccf ,_dabg :=_bece (nil ,_gfaa ,_gdfg );if _dabg !=nil {return nil ,_f .Wrap (_dabg ,_ecfg ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0064\u0069\u006c\u0061t\u0065");
|
|
};_cbgc :=SelCreateBrick (_ddff ,1,_ddff /2,0,SelHit );_gffa ,_dabg =_bece (nil ,_cccf ,_cbgc );if _dabg !=nil {return nil ,_f .Wrap (_dabg ,_ecfg ,"\u0072\u0065\u0067ul\u0061\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};if _ ,_dabg =_acca (_cccf ,_gffa ,_gdfg );_dabg !=nil {return nil ,_f .Wrap (_dabg ,_ecfg ,"r\u0065\u0067\u0075\u006car\u0020-\u0020\u0066\u0069\u0072\u0073t\u0020\u0065\u0072\u006f\u0064\u0065");};if _ ,_dabg =_acca (_gffa ,_cccf ,_cbgc );_dabg !=nil {return nil ,_f .Wrap (_dabg ,_ecfg ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0065\u0072\u006fd\u0065");
|
|
};};if _bfbe ,_ggfg =_gffa .RemoveBorder (_fgbc );_ggfg !=nil {return nil ,_f .Wrap (_ggfg ,_ecfg ,"\u0072e\u0067\u0075\u006c\u0061\u0072");};if _fcef ==nil {return _bfbe ,nil ;};if _ ,_ggfg =_dgf (_fcef ,_bfbe );_ggfg !=nil {return nil ,_ggfg ;};return _fcef ,nil ;
|
|
};var (_facgf *Bitmap ;_cbafa *Bitmap ;);func _eed (_dfc ,_bgge int )*Bitmap {return &Bitmap {Width :_dfc ,Height :_bgge ,RowStride :(_dfc +7)>>3};};func MorphSequence (src *Bitmap ,sequence ...MorphProcess )(*Bitmap ,error ){return _aege (src ,sequence ...);
|
|
};func _fdf (_febg ,_egcf *Bitmap ,_ddfc ,_gggb ,_ddfcd ,_affc ,_acd ,_bfgd ,_fdef ,_gabb int ,_aedc CombinationOperator )error {var _ffbcg int ;_gbbb :=func (){_ffbcg ++;_ddfcd +=_egcf .RowStride ;_affc +=_febg .RowStride ;_acd +=_febg .RowStride };for _ffbcg =_ddfc ;
|
|
_ffbcg < _gggb ;_gbbb (){var _dbce uint16 ;_cffg :=_ddfcd ;for _gbcg :=_affc ;_gbcg <=_acd ;_gbcg ++{_fbcb ,_fgg :=_egcf .GetByte (_cffg );if _fgg !=nil {return _fgg ;};_cbae ,_fgg :=_febg .GetByte (_gbcg );if _fgg !=nil {return _fgg ;};_dbce =(_dbce |uint16 (_cbae ))<<uint (_gabb );
|
|
_cbae =byte (_dbce >>8);if _gbcg ==_acd {_cbae =_ecdc (uint (_bfgd ),_cbae );};if _fgg =_egcf .SetByte (_cffg ,_begf (_fbcb ,_cbae ,_aedc ));_fgg !=nil {return _fgg ;};_cffg ++;_dbce <<=uint (_fdef );};};return nil ;};func (_gdcba *BitmapsArray )AddBitmaps (bm *Bitmaps ){_gdcba .Values =append (_gdcba .Values ,bm )};
|
|
func TstWordBitmapWithSpaces (t *_b .T ,scale ...int )*Bitmap {_gabeb :=1;if len (scale )> 0{_gabeb =scale [0];};_gbcf :=3;_fcfg :=9+7+15+2*_gbcf +2*_gbcf ;_dcff :=5+_gbcf +5+2*_gbcf ;_cfbf :=New (_fcfg *_gabeb ,_dcff *_gabeb );_bedgc :=&Bitmaps {};var _eega *int ;
|
|
_gbcf *=_gabeb ;_fffa :=_gbcf ;_eega =&_fffa ;_bgag :=_gbcf ;_efccf :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,1*_gabeb );_efccf =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,_gbcf );_efccf =TstISymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,1*_gabeb );_efccf =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,_gbcf );_efccf =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,1*_gabeb );_efccf =TstOSymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,1*_gabeb );_efccf =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,0);*_eega =_gbcf ;_bgag =5*_gabeb +_gbcf ;_efccf =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,1*_gabeb );
|
|
_efccf =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,_gbcf );_efccf =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,1*_gabeb );_efccf =TstESymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,1*_gabeb );
|
|
_efccf =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,1*_gabeb );_efccf =TstESymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,1*_gabeb );_efccf =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_bedgc ,_efccf ,_eega ,_bgag ,0);
|
|
TstWriteSymbols (t ,_bedgc ,_cfbf );return _cfbf ;};func _begf (_cdagc ,_deee byte ,_gfcd CombinationOperator )byte {switch _gfcd {case CmbOpOr :return _deee |_cdagc ;case CmbOpAnd :return _deee &_cdagc ;case CmbOpXor :return _deee ^_cdagc ;case CmbOpXNor :return ^(_deee ^_cdagc );
|
|
case CmbOpNot :return ^(_deee );default:return _deee ;};};func (_bbbd *Bitmap )ConnComponents (bms *Bitmaps ,connectivity int )(_bffc *Boxes ,_gcb error ){const _faa ="B\u0069\u0074\u006d\u0061p.\u0043o\u006e\u006e\u0043\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0073";
|
|
if _bbbd ==nil {return nil ,_f .Error (_faa ,"\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 ,_f .Error (_faa ,"\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 _bffc ,_gcb =_bbbd .connComponentsBB (connectivity );_gcb !=nil {return nil ,_f .Wrap (_gcb ,_faa ,"");};}else {if _bffc ,_gcb =_bbbd .connComponentsBitmapsBB (bms ,connectivity );_gcb !=nil {return nil ,_f .Wrap (_gcb ,_faa ,"");};};
|
|
return _bffc ,nil ;};func TstFrameBitmapData ()[]byte {return _facgf .Data };func (_cgfc MorphProcess )verify (_fadbe int ,_caaa ,_daee *int )error {const _abaa ="\u004d\u006f\u0072\u0070hP\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u0076\u0065\u0072\u0069\u0066\u0079";
|
|
switch _cgfc .Operation {case MopDilation ,MopErosion ,MopOpening ,MopClosing :if len (_cgfc .Arguments )!=2{return _f .Error (_abaa ,"\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");
|
|
};_ceff ,_ceeb :=_cgfc .getWidthHeight ();if _ceff <=0||_ceeb <=0{return _f .Error (_abaa ,"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 :_eddf :=len (_cgfc .Arguments );*_caaa +=_eddf ;if _eddf < 1||_eddf > 4{return _f .Error (_abaa ,"\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 _dffb :=0;_dffb < _eddf ;_dffb ++{if _cgfc .Arguments [_dffb ]< 1||_cgfc .Arguments [_dffb ]> 4{return _f .Error (_abaa ,"\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 (_cgfc .Arguments )==0{return _f .Error (_abaa ,"\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");
|
|
};_acdg :=_cgfc .Arguments [0];if _acdg !=2&&_acdg !=4&&_acdg !=8{return _f .Error (_abaa ,"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");
|
|
};*_caaa -=_fgge [_acdg /4];case MopAddBorder :if len (_cgfc .Arguments )==0{return _f .Error (_abaa ,"\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");
|
|
};_agaa :=_cgfc .Arguments [0];if _fadbe > 0{return _f .Error (_abaa ,"\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 _agaa < 1{return _f .Error (_abaa ,"\u0041\u0064\u0064\u0042o\u0072\u0064\u0065\u0072\u0020\u0076\u0061\u006c\u0075\u0065 \u006co\u0077\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};*_daee =_agaa ;};return nil ;};func (_eeb *Bitmap )AddBorder (borderSize ,val int )(*Bitmap ,error ){if borderSize ==0{return _eeb .Copy (),nil ;
|
|
};_gacd ,_cdf :=_eeb .addBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize ,val );if _cdf !=nil {return nil ,_f .Wrap (_cdf ,"\u0041d\u0064\u0042\u006f\u0072\u0064\u0065r","");};return _gacd ,nil ;};func _aggf (_eece ,_eee int )int {if _eece < _eee {return _eece ;
|
|
};return _eee ;};func _gadd (_bcdb ,_fcdc *Bitmap ,_ddfd *Selection )(*Bitmap ,error ){const _adecc ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0032";var _dcec ,_fbcgf int ;if _fcdc ==nil {return nil ,_f .Error (_adecc ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
};if _ddfd ==nil {return nil ,_f .Error (_adecc ,"\u0073e\u006c \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};_dcec =_ddfd .Width ;_fbcgf =_ddfd .Height ;if _dcec ==0||_fbcgf ==0{return nil ,_f .Error (_adecc ,"\u0073\u0065\u006c\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");
|
|
};if _bcdb ==nil {return _fcdc .createTemplate (),nil ;};if _acga :=_bcdb .resizeImageData (_fcdc );_acga !=nil {return nil ,_acga ;};return _bcdb ,nil ;};type LocationFilter int ;var _dfga =[]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 TstWSymbol (t *_b .T ,scale ...int )*Bitmap {_dggd ,_fdfd :=NewWithData (5,5,[]byte {0x88,0x88,0xA8,0xD8,0x88});_a .NoError (t ,_fdfd );return TstGetScaledSymbol (t ,_dggd ,scale ...);};func _beabb (_eecef ,_adaag ,_afef byte )byte {return (_eecef &^(_afef ))|(_adaag &_afef )};
|
|
func _fafba (_gefgf *Bitmap ,_febe ,_egce ,_gbgb ,_ccda int ,_dadec RasterOperator ,_ecbe *Bitmap ,_gcdg ,_dbdg int )error {var (_eecec bool ;_gaacg bool ;_fbbbe byte ;_cggf int ;_ccgd int ;_afdf int ;_cefc int ;_gded bool ;_cgceb int ;_dgfe int ;_afgc int ;
|
|
_fdda bool ;_ggee byte ;_gebb int ;_gdea int ;_cfcd int ;_fbfgc byte ;_gegb int ;_baed int ;_ggga uint ;_bbabg uint ;_defc byte ;_ddcf shift ;_dfab bool ;_cbga bool ;_fedaa ,_bcc int ;);if _gcdg &7!=0{_baed =8-(_gcdg &7);};if _febe &7!=0{_ccgd =8-(_febe &7);
|
|
};if _baed ==0&&_ccgd ==0{_defc =_aecd [0];}else {if _ccgd > _baed {_ggga =uint (_ccgd -_baed );}else {_ggga =uint (8-(_baed -_ccgd ));};_bbabg =8-_ggga ;_defc =_aecd [_ggga ];};if (_febe &7)!=0{_eecec =true ;_cggf =8-(_febe &7);_fbbbe =_aecd [_cggf ];
|
|
_afdf =_gefgf .RowStride *_egce +(_febe >>3);_cefc =_ecbe .RowStride *_dbdg +(_gcdg >>3);_gegb =8-(_gcdg &7);if _cggf > _gegb {_ddcf =_fdcb ;if _gbgb >=_baed {_dfab =true ;};}else {_ddcf =_fced ;};};if _gbgb < _cggf {_gaacg =true ;_fbbbe &=_afcbe [8-_cggf +_gbgb ];
|
|
};if !_gaacg {_cgceb =(_gbgb -_cggf )>>3;if _cgceb !=0{_gded =true ;_dgfe =_gefgf .RowStride *_egce +((_febe +_ccgd )>>3);_afgc =_ecbe .RowStride *_dbdg +((_gcdg +_ccgd )>>3);};};_gebb =(_febe +_gbgb )&7;if !(_gaacg ||_gebb ==0){_fdda =true ;_ggee =_afcbe [_gebb ];
|
|
_gdea =_gefgf .RowStride *_egce +((_febe +_ccgd )>>3)+_cgceb ;_cfcd =_ecbe .RowStride *_dbdg +((_gcdg +_ccgd )>>3)+_cgceb ;if _gebb > int (_bbabg ){_cbga =true ;};};switch _dadec {case PixSrc :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;
|
|
if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;};_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],_fbfgc ,_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;};};if _gded {for _fedaa =0;
|
|
_fedaa < _ccda ;_fedaa ++{for _bcc =0;_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );_gefgf .Data [_dgfe +_bcc ]=_fbfgc ;};_dgfe +=_gefgf .RowStride ;_afgc +=_ecbe .RowStride ;};};
|
|
if _fdda {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],_fbfgc ,_ggee );_gdea +=_gefgf .RowStride ;
|
|
_cfcd +=_ecbe .RowStride ;};};case PixNotSrc :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;
|
|
};_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],^_fbfgc ,_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;};};if _gded {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{for _bcc =0;_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );
|
|
_gefgf .Data [_dgfe +_bcc ]=^_fbfgc ;};_dgfe +=_gefgf .RowStride ;_afgc +=_ecbe .RowStride ;};};if _fdda {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );
|
|
};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],^_fbfgc ,_ggee );_gdea +=_gefgf .RowStride ;_cfcd +=_ecbe .RowStride ;};};case PixSrcOrDst :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;
|
|
if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;};_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],_fbfgc |_gefgf .Data [_afdf ],_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;
|
|
};};if _gded {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{for _bcc =0;_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );_gefgf .Data [_dgfe +_bcc ]|=_fbfgc ;};_dgfe +=_gefgf .RowStride ;
|
|
_afgc +=_ecbe .RowStride ;};};if _fdda {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],_fbfgc |_gefgf .Data [_gdea ],_ggee );
|
|
_gdea +=_gefgf .RowStride ;_cfcd +=_ecbe .RowStride ;};};case PixSrcAndDst :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );
|
|
};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;};_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],_fbfgc &_gefgf .Data [_afdf ],_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;};};if _gded {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{for _bcc =0;
|
|
_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );_gefgf .Data [_dgfe +_bcc ]&=_fbfgc ;};_dgfe +=_gefgf .RowStride ;_afgc +=_ecbe .RowStride ;};};if _fdda {for _fedaa =0;_fedaa < _ccda ;
|
|
_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],_fbfgc &_gefgf .Data [_gdea ],_ggee );_gdea +=_gefgf .RowStride ;_cfcd +=_ecbe .RowStride ;
|
|
};};case PixSrcXorDst :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;};
|
|
_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],_fbfgc ^_gefgf .Data [_afdf ],_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;};};if _gded {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{for _bcc =0;_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );
|
|
_gefgf .Data [_dgfe +_bcc ]^=_fbfgc ;};_dgfe +=_gefgf .RowStride ;_afgc +=_ecbe .RowStride ;};};if _fdda {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );
|
|
};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],_fbfgc ^_gefgf .Data [_gdea ],_ggee );_gdea +=_gefgf .RowStride ;_cfcd +=_ecbe .RowStride ;};};case PixNotSrcOrDst :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;
|
|
if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;};_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],^_fbfgc |_gefgf .Data [_afdf ],_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;
|
|
};};if _gded {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{for _bcc =0;_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );_gefgf .Data [_dgfe +_bcc ]|=^_fbfgc ;};_dgfe +=_gefgf .RowStride ;
|
|
_afgc +=_ecbe .RowStride ;};};if _fdda {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],^_fbfgc |_gefgf .Data [_gdea ],_ggee );
|
|
_gdea +=_gefgf .RowStride ;_cfcd +=_ecbe .RowStride ;};};case PixNotSrcAndDst :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );
|
|
};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;};_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],^_fbfgc &_gefgf .Data [_afdf ],_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;};};if _gded {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{for _bcc =0;
|
|
_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );_gefgf .Data [_dgfe +_bcc ]&=^_fbfgc ;};_dgfe +=_gefgf .RowStride ;_afgc +=_ecbe .RowStride ;};};if _fdda {for _fedaa =0;_fedaa < _ccda ;
|
|
_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],^_fbfgc &_gefgf .Data [_gdea ],_ggee );_gdea +=_gefgf .RowStride ;_cfcd +=_ecbe .RowStride ;
|
|
};};case PixSrcOrNotDst :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;
|
|
};_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],_fbfgc |^_gefgf .Data [_afdf ],_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;};};if _gded {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{for _bcc =0;_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );
|
|
_gefgf .Data [_dgfe +_bcc ]=_fbfgc |^_gefgf .Data [_dgfe +_bcc ];};_dgfe +=_gefgf .RowStride ;_afgc +=_ecbe .RowStride ;};};if _fdda {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );
|
|
};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],_fbfgc |^_gefgf .Data [_gdea ],_ggee );_gdea +=_gefgf .RowStride ;_cfcd +=_ecbe .RowStride ;};};case PixSrcAndNotDst :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;
|
|
if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;};_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],_fbfgc &^_gefgf .Data [_afdf ],_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;
|
|
};};if _gded {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{for _bcc =0;_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );_gefgf .Data [_dgfe +_bcc ]=_fbfgc &^_gefgf .Data [_dgfe +_bcc ];};
|
|
_dgfe +=_gefgf .RowStride ;_afgc +=_ecbe .RowStride ;};};if _fdda {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],_fbfgc &^_gefgf .Data [_gdea ],_ggee );
|
|
_gdea +=_gefgf .RowStride ;_cfcd +=_ecbe .RowStride ;};};case PixNotPixSrcOrDst :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );
|
|
};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;};_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],^(_fbfgc |_gefgf .Data [_afdf ]),_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;};};if _gded {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{for _bcc =0;
|
|
_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );_gefgf .Data [_dgfe +_bcc ]=^(_fbfgc |_gefgf .Data [_dgfe +_bcc ]);};_dgfe +=_gefgf .RowStride ;_afgc +=_ecbe .RowStride ;};};if _fdda {for _fedaa =0;
|
|
_fedaa < _ccda ;_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],^(_fbfgc |_gefgf .Data [_gdea ]),_ggee );_gdea +=_gefgf .RowStride ;
|
|
_cfcd +=_ecbe .RowStride ;};};case PixNotPixSrcAndDst :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;
|
|
};_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],^(_fbfgc &_gefgf .Data [_afdf ]),_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;};};if _gded {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{for _bcc =0;_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );
|
|
_gefgf .Data [_dgfe +_bcc ]=^(_fbfgc &_gefgf .Data [_dgfe +_bcc ]);};_dgfe +=_gefgf .RowStride ;_afgc +=_ecbe .RowStride ;};};if _fdda {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );
|
|
};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],^(_fbfgc &_gefgf .Data [_gdea ]),_ggee );_gdea +=_gefgf .RowStride ;_cfcd +=_ecbe .RowStride ;};};case PixNotPixSrcXorDst :if _eecec {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{if _ddcf ==_fdcb {_fbfgc =_ecbe .Data [_cefc ]<<_ggga ;
|
|
if _dfab {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cefc +1]>>_bbabg ,_defc );};}else {_fbfgc =_ecbe .Data [_cefc ]>>_bbabg ;};_gefgf .Data [_afdf ]=_beabb (_gefgf .Data [_afdf ],^(_fbfgc ^_gefgf .Data [_afdf ]),_fbbbe );_afdf +=_gefgf .RowStride ;_cefc +=_ecbe .RowStride ;
|
|
};};if _gded {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{for _bcc =0;_bcc < _cgceb ;_bcc ++{_fbfgc =_beabb (_ecbe .Data [_afgc +_bcc ]<<_ggga ,_ecbe .Data [_afgc +_bcc +1]>>_bbabg ,_defc );_gefgf .Data [_dgfe +_bcc ]=^(_fbfgc ^_gefgf .Data [_dgfe +_bcc ]);
|
|
};_dgfe +=_gefgf .RowStride ;_afgc +=_ecbe .RowStride ;};};if _fdda {for _fedaa =0;_fedaa < _ccda ;_fedaa ++{_fbfgc =_ecbe .Data [_cfcd ]<<_ggga ;if _cbga {_fbfgc =_beabb (_fbfgc ,_ecbe .Data [_cfcd +1]>>_bbabg ,_defc );};_gefgf .Data [_gdea ]=_beabb (_gefgf .Data [_gdea ],^(_fbfgc ^_gefgf .Data [_gdea ]),_ggee );
|
|
_gdea +=_gefgf .RowStride ;_cfcd +=_ecbe .RowStride ;};};default:_ca .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",_dadec );
|
|
return _f .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 (_afdb *Bitmaps )SortByWidth (){_fbac :=(*byWidth )(_afdb );_cc .Sort (_fbac )};func _gfece (_agba *Bitmap ,_abgac ,_gcbe ,_edac ,_cged int ,_aefb RasterOperator ,_debb *Bitmap ,_bgad ,_gcgbg int )error {var (_acbc bool ;_agec bool ;
|
|
_aecb int ;_gfga int ;_edgaa int ;_bbae bool ;_gcae byte ;_cfeg int ;_fcdce int ;_edcd int ;_egaaf ,_dccg int ;);_eegd :=8-(_abgac &7);_fddb :=_aecd [_eegd ];_gdbc :=_agba .RowStride *_gcbe +(_abgac >>3);_ddda :=_debb .RowStride *_gcgbg +(_bgad >>3);if _edac < _eegd {_acbc =true ;
|
|
_fddb &=_afcbe [8-_eegd +_edac ];};if !_acbc {_aecb =(_edac -_eegd )>>3;if _aecb > 0{_agec =true ;_gfga =_gdbc +1;_edgaa =_ddda +1;};};_cfeg =(_abgac +_edac )&7;if !(_acbc ||_cfeg ==0){_bbae =true ;_gcae =_afcbe [_cfeg ];_fcdce =_gdbc +1+_aecb ;_edcd =_ddda +1+_aecb ;
|
|
};switch _aefb {case PixSrc :for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],_debb .Data [_ddda ],_fddb );_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;};if _agec {for _egaaf =0;_egaaf < _cged ;_egaaf ++{for _dccg =0;
|
|
_dccg < _aecb ;_dccg ++{_agba .Data [_gfga +_dccg ]=_debb .Data [_edgaa +_dccg ];};_gfga +=_agba .RowStride ;_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],_debb .Data [_edcd ],_gcae );
|
|
_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};case PixNotSrc :for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],^_debb .Data [_ddda ],_fddb );_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;};if _agec {for _egaaf =0;
|
|
_egaaf < _cged ;_egaaf ++{for _dccg =0;_dccg < _aecb ;_dccg ++{_agba .Data [_gfga +_dccg ]=^_debb .Data [_edgaa +_dccg ];};_gfga +=_agba .RowStride ;_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],^_debb .Data [_edcd ],_gcae );
|
|
_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};case PixSrcOrDst :for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],_debb .Data [_ddda ]|_agba .Data [_gdbc ],_fddb );_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;
|
|
};if _agec {for _egaaf =0;_egaaf < _cged ;_egaaf ++{for _dccg =0;_dccg < _aecb ;_dccg ++{_agba .Data [_gfga +_dccg ]|=_debb .Data [_edgaa +_dccg ];};_gfga +=_agba .RowStride ;_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],_debb .Data [_edcd ]|_agba .Data [_fcdce ],_gcae );
|
|
_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};case PixSrcAndDst :for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],_debb .Data [_ddda ]&_agba .Data [_gdbc ],_fddb );_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;
|
|
};if _agec {for _egaaf =0;_egaaf < _cged ;_egaaf ++{for _dccg =0;_dccg < _aecb ;_dccg ++{_agba .Data [_gfga +_dccg ]&=_debb .Data [_edgaa +_dccg ];};_gfga +=_agba .RowStride ;_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],_debb .Data [_edcd ]&_agba .Data [_fcdce ],_gcae );
|
|
_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};case PixSrcXorDst :for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],_debb .Data [_ddda ]^_agba .Data [_gdbc ],_fddb );_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;
|
|
};if _agec {for _egaaf =0;_egaaf < _cged ;_egaaf ++{for _dccg =0;_dccg < _aecb ;_dccg ++{_agba .Data [_gfga +_dccg ]^=_debb .Data [_edgaa +_dccg ];};_gfga +=_agba .RowStride ;_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],_debb .Data [_edcd ]^_agba .Data [_fcdce ],_gcae );
|
|
_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};case PixNotSrcOrDst :for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],^(_debb .Data [_ddda ])|_agba .Data [_gdbc ],_fddb );_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;
|
|
};if _agec {for _egaaf =0;_egaaf < _cged ;_egaaf ++{for _dccg =0;_dccg < _aecb ;_dccg ++{_agba .Data [_gfga +_dccg ]|=^(_debb .Data [_edgaa +_dccg ]);};_gfga +=_agba .RowStride ;_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],^(_debb .Data [_edcd ])|_agba .Data [_fcdce ],_gcae );
|
|
_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};case PixNotSrcAndDst :for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],^(_debb .Data [_ddda ])&_agba .Data [_gdbc ],_fddb );_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;
|
|
};if _agec {for _egaaf =0;_egaaf < _cged ;_egaaf ++{for _dccg =0;_dccg < _aecb ;_dccg ++{_agba .Data [_gfga +_dccg ]&=^_debb .Data [_edgaa +_dccg ];};_gfga +=_agba .RowStride ;_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],^(_debb .Data [_edcd ])&_agba .Data [_fcdce ],_gcae );
|
|
_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};case PixSrcOrNotDst :for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],_debb .Data [_ddda ]|^(_agba .Data [_gdbc ]),_fddb );_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;
|
|
};if _agec {for _egaaf =0;_egaaf < _cged ;_egaaf ++{for _dccg =0;_dccg < _aecb ;_dccg ++{_agba .Data [_gfga +_dccg ]=_debb .Data [_edgaa +_dccg ]|^(_agba .Data [_gfga +_dccg ]);};_gfga +=_agba .RowStride ;_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;
|
|
_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],_debb .Data [_edcd ]|^(_agba .Data [_fcdce ]),_gcae );_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};case PixSrcAndNotDst :for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],_debb .Data [_ddda ]&^(_agba .Data [_gdbc ]),_fddb );
|
|
_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;};if _agec {for _egaaf =0;_egaaf < _cged ;_egaaf ++{for _dccg =0;_dccg < _aecb ;_dccg ++{_agba .Data [_gfga +_dccg ]=_debb .Data [_edgaa +_dccg ]&^(_agba .Data [_gfga +_dccg ]);};_gfga +=_agba .RowStride ;
|
|
_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],_debb .Data [_edcd ]&^(_agba .Data [_fcdce ]),_gcae );_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};case PixNotPixSrcOrDst :for _egaaf =0;
|
|
_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],^(_debb .Data [_ddda ]|_agba .Data [_gdbc ]),_fddb );_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;};if _agec {for _egaaf =0;_egaaf < _cged ;_egaaf ++{for _dccg =0;_dccg < _aecb ;
|
|
_dccg ++{_agba .Data [_gfga +_dccg ]=^(_debb .Data [_edgaa +_dccg ]|_agba .Data [_gfga +_dccg ]);};_gfga +=_agba .RowStride ;_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],^(_debb .Data [_edcd ]|_agba .Data [_fcdce ]),_gcae );
|
|
_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};case PixNotPixSrcAndDst :for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],^(_debb .Data [_ddda ]&_agba .Data [_gdbc ]),_fddb );_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;
|
|
};if _agec {for _egaaf =0;_egaaf < _cged ;_egaaf ++{for _dccg =0;_dccg < _aecb ;_dccg ++{_agba .Data [_gfga +_dccg ]=^(_debb .Data [_edgaa +_dccg ]&_agba .Data [_gfga +_dccg ]);};_gfga +=_agba .RowStride ;_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;
|
|
_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],^(_debb .Data [_edcd ]&_agba .Data [_fcdce ]),_gcae );_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};case PixNotPixSrcXorDst :for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_gdbc ]=_beabb (_agba .Data [_gdbc ],^(_debb .Data [_ddda ]^_agba .Data [_gdbc ]),_fddb );
|
|
_gdbc +=_agba .RowStride ;_ddda +=_debb .RowStride ;};if _agec {for _egaaf =0;_egaaf < _cged ;_egaaf ++{for _dccg =0;_dccg < _aecb ;_dccg ++{_agba .Data [_gfga +_dccg ]=^(_debb .Data [_edgaa +_dccg ]^_agba .Data [_gfga +_dccg ]);};_gfga +=_agba .RowStride ;
|
|
_edgaa +=_debb .RowStride ;};};if _bbae {for _egaaf =0;_egaaf < _cged ;_egaaf ++{_agba .Data [_fcdce ]=_beabb (_agba .Data [_fcdce ],^(_debb .Data [_edcd ]^_agba .Data [_fcdce ]),_gcae );_fcdce +=_agba .RowStride ;_edcd +=_debb .RowStride ;};};default:_ca .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",_aefb );
|
|
return _f .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 ;};type Selection struct{Height ,Width int ;Cx ,Cy int ;Name string ;Data [][]SelectionValue ;};type Component int ;func (_ccc *Bitmap )SetDefaultPixel (){for _efd :=range _ccc .Data {_ccc .Data [_efd ]=byte (0xff);};};type BitmapsArray struct{Values []*Bitmaps ;
|
|
Boxes []*_be .Rectangle ;};func (_gfdb *byHeight )Less (i ,j int )bool {return _gfdb .Values [i ].Height < _gfdb .Values [j ].Height };func _df (_cba ,_ef *Bitmap )(_da error ){const _gd ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0034";
|
|
_fg :=_ef .RowStride ;_bg :=_cba .RowStride ;_cbb :=_ef .RowStride *4-_cba .RowStride ;var (_cac ,_fb byte ;_ec uint32 ;_efa ,_de ,_gbg ,_fge ,_ba ,_ffa ,_gfg int ;);for _gbg =0;_gbg < _ef .Height ;_gbg ++{_efa =_gbg *_fg ;_de =4*_gbg *_bg ;for _fge =0;
|
|
_fge < _fg ;_fge ++{_cac =_ef .Data [_efa +_fge ];_ec =_gdda [_cac ];_ffa =_de +_fge *4;if _cbb !=0&&(_fge +1)*4> _cba .RowStride {for _ba =_cbb ;_ba > 0;_ba --{_fb =byte ((_ec >>uint (_ba *8))&0xff);_gfg =_ffa +(_cbb -_ba );if _da =_cba .SetByte (_gfg ,_fb );
|
|
_da !=nil {return _f .Wrapf (_da ,_gd ,"D\u0069\u0066\u0066\u0065\u0072\u0065n\u0074\u0020\u0072\u006f\u0077\u0073\u0074\u0072\u0069d\u0065\u0073\u002e \u004b:\u0020\u0025\u0064",_ba );};};}else if _da =_cba .setFourBytes (_ffa ,_ec );_da !=nil {return _f .Wrap (_da ,_gd ,"");
|
|
};if _da =_cba .setFourBytes (_de +_fge *4,_gdda [_ef .Data [_efa +_fge ]]);_da !=nil {return _f .Wrap (_da ,_gd ,"");};};for _ba =1;_ba < 4;_ba ++{for _fge =0;_fge < _bg ;_fge ++{if _da =_cba .SetByte (_de +_ba *_bg +_fge ,_cba .Data [_de +_fge ]);_da !=nil {return _f .Wrapf (_da ,_gd ,"\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",_ba ,_fge );
|
|
};};};};return nil ;};func _ecff (_dbgg *_gb .Stack ,_daebf ,_bcabf ,_ead ,_dffe ,_gggc int ,_fgdf *_be .Rectangle )(_bcbdd error ){const _cfaf ="\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 _dbgg ==nil {return _f .Error (_cfaf ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _fgdf ==nil {return _f .Error (_cfaf ,"\u0070\u0072\u006f\u0076i\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0069\u006da\u0067e\u002e\u0052\u0065\u0063\u0074\u0061\u006eg\u006c\u0065");
|
|
};_fgdf .Min .X =_gb .Min (_fgdf .Min .X ,_daebf );_fgdf .Max .X =_gb .Max (_fgdf .Max .X ,_bcabf );_fgdf .Min .Y =_gb .Min (_fgdf .Min .Y ,_ead );_fgdf .Max .Y =_gb .Max (_fgdf .Max .Y ,_ead );if !(_ead +_dffe >=0&&_ead +_dffe <=_gggc ){return nil ;};
|
|
if _dbgg .Aux ==nil {return _f .Error (_cfaf ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};var _acfgg *fillSegment ;_egfd ,_bfbf :=_dbgg .Aux .Pop ();if _bfbf {if _acfgg ,_bfbf =_egfd .(*fillSegment );
|
|
!_bfbf {return _f .Error (_cfaf ,"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 {_acfgg =&fillSegment {};
|
|
};_acfgg ._egca =_daebf ;_acfgg ._efbba =_bcabf ;_acfgg ._deba =_ead ;_acfgg ._bfabf =_dffe ;_dbgg .Push (_acfgg );return nil ;};func _cfad (_feda ,_acce *Bitmap ,_ecfce *Selection )(*Bitmap ,error ){const _bedb ="c\u006c\u006f\u0073\u0065\u0042\u0069\u0074\u006d\u0061\u0070";
|
|
var _bbd error ;if _feda ,_bbd =_gadd (_feda ,_acce ,_ecfce );_bbd !=nil {return nil ,_bbd ;};_ebcf ,_bbd :=_bece (nil ,_acce ,_ecfce );if _bbd !=nil {return nil ,_f .Wrap (_bbd ,_bedb ,"");};if _ ,_bbd =_acca (_feda ,_ebcf ,_ecfce );_bbd !=nil {return nil ,_f .Wrap (_bbd ,_bedb ,"");
|
|
};return _feda ,nil ;};func CorrelationScoreSimple (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_geed float64 ,_cdde error ){const _cgeg ="\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 _geed ,_f .Error (_cgeg ,"n\u0069l\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0073 \u0070\u0072\u006f\u0076id\u0065\u0064");};if tab ==nil {return _geed ,_f .Error (_cgeg ,"\u0074\u0061\u0062\u0020\u0075\u006e\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if area1 ==0||area2 ==0{return _geed ,_f .Error (_cgeg ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0061\u0072e\u0061\u0073\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u003e\u0020\u0030");};_aedf ,_aaea :=bm1 .Width ,bm1 .Height ;_beabe ,_ggbca :=bm2 .Width ,bm2 .Height ;
|
|
if _dded (_aedf -_beabe )> maxDiffW {return 0,nil ;};if _dded (_aaea -_ggbca )> maxDiffH {return 0,nil ;};var _cbega ,_acbd int ;if delX >=0{_cbega =int (delX +0.5);}else {_cbega =int (delX -0.5);};if delY >=0{_acbd =int (delY +0.5);}else {_acbd =int (delY -0.5);
|
|
};_fda :=bm1 .createTemplate ();if _cdde =_fda .RasterOperation (_cbega ,_acbd ,_beabe ,_ggbca ,PixSrc ,bm2 ,0,0);_cdde !=nil {return _geed ,_f .Wrap (_cdde ,_cgeg ,"\u0062m\u0032 \u0074\u006f\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065");};if _cdde =_fda .RasterOperation (0,0,_aedf ,_aaea ,PixSrcAndDst ,bm1 ,0,0);
|
|
_cdde !=nil {return _geed ,_f .Wrap (_cdde ,_cgeg ,"b\u006d\u0031\u0020\u0061\u006e\u0064\u0020\u0062\u006d\u0054");};_eefd :=_fda .countPixels ();_geed =float64 (_eefd )*float64 (_eefd )/(float64 (area1 )*float64 (area2 ));return _geed ,nil ;};func (_cace Points )Get (i int )(Point ,error ){if i > len (_cace )-1{return Point {},_f .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 _cace [i ],nil ;};func Centroids (bms []*Bitmap )(*Points ,error ){_dade :=make ([]Point ,len (bms ));_aaed :=_cfda ();_aega :=_ddc ();var _fabc error ;for _fcfe ,_cadea :=range bms {_dade [_fcfe ],_fabc =_cadea .centroid (_aaed ,_aega );if _fabc !=nil {return nil ,_fabc ;
|
|
};};_afcb :=Points (_dade );return &_afcb ,nil ;};func TstPSymbol (t *_b .T )*Bitmap {t .Helper ();_bab :=New (5,8);_a .NoError (t ,_bab .SetPixel (0,0,1));_a .NoError (t ,_bab .SetPixel (1,0,1));_a .NoError (t ,_bab .SetPixel (2,0,1));_a .NoError (t ,_bab .SetPixel (3,0,1));
|
|
_a .NoError (t ,_bab .SetPixel (4,1,1));_a .NoError (t ,_bab .SetPixel (0,1,1));_a .NoError (t ,_bab .SetPixel (4,2,1));_a .NoError (t ,_bab .SetPixel (0,2,1));_a .NoError (t ,_bab .SetPixel (4,3,1));_a .NoError (t ,_bab .SetPixel (0,3,1));_a .NoError (t ,_bab .SetPixel (0,4,1));
|
|
_a .NoError (t ,_bab .SetPixel (1,4,1));_a .NoError (t ,_bab .SetPixel (2,4,1));_a .NoError (t ,_bab .SetPixel (3,4,1));_a .NoError (t ,_bab .SetPixel (0,5,1));_a .NoError (t ,_bab .SetPixel (0,6,1));_a .NoError (t ,_bab .SetPixel (0,7,1));return _bab ;
|
|
};func Copy (d ,s *Bitmap )(*Bitmap ,error ){return _dgf (d ,s )};var MorphBC BoundaryCondition ;var (_fgab =_agd ();_gdda =_gfgg ();_ceag =_gbf (););func (_gbfd *Points )AddPoint (x ,y float32 ){*_gbfd =append (*_gbfd ,Point {x ,y })};var _fgge =[5]int {1,2,3,0,4};
|
|
func (_abf *Bitmap )setPadBits (_gca int ){_egaa :=8-_abf .Width %8;if _egaa ==8{return ;};_ebfd :=_abf .Width /8;_bace :=_aecd [_egaa ];if _gca ==0{_bace ^=_bace ;};var _dfeb int ;for _baaa :=0;_baaa < _abf .Height ;_baaa ++{_dfeb =_baaa *_abf .RowStride +_ebfd ;
|
|
if _gca ==0{_abf .Data [_dfeb ]&=_bace ;}else {_abf .Data [_dfeb ]|=_bace ;};};};func (_acfd *Bitmap )removeBorderGeneral (_ece ,_cacd ,_cad ,_gcfe int )(*Bitmap ,error ){const _fag ="\u0072\u0065\u006d\u006fve\u0042\u006f\u0072\u0064\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
if _ece < 0||_cacd < 0||_cad < 0||_gcfe < 0{return nil ,_f .Error (_fag ,"\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");};_badb ,_baae :=_acfd .Width ,_acfd .Height ;
|
|
_fffe :=_badb -_ece -_cacd ;_gacb :=_baae -_cad -_gcfe ;if _fffe <=0{return nil ,_f .Errorf (_fag ,"w\u0069\u0064\u0074\u0068: \u0025d\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u003e\u0020\u0030",_fffe );};if _gacb <=0{return nil ,_f .Errorf (_fag ,"\u0068\u0065\u0069\u0067ht\u003a\u0020\u0025\u0064\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u003e \u0030",_gacb );
|
|
};_eage :=New (_fffe ,_gacb );_eage .Color =_acfd .Color ;_ebe :=_eage .RasterOperation (0,0,_fffe ,_gacb ,PixSrc ,_acfd ,_ece ,_cad );if _ebe !=nil {return nil ,_f .Wrap (_ebe ,_fag ,"");};return _eage ,nil ;};func (_bcd *Bitmap )GetByteIndex (x ,y int )int {return y *_bcd .RowStride +(x >>3)};
|
|
type Point struct{X ,Y float32 ;};func TstImageBitmapData ()[]byte {return _cbafa .Data };func (_dfbb *Bitmap )RemoveBorder (borderSize int )(*Bitmap ,error ){if borderSize ==0{return _dfbb .Copy (),nil ;};_ffbc ,_cfd :=_dfbb .removeBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize );
|
|
if _cfd !=nil {return nil ,_f .Wrap (_cfd ,"\u0052\u0065\u006do\u0076\u0065\u0042\u006f\u0072\u0064\u0065\u0072","");};return _ffbc ,nil ;};type byHeight Bitmaps ;func (_fbab *Bitmap )setTwoBytes (_gaac int ,_fdbf uint16 )error {if _gaac +1> len (_fbab .Data )-1{return _f .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",_gaac );
|
|
};_fbab .Data [_gaac ]=byte ((_fdbf &0xff00)>>8);_fbab .Data [_gaac +1]=byte (_fdbf &0xff);return nil ;};func (_bgce *Bitmap )addBorderGeneral (_fafb ,_adc ,_cgaa ,_dfd int ,_aagg int )(*Bitmap ,error ){const _fgfb ="\u0061\u0064d\u0042\u006f\u0072d\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
if _fafb < 0||_adc < 0||_cgaa < 0||_dfd < 0{return nil ,_f .Error (_fgfb ,"n\u0065\u0067\u0061\u0074iv\u0065 \u0062\u006f\u0072\u0064\u0065r\u0020\u0061\u0064\u0064\u0065\u0064");};_cee ,_aegf :=_bgce .Width ,_bgce .Height ;_ecc :=_cee +_fafb +_adc ;_ebb :=_aegf +_cgaa +_dfd ;
|
|
_ffd :=New (_ecc ,_ebb );_ffd .Color =_bgce .Color ;_gccc :=PixClr ;if _aagg > 0{_gccc =PixSet ;};_fadb :=_ffd .RasterOperation (0,0,_fafb ,_ebb ,_gccc ,nil ,0,0);if _fadb !=nil {return nil ,_f .Wrap (_fadb ,_fgfb ,"\u006c\u0065\u0066\u0074");};_fadb =_ffd .RasterOperation (_ecc -_adc ,0,_adc ,_ebb ,_gccc ,nil ,0,0);
|
|
if _fadb !=nil {return nil ,_f .Wrap (_fadb ,_fgfb ,"\u0072\u0069\u0067h\u0074");};_fadb =_ffd .RasterOperation (0,0,_ecc ,_cgaa ,_gccc ,nil ,0,0);if _fadb !=nil {return nil ,_f .Wrap (_fadb ,_fgfb ,"\u0074\u006f\u0070");};_fadb =_ffd .RasterOperation (0,_ebb -_dfd ,_ecc ,_dfd ,_gccc ,nil ,0,0);
|
|
if _fadb !=nil {return nil ,_f .Wrap (_fadb ,_fgfb ,"\u0062\u006f\u0074\u0074\u006f\u006d");};_fadb =_ffd .RasterOperation (_fafb ,_cgaa ,_cee ,_aegf ,PixSrc ,_bgce ,0,0);if _fadb !=nil {return nil ,_f .Wrap (_fadb ,_fgfb ,"\u0063\u006f\u0070\u0079");};
|
|
return _ffd ,nil ;};const (PixSrc RasterOperator =0xc;PixDst RasterOperator =0xa;PixNotSrc RasterOperator =0x3;PixNotDst RasterOperator =0x5;PixClr RasterOperator =0x0;PixSet RasterOperator =0xf;PixSrcOrDst RasterOperator =0xe;PixSrcAndDst RasterOperator =0x8;
|
|
PixSrcXorDst RasterOperator =0x6;PixNotSrcOrDst RasterOperator =0xb;PixNotSrcAndDst RasterOperator =0x2;PixSrcOrNotDst RasterOperator =0xd;PixSrcAndNotDst RasterOperator =0x4;PixNotPixSrcOrDst RasterOperator =0x1;PixNotPixSrcAndDst RasterOperator =0x7;
|
|
PixNotPixSrcXorDst RasterOperator =0x9;PixPaint =PixSrcOrDst ;PixSubtract =PixNotSrcAndDst ;PixMask =PixSrcAndDst ;);func HausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH int )(bool ,error ){const _egaac ="\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";
|
|
_edcb ,_ecdf :=p1 .Width ,p1 .Height ;_abgfg ,_afcd :=p3 .Width ,p3 .Height ;if _gb .Abs (_edcb -_abgfg )> maxDiffW {return false ,nil ;};if _gb .Abs (_ecdf -_afcd )> maxDiffH {return false ,nil ;};_afdd :=int (delX +_gb .Sign (delX )*0.5);_edgd :=int (delY +_gb .Sign (delY )*0.5);
|
|
var _bedg error ;_bffd :=p1 .CreateTemplate ();if _bedg =_bffd .RasterOperation (0,0,_edcb ,_ecdf ,PixSrc ,p1 ,0,0);_bedg !=nil {return false ,_f .Wrap (_bedg ,_egaac ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _bedg =_bffd .RasterOperation (_afdd ,_edgd ,_edcb ,_ecdf ,PixNotSrcAndDst ,p4 ,0,0);
|
|
_bedg !=nil {return false ,_f .Wrap (_bedg ,_egaac ,"\u0021p\u0034\u0020\u0026\u0020\u0074");};if _bffd .Zero (){return false ,nil ;};if _bedg =_bffd .RasterOperation (_afdd ,_edgd ,_abgfg ,_afcd ,PixSrc ,p3 ,0,0);_bedg !=nil {return false ,_f .Wrap (_bedg ,_egaac ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");
|
|
};if _bedg =_bffd .RasterOperation (0,0,_abgfg ,_afcd ,PixNotSrcAndDst ,p2 ,0,0);_bedg !=nil {return false ,_f .Wrap (_bedg ,_egaac ,"\u0021p\u0032\u0020\u0026\u0020\u0074");};return _bffd .Zero (),nil ;};func _cfda ()[]int {_accag :=make ([]int ,256);
|
|
_accag [0]=0;_accag [1]=7;var _feec int ;for _feec =2;_feec < 4;_feec ++{_accag [_feec ]=_accag [_feec -2]+6;};for _feec =4;_feec < 8;_feec ++{_accag [_feec ]=_accag [_feec -4]+5;};for _feec =8;_feec < 16;_feec ++{_accag [_feec ]=_accag [_feec -8]+4;};
|
|
for _feec =16;_feec < 32;_feec ++{_accag [_feec ]=_accag [_feec -16]+3;};for _feec =32;_feec < 64;_feec ++{_accag [_feec ]=_accag [_feec -32]+2;};for _feec =64;_feec < 128;_feec ++{_accag [_feec ]=_accag [_feec -64]+1;};for _feec =128;_feec < 256;_feec ++{_accag [_feec ]=_accag [_feec -128];
|
|
};return _accag ;};func (_fbgf *Bitmap )SizesEqual (s *Bitmap )bool {if _fbgf ==s {return true ;};if _fbgf .Width !=s .Width ||_fbgf .Height !=s .Height {return false ;};return true ;};func (_gfee *Bitmap )setEightFullBytes (_adce int ,_fbgb uint64 )error {if _adce +7> len (_gfee .Data )-1{return _f .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");
|
|
};_gfee .Data [_adce ]=byte ((_fbgb &0xff00000000000000)>>56);_gfee .Data [_adce +1]=byte ((_fbgb &0xff000000000000)>>48);_gfee .Data [_adce +2]=byte ((_fbgb &0xff0000000000)>>40);_gfee .Data [_adce +3]=byte ((_fbgb &0xff00000000)>>32);_gfee .Data [_adce +4]=byte ((_fbgb &0xff000000)>>24);
|
|
_gfee .Data [_adce +5]=byte ((_fbgb &0xff0000)>>16);_gfee .Data [_adce +6]=byte ((_fbgb &0xff00)>>8);_gfee .Data [_adce +7]=byte (_fbgb &0xff);return nil ;};func NewWithUnpaddedData (width ,height int ,data []byte )(*Bitmap ,error ){const _eec ="\u004e\u0065\u0077\u0057it\u0068\u0055\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";
|
|
_deb :=_eed (width ,height );_deb .Data =data ;if _bba :=((width *height )+7)>>3;len (data )< _bba {return nil ,_f .Errorf (_eec ,"\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 ),_bba );
|
|
};if _gbc :=_deb .addPadBits ();_gbc !=nil {return nil ,_f .Wrap (_gbc ,_eec ,"");};return _deb ,nil ;};func (_fffd *Boxes )Get (i int )(*_be .Rectangle ,error ){const _agge ="\u0042o\u0078\u0065\u0073\u002e\u0047\u0065t";if _fffd ==nil {return nil ,_f .Error (_agge ,"\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if i > len (*_fffd )-1{return nil ,_f .Errorf (_agge ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return (*_fffd )[i ],nil ;};func Blit (src *Bitmap ,dst *Bitmap ,x ,y int ,op CombinationOperator )error {var _ffaa ,_efgag int ;
|
|
_cfba :=src .RowStride -1;if x < 0{_efgag =-x ;x =0;}else if x +src .Width > dst .Width {_cfba -=src .Width +x -dst .Width ;};if y < 0{_ffaa =-y ;y =0;_efgag +=src .RowStride ;_cfba +=src .RowStride ;}else if y +src .Height > dst .Height {_ffaa =src .Height +y -dst .Height ;
|
|
};var (_bdca int ;_beag error ;);_adbe :=x &0x07;_bbfa :=8-_adbe ;_aabdb :=src .Width &0x07;_fdg :=_bbfa -_aabdb ;_fagd :=_bbfa &0x07!=0;_fcf :=src .Width <=((_cfba -_efgag )<<3)+_bbfa ;_cdag :=dst .GetByteIndex (x ,y );_bcf :=_ffaa +dst .Height ;if src .Height > _bcf {_bdca =_bcf ;
|
|
}else {_bdca =src .Height ;};switch {case !_fagd :_beag =_gbcbe (src ,dst ,_ffaa ,_bdca ,_cdag ,_efgag ,_cfba ,op );case _fcf :_beag =_fdf (src ,dst ,_ffaa ,_bdca ,_cdag ,_efgag ,_cfba ,_fdg ,_adbe ,_bbfa ,op );default:_beag =_dada (src ,dst ,_ffaa ,_bdca ,_cdag ,_efgag ,_cfba ,_fdg ,_adbe ,_bbfa ,op ,_aabdb );
|
|
};return _beag ;};func TstAddSymbol (t *_b .T ,bms *Bitmaps ,sym *Bitmap ,x *int ,y int ,space int ){bms .AddBitmap (sym );_ebda :=_be .Rect (*x ,y ,*x +sym .Width ,y +sym .Height );bms .AddBox (&_ebda );*x +=sym .Width +space ;};func TstTSymbol (t *_b .T ,scale ...int )*Bitmap {_acabd ,_fbge :=NewWithData (5,5,[]byte {0xF8,0x20,0x20,0x20,0x20});
|
|
_a .NoError (t ,_fbge );return TstGetScaledSymbol (t ,_acabd ,scale ...);};func TstDSymbol (t *_b .T ,scale ...int )*Bitmap {_agefd ,_geaa :=NewWithData (4,5,[]byte {0xf0,0x90,0x90,0x90,0xE0});_a .NoError (t ,_geaa );return TstGetScaledSymbol (t ,_agefd ,scale ...);
|
|
};func init (){const _ccbc ="\u0062\u0069\u0074\u006dap\u0073\u002e\u0069\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0061\u0074\u0069o\u006e";_facgf =New (50,40);var _eecc error ;_facgf ,_eecc =_facgf .AddBorder (2,1);if _eecc !=nil {panic (_f .Wrap (_eecc ,_ccbc ,"f\u0072\u0061\u006d\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));
|
|
};_cbafa ,_eecc =NewWithData (50,22,_dfga );if _eecc !=nil {panic (_f .Wrap (_eecc ,_ccbc ,"i\u006d\u0061\u0067\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};};func (_gbcef Points )Size ()int {return len (_gbcef )};func _agd ()(_aa [256]uint16 ){for _cg :=0;
|
|
_cg < 256;_cg ++{if _cg &0x01!=0{_aa [_cg ]|=0x3;};if _cg &0x02!=0{_aa [_cg ]|=0xc;};if _cg &0x04!=0{_aa [_cg ]|=0x30;};if _cg &0x08!=0{_aa [_cg ]|=0xc0;};if _cg &0x10!=0{_aa [_cg ]|=0x300;};if _cg &0x20!=0{_aa [_cg ]|=0xc00;};if _cg &0x40!=0{_aa [_cg ]|=0x3000;
|
|
};if _cg &0x80!=0{_aa [_cg ]|=0xc000;};};return _aa ;};func (_ebbcb *BitmapsArray )GetBitmaps (i int )(*Bitmaps ,error ){const _fedba ="\u0042\u0069\u0074ma\u0070\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u0069\u0074\u006d\u0061\u0070\u0073";
|
|
if _ebbcb ==nil {return nil ,_f .Error (_fedba ,"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 (_ebbcb .Values )-1{return nil ,_f .Errorf (_fedba ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _ebbcb .Values [i ],nil ;};func TstRSymbol (t *_b .T ,scale ...int )*Bitmap {_geac ,_ggfe :=NewWithData (4,5,[]byte {0xF0,0x90,0xF0,0xA0,0x90});_a .NoError (t ,_ggfe );return TstGetScaledSymbol (t ,_geac ,scale ...);};func (_cdaa *Bitmap )nextOnPixelLow (_gfggf ,_egf ,_dee ,_dge ,_aebb int )(_fde _be .Point ,_fbce bool ,_dbb error ){const _gddc ="B\u0069\u0074\u006d\u0061p.\u006ee\u0078\u0074\u004f\u006e\u0050i\u0078\u0065\u006c\u004c\u006f\u0077";
|
|
var (_afc int ;_dfcf byte ;);_efdg :=_aebb *_dee ;_eccb :=_efdg +(_dge /8);if _dfcf ,_dbb =_cdaa .GetByte (_eccb );_dbb !=nil {return _fde ,false ,_f .Wrap (_dbb ,_gddc ,"\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 _dfcf !=0{_dfea :=_dge -(_dge %8)+7;for _afc =_dge ;_afc <=_dfea &&_afc < _gfggf ;_afc ++{if _cdaa .GetPixel (_afc ,_aebb ){_fde .X =_afc ;_fde .Y =_aebb ;return _fde ,true ,nil ;};};};_fbbg :=(_dge /8)+1;_afc =8*_fbbg ;var _aef int ;for _eccb =_efdg +_fbbg ;
|
|
_afc < _gfggf ;_eccb ,_afc =_eccb +1,_afc +8{if _dfcf ,_dbb =_cdaa .GetByte (_eccb );_dbb !=nil {return _fde ,false ,_f .Wrap (_dbb ,_gddc ,"r\u0065\u0073\u0074\u0020of\u0020t\u0068\u0065\u0020\u006c\u0069n\u0065\u0020\u0062\u0079\u0074\u0065");};if _dfcf ==0{continue ;
|
|
};for _aef =0;_aef < 8&&_afc < _gfggf ;_aef ,_afc =_aef +1,_afc +1{if _cdaa .GetPixel (_afc ,_aebb ){_fde .X =_afc ;_fde .Y =_aebb ;return _fde ,true ,nil ;};};};for _bff :=_aebb +1;_bff < _egf ;_bff ++{_efdg =_bff *_dee ;for _eccb ,_afc =_efdg ,0;_afc < _gfggf ;
|
|
_eccb ,_afc =_eccb +1,_afc +8{if _dfcf ,_dbb =_cdaa .GetByte (_eccb );_dbb !=nil {return _fde ,false ,_f .Wrap (_dbb ,_gddc ,"\u0066o\u006cl\u006f\u0077\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u0073");};if _dfcf ==0{continue ;};for _aef =0;_aef < 8&&_afc < _gfggf ;
|
|
_aef ,_afc =_aef +1,_afc +1{if _cdaa .GetPixel (_afc ,_bff ){_fde .X =_afc ;_fde .Y =_bff ;return _fde ,true ,nil ;};};};};return _fde ,false ,nil ;};func (_fbg *Bitmap )SetPixel (x ,y int ,pixel byte )error {_fba :=_fbg .GetByteIndex (x ,y );if _fba > len (_fbg .Data )-1{return _f .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",_fba );
|
|
};_bdd :=_fbg .GetBitOffset (x );_ade :=uint (7-_bdd );_cef :=_fbg .Data [_fba ];var _eca byte ;if pixel ==1{_eca =_cef |(pixel &0x01<<_ade );}else {_eca =_cef &^(1<<_ade );};_fbg .Data [_fba ]=_eca ;return nil ;};func _gfdf (_dbg ,_aeg *Bitmap ,_gcgd int ,_efeb []byte ,_ffe int )(_gge error ){const _bcb ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0033";
|
|
var (_dcf ,_gfde ,_abe ,_cea ,_abb ,_gbbc ,_dga ,_bgc int ;_dcd ,_bfd ,_ffc ,_fcc uint32 ;_ggb ,_dba byte ;_aee uint16 ;);_abgg :=make ([]byte ,4);_afa :=make ([]byte ,4);for _abe =0;_abe < _dbg .Height -1;_abe ,_cea =_abe +2,_cea +1{_dcf =_abe *_dbg .RowStride ;
|
|
_gfde =_cea *_aeg .RowStride ;for _abb ,_gbbc =0,0;_abb < _ffe ;_abb ,_gbbc =_abb +4,_gbbc +1{for _dga =0;_dga < 4;_dga ++{_bgc =_dcf +_abb +_dga ;if _bgc <=len (_dbg .Data )-1&&_bgc < _dcf +_dbg .RowStride {_abgg [_dga ]=_dbg .Data [_bgc ];}else {_abgg [_dga ]=0x00;
|
|
};_bgc =_dcf +_dbg .RowStride +_abb +_dga ;if _bgc <=len (_dbg .Data )-1&&_bgc < _dcf +(2*_dbg .RowStride ){_afa [_dga ]=_dbg .Data [_bgc ];}else {_afa [_dga ]=0x00;};};_dcd =_abg .BigEndian .Uint32 (_abgg );_bfd =_abg .BigEndian .Uint32 (_afa );_ffc =_dcd &_bfd ;
|
|
_ffc |=_ffc <<1;_fcc =_dcd |_bfd ;_fcc &=_fcc <<1;_bfd =_ffc &_fcc ;_bfd &=0xaaaaaaaa;_dcd =_bfd |(_bfd <<7);_ggb =byte (_dcd >>24);_dba =byte ((_dcd >>8)&0xff);_bgc =_gfde +_gbbc ;if _bgc +1==len (_aeg .Data )-1||_bgc +1>=_gfde +_aeg .RowStride {if _gge =_aeg .SetByte (_bgc ,_efeb [_ggb ]);
|
|
_gge !=nil {return _f .Wrapf (_gge ,_bcb ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_bgc );};}else {_aee =(uint16 (_efeb [_ggb ])<<8)|uint16 (_efeb [_dba ]);if _gge =_aeg .setTwoBytes (_bgc ,_aee );_gge !=nil {return _f .Wrapf (_gge ,_bcb ,"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",_bgc );
|
|
};_gbbc ++;};};};return nil ;};func _cabb (_cbfb *Bitmap ,_dgece ,_efbb ,_acebf ,_ecbf int ,_fgfbd RasterOperator ){if _dgece < 0{_acebf +=_dgece ;_dgece =0;};_eedca :=_dgece +_acebf -_cbfb .Width ;if _eedca > 0{_acebf -=_eedca ;};if _efbb < 0{_ecbf +=_efbb ;
|
|
_efbb =0;};_gbfdc :=_efbb +_ecbf -_cbfb .Height ;if _gbfdc > 0{_ecbf -=_gbfdc ;};if _acebf <=0||_ecbf <=0{return ;};if (_dgece &7)==0{_egeae (_cbfb ,_dgece ,_efbb ,_acebf ,_ecbf ,_fgfbd );}else {_fbef (_cbfb ,_dgece ,_efbb ,_acebf ,_ecbf ,_fgfbd );};};
|
|
func (_deae *BitmapsArray )GetBox (i int )(*_be .Rectangle ,error ){const _cggcg ="\u0042\u0069\u0074\u006dap\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u006f\u0078";if _deae ==nil {return nil ,_f .Error (_cggcg ,"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 (_deae .Boxes )-1{return nil ,_f .Errorf (_cggcg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _deae .Boxes [i ],nil ;};func MakePixelSumTab8 ()[]int {return _ddc ()};
|
|
func (_bcffe *Bitmaps )SortByHeight (){_gced :=(*byHeight )(_bcffe );_cc .Sort (_gced )};type ClassedPoints struct{*Points ;_gb .IntSlice ;_fdfc func (_abda ,_ceec int )bool ;};func Extract (roi _be .Rectangle ,src *Bitmap )(*Bitmap ,error ){_eggf :=New (roi .Dx (),roi .Dy ());
|
|
_efb :=roi .Min .X &0x07;_aafe :=8-_efb ;_fbaf :=uint (8-_eggf .Width &0x07);_ddd :=src .GetByteIndex (roi .Min .X ,roi .Min .Y );_agceb :=src .GetByteIndex (roi .Max .X -1,roi .Min .Y );_bdcf :=_eggf .RowStride ==_agceb +1-_ddd ;var _ccef int ;for _dbeb :=roi .Min .Y ;
|
|
_dbeb < roi .Max .Y ;_dbeb ++{_gfef :=_ddd ;_bcbf :=_ccef ;switch {case _ddd ==_agceb :_fdc ,_fabf :=src .GetByte (_gfef );if _fabf !=nil {return nil ,_fabf ;};_fdc <<=uint (_efb );_fabf =_eggf .SetByte (_bcbf ,_ecdc (_fbaf ,_fdc ));if _fabf !=nil {return nil ,_fabf ;
|
|
};case _efb ==0:for _bgcc :=_ddd ;_bgcc <=_agceb ;_bgcc ++{_cgfe ,_cfab :=src .GetByte (_gfef );if _cfab !=nil {return nil ,_cfab ;};_gfef ++;if _bgcc ==_agceb &&_bdcf {_cgfe =_ecdc (_fbaf ,_cgfe );};_cfab =_eggf .SetByte (_bcbf ,_cgfe );if _cfab !=nil {return nil ,_cfab ;
|
|
};_bcbf ++;};default:_adac :=_agac (src ,_eggf ,uint (_efb ),uint (_aafe ),_fbaf ,_ddd ,_agceb ,_bdcf ,_gfef ,_bcbf );if _adac !=nil {return nil ,_adac ;};};_ddd +=src .RowStride ;_agceb +=src .RowStride ;_ccef +=_eggf .RowStride ;};return _eggf ,nil ;
|
|
};func (_eeg *Bitmap )GetUnpaddedData ()([]byte ,error ){_aad :=uint (_eeg .Width &0x07);if _aad ==0{return _eeg .Data ,nil ;};_cfg :=_eeg .Width *_eeg .Height ;if _cfg %8!=0{_cfg >>=3;_cfg ++;}else {_cfg >>=3;};_dbc :=make ([]byte ,_cfg );_daac :=_ab .NewWriterMSB (_dbc );
|
|
const _dff ="\u0047e\u0074U\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";for _eag :=0;_eag < _eeg .Height ;_eag ++{for _gccd :=0;_gccd < _eeg .RowStride ;_gccd ++{_geee :=_eeg .Data [_eag *_eeg .RowStride +_gccd ];if _gccd !=_eeg .RowStride -1{_egag :=_daac .WriteByte (_geee );
|
|
if _egag !=nil {return nil ,_f .Wrap (_egag ,_dff ,"");};continue ;};for _dae :=uint (0);_dae < _aad ;_dae ++{_acgf :=_daac .WriteBit (int (_geee >>(7-_dae )&0x01));if _acgf !=nil {return nil ,_f .Wrap (_acgf ,_dff ,"");};};};};return _dbc ,nil ;};func _ceg (_daea *Bitmap ,_cfef *Bitmap ,_dagfc int )(_dgagg error ){const _baeg ="\u0073\u0065\u0065\u0064\u0066\u0069\u006c\u006c\u0042\u0069\u006e\u0061r\u0079\u004c\u006f\u0077";
|
|
_gbfa :=_aggf (_daea .Height ,_cfef .Height );_cecf :=_aggf (_daea .RowStride ,_cfef .RowStride );switch _dagfc {case 4:_dgagg =_defa (_daea ,_cfef ,_gbfa ,_cecf );case 8:_dgagg =_facg (_daea ,_cfef ,_gbfa ,_cecf );default:return _f .Errorf (_baeg ,"\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",_dagfc );
|
|
};if _dgagg !=nil {return _f .Wrap (_dgagg ,_baeg ,"");};return nil ;};func _dgb (_aadbgc ,_eeae *Bitmap ,_afed ,_fbcg int )(*Bitmap ,error ){const _fefce ="\u0065\u0072\u006f\u0064\u0065\u0042\u0072\u0069\u0063\u006b";if _eeae ==nil {return nil ,_f .Error (_fefce ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _afed < 1||_fbcg < 1{return nil ,_f .Error (_fefce ,"\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 _afed ==1&&_fbcg ==1{_decb ,_bddfa :=_dgf (_aadbgc ,_eeae );if _bddfa !=nil {return nil ,_f .Wrap (_bddfa ,_fefce ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _decb ,nil ;};if _afed ==1||_fbcg ==1{_bdef :=SelCreateBrick (_fbcg ,_afed ,_fbcg /2,_afed /2,SelHit );_gbed ,_abea :=_acca (_aadbgc ,_eeae ,_bdef );if _abea !=nil {return nil ,_f .Wrap (_abea ,_fefce ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _gbed ,nil ;};_bbfbf :=SelCreateBrick (1,_afed ,0,_afed /2,SelHit );_cgge :=SelCreateBrick (_fbcg ,1,_fbcg /2,0,SelHit );_dcfb ,_ffdb :=_acca (nil ,_eeae ,_bbfbf );if _ffdb !=nil {return nil ,_f .Wrap (_ffdb ,_fefce ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_aadbgc ,_ffdb =_acca (_aadbgc ,_dcfb ,_cgge );if _ffdb !=nil {return nil ,_f .Wrap (_ffdb ,_fefce ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _aadbgc ,nil ;};func TstWriteSymbols (t *_b .T ,bms *Bitmaps ,src *Bitmap ){for _dfgd :=0;_dfgd < bms .Size ();
|
|
_dfgd ++{_bccc :=bms .Values [_dfgd ];_ggda :=bms .Boxes [_dfgd ];_eddfe :=src .RasterOperation (_ggda .Min .X ,_ggda .Min .Y ,_bccc .Width ,_bccc .Height ,PixSrc ,_bccc ,0,0);_a .NoError (t ,_eddfe );};};func (_cbbaec *ClassedPoints )SortByY (){_cbbaec ._fdfc =_cbbaec .ySortFunction ();
|
|
_cc .Sort (_cbbaec )};func (_abbg *Boxes )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_gga *Boxes ,_dcga error ){const _dcdg ="\u0042o\u0078e\u0073\u002e\u0053\u0065\u006ce\u0063\u0074B\u0079\u0053\u0069\u007a\u0065";if _abbg ==nil {return nil ,_f .Error (_dcdg ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if len (*_abbg )==0{return _abbg ,nil ;};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_f .Errorf (_dcdg ,"\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 ,_f .Errorf (_dcdg ,"i\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020t\u0079\u0070\u0065:\u0020'\u0025\u0064\u0027",tp );
|
|
};_daeb :=_abbg .makeSizeIndicator (width ,height ,tp ,relation );_egfa ,_dcga :=_abbg .selectWithIndicator (_daeb );if _dcga !=nil {return nil ,_f .Wrap (_dcga ,_dcdg ,"");};return _egfa ,nil ;};func (_fdgc *Boxes )Add (box *_be .Rectangle )error {if _fdgc ==nil {return _f .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");
|
|
};*_fdgc =append (*_fdgc ,box );return nil ;};func (_acbb *Bitmaps )ClipToBitmap (s *Bitmap )(*Bitmaps ,error ){const _agfe ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0043\u006c\u0069p\u0054\u006f\u0042\u0069tm\u0061\u0070";if _acbb ==nil {return nil ,_f .Error (_agfe ,"\u0042\u0069\u0074\u006dap\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if s ==nil {return nil ,_f .Error (_agfe ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};_ced :=len (_acbb .Values );_ggbac :=&Bitmaps {Values :make ([]*Bitmap ,_ced ),Boxes :make ([]*_be .Rectangle ,_ced )};
|
|
var (_bagg ,_ebcc *Bitmap ;_abce *_be .Rectangle ;_egccg error ;);for _eagd :=0;_eagd < _ced ;_eagd ++{if _bagg ,_egccg =_acbb .GetBitmap (_eagd );_egccg !=nil {return nil ,_f .Wrap (_egccg ,_agfe ,"");};if _abce ,_egccg =_acbb .GetBox (_eagd );_egccg !=nil {return nil ,_f .Wrap (_egccg ,_agfe ,"");
|
|
};if _ebcc ,_egccg =s .clipRectangle (_abce ,nil );_egccg !=nil {return nil ,_f .Wrap (_egccg ,_agfe ,"");};if _ebcc ,_egccg =_ebcc .And (_bagg );_egccg !=nil {return nil ,_f .Wrap (_egccg ,_agfe ,"");};_ggbac .Values [_eagd ]=_ebcc ;_ggbac .Boxes [_eagd ]=_abce ;
|
|
};return _ggbac ,nil ;};var (_afcbe =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};_aecd =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};); |