2020-09-21 01:20:10 +00:00
|
|
|
package bitwise ;import (_fb "encoding/binary";_e "errors";_ef "github.com/unidoc/unipdf/v3/common";_a "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_f "io";);func (_dfa *BufferedWriter )Write (d []byte )(int ,error ){_dfa .expandIfNeeded (len (d ));if _dfa ._fg ==0{return _dfa .writeFullBytes (d ),nil ;};return _dfa .writeShiftedBytes (d ),nil ;};type StreamReader interface{_f .Reader ;_f .ByteReader ;_f .Seeker ;Align ()byte ;BitPosition ()int ;Mark ();Length ()uint64 ;ReadBit ()(int ,error );ReadBits (_geb byte )(uint64 ,error );ReadBool ()(bool ,error );ReadUint32 ()(uint32 ,error );Reset ();StreamPosition ()int64 ;};func (_ag *BufferedWriter )WriteBits (bits uint64 ,number int )(_eb int ,_cc error ){const _dab ="\u0042u\u0066\u0066\u0065\u0072e\u0064\u0057\u0072\u0069\u0074e\u0072.\u0057r\u0069\u0074\u0065\u0072\u0042\u0069\u0074s";if number < 0||number > 64{return 0,_a .Errorf (_dab ,"\u0062i\u0074\u0073 \u006e\u0075\u006db\u0065\u0072\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u0069\u006e\u0020r\u0061\u006e\u0067\u0065\u0020\u003c\u0030\u002c\u0036\u0034\u003e,\u0020\u0069\u0073\u003a\u0020\u0027\u0025\u0064\u0027",number );};_dcf :=number /8;if _dcf > 0{_efe :=number -_dcf *8;for _af :=_dcf -1;_af >=0;_af --{_ed :=byte ((bits >>uint (_af *8+_efe ))&0xff);if _cc =_ag .WriteByte (_ed );_cc !=nil {return _eb ,_a .Wrapf (_cc ,_dab ,"\u0062\u0079\u0074\u0065\u003a\u0020\u0027\u0025\u0064\u0027",_dcf -_af +1);};};number -=_dcf *8;if number ==0{return _dcf ,nil ;};};var _abg int ;for _ac :=0;_ac < number ;_ac ++{if _ag ._ba {_abg =int ((bits >>uint (number -1-_ac ))&0x1);}else {_abg =int (bits &0x1);bits >>=1;};if _cc =_ag .WriteBit (_abg );_cc !=nil {return _eb ,_a .Wrapf (_cc ,_dab ,"\u0062i\u0074\u003a\u0020\u0025\u0064",_ac );};};return _dcf ,nil ;};func (_eba *BufferedWriter )grow (_daf int ){if _eba ._df ==nil &&_daf < _d {_eba ._df =make ([]byte ,_daf ,_d );return ;};_cgg :=len (_eba ._df );if _eba ._fg !=0{_cgg ++;};_bf :=cap (_eba ._df );switch {case _daf <=_bf /2-_cgg :_ef .Log .Trace ("\u005b\u0042\u0075\u0066\u0066\u0065r\u0065\u0064\u0057\u0072\u0069t\u0065\u0072\u005d\u0020\u0067\u0072o\u0077\u0020\u002d\u0020\u0072e\u0073\u006c\u0069\u0063\u0065\u0020\u006f\u006e\u006c\u0079\u002e\u0020L\u0065\u006e\u003a\u0020\u0027\u0025\u0064\u0027\u002c\u0020\u0043\u0061\u0070\u003a\u0020'\u0025\u0064\u0027\u002c\u0020\u006e\u003a\u0020'\u0025\u0064\u0027",len (_eba ._df ),cap (_eba ._df ),_daf );_ef .Log .Trace ("\u0020\u006e\u0020\u003c\u003d\u0020\u0063\u0020\u002f\u0020\u0032\u0020\u002d\u006d\u002e \u0043:\u0020\u0027\u0025\u0064\u0027\u002c\u0020\u006d\u003a\u0020\u0027\u0025\u0064\u0027",_bf ,_cgg );copy (_eba ._df ,_eba ._df [_eba .fullOffset ():]);case _bf > _bg -_bf -_daf :_ef .Log .Error ("\u0042\u0055F\u0046\u0045\u0052 \u0074\u006f\u006f\u0020\u006c\u0061\u0072\u0067\u0065");return ;default:_gac :=make ([]byte ,2*_bf +_daf );copy (_gac ,_eba ._df );_eba ._df =_gac ;};_eba ._df =_eba ._df [:_cgg +_daf ];};func (_cfe *SubstreamReader )readBufferByte ()(byte ,error ){if _cfe ._fabg >=_cfe ._fdad {return 0,_f .EOF ;};if _cfe ._fabg >=_cfe ._dcff ||_cfe ._fabg < _cfe ._egb {if _gge :=_cfe .fillBuffer ();_gge !=nil {return 0,_gge ;};};_cbcc :=_cfe ._cec [_cfe ._fabg -_cfe ._egb ];_cfe ._fabg ++;return _cbcc ,nil ;};func NewWriter (data []byte )*Writer {return &Writer {_cce :data }};const (_d =64;_bg =int (^uint (0)>>1););func (_fc *BufferedWriter )fullOffset ()int {_ga :=_fc ._da ;if _fc ._fg !=0{_ga ++;};return _ga ;};func (_ebg *Reader )Mark (){_ebg ._aa =_ebg ._bgbe ;_ebg ._bc =_ebg ._dbf };func (_acda *SubstreamReader )readUnalignedByte ()(_gec byte ,_bb error ){_fgc :=_acda ._gb ;_gec =_acda ._fdef <<(8-_fgc );_acda ._fdef ,_bb =_acda .readBufferByte ();if _bb !=nil {return 0,_bb ;};_gec |=_acda ._fdef >>_fgc ;_acda ._fdef &=1<<_fgc -1;return _gec ,nil ;};var _ BinaryWriter =&BufferedWriter {};type BufferedWriter struct{_df []byte ;_fg uint8 ;_da int ;_ba bool ;};func (_dea *SubstreamReader )Mark (){_dea ._dff =_dea ._fabg ;_dea ._ee =_dea ._gb };type Writer struct{_cce []byte ;_gdb uint8 ;_ad
|