mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-02 22:17:06 +08:00
401 lines
114 KiB
Go
401 lines
114 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 imageutil ;import (_ce "encoding/binary";_f "errors";_e "fmt";_b "github.com/unidoc/unipdf/v3/common";_da "github.com/unidoc/unipdf/v3/internal/bitwise";_fc "image";_c "image/color";_df "image/draw";_g "math";);func _eafa (_ebgb _fc .Image )(Image ,error ){if _efgg ,_dcf :=_ebgb .(*Gray4 );
|
|
_dcf {return _efgg .Copy (),nil ;};_ccdf :=_ebgb .Bounds ();_fgfef ,_gggb :=NewImage (_ccdf .Max .X ,_ccdf .Max .Y ,4,1,nil ,nil ,nil );if _gggb !=nil {return nil ,_gggb ;};_dgdf (_ebgb ,_fgfef ,_ccdf );return _fgfef ,nil ;};func IsPowerOf2 (n uint )bool {return n > 0&&(n &(n -1))==0};
|
|
func _ccgb (_fggbd CMYK ,_dfcf NRGBA ,_baag _fc .Rectangle ){for _gagg :=0;_gagg < _baag .Max .X ;_gagg ++{for _cefgg :=0;_cefgg < _baag .Max .Y ;_cefgg ++{_caca :=_fggbd .CMYKAt (_gagg ,_cefgg );_dfcf .SetNRGBA (_gagg ,_cefgg ,_eddg (_caca ));};};};func _ddf (_efdb _c .NRGBA )_c .CMYK {_fbf ,_egee ,_cgcd ,_ :=_efdb .RGBA ();
|
|
_cbg ,_dfe ,_aefa ,_aece :=_c .RGBToCMYK (uint8 (_fbf >>8),uint8 (_egee >>8),uint8 (_cgcd >>8));return _c .CMYK {C :_cbg ,M :_dfe ,Y :_aefa ,K :_aece };};func (_cadb *NRGBA64 )NRGBA64At (x ,y int )_c .NRGBA64 {_fbef ,_ :=ColorAtNRGBA64 (x ,y ,_cadb .Width ,_cadb .Data ,_cadb .Alpha ,_cadb .Decode );
|
|
return _fbef ;};func _gefg (_gdd _c .CMYK )_c .RGBA {_agaed ,_fdd ,_fccc :=_c .CMYKToRGB (_gdd .C ,_gdd .M ,_gdd .Y ,_gdd .K );return _c .RGBA {R :_agaed ,G :_fdd ,B :_fccc ,A :0xff};};func (_gcd *CMYK32 )ColorModel ()_c .Model {return _c .CMYKModel };
|
|
var _ Gray =&Monochrome {};func ColorAtGray8BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_c .Gray ,error ){_ccaag :=y *bytesPerLine +x ;if _ccaag >=len (data ){return _c .Gray {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
};_fcdcf :=data [_ccaag ];if len (decode )==2{_fcdcf =uint8 (uint32 (LinearInterpolate (float64 (_fcdcf ),0,255,decode [0],decode [1]))&0xff);};return _c .Gray {Y :_fcdcf },nil ;};func (_dfeg *NRGBA64 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtNRGBA64 (x ,y ,_dfeg .Width ,_dfeg .Data ,_dfeg .Alpha ,_dfeg .Decode );
|
|
};func (_fgfc *Monochrome )setGrayBit (_cead ,_gdgf int ){_fgfc .Data [_cead ]|=0x80>>uint (_gdgf &7)};func (_bcdb *ImageBase )setEightPartlyBytes (_cbad ,_fbgee int ,_cgaa uint64 )(_ddged error ){var (_adag byte ;_gdbaf int ;);for _def :=1;_def <=_fbgee ;
|
|
_def ++{_gdbaf =64-_def *8;_adag =byte (_cgaa >>uint (_gdbaf )&0xff);if _ddged =_bcdb .setByte (_cbad +_def -1,_adag );_ddged !=nil {return _ddged ;};};_bcfd :=_bcdb .BytesPerLine *8-_bcdb .Width ;if _bcfd ==0{return nil ;};_gdbaf -=8;_adag =byte (_cgaa >>uint (_gdbaf )&0xff)<<uint (_bcfd );
|
|
if _ddged =_bcdb .setByte (_cbad +_fbgee ,_adag );_ddged !=nil {return _ddged ;};return nil ;};func (_fbbc *Monochrome )ExpandBinary (factor int )(*Monochrome ,error ){if !IsPowerOf2 (uint (factor )){return nil ,_e .Errorf ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0065\u0078\u0070\u0061\u006e\u0064\u0020b\u0069n\u0061\u0072\u0079\u0020\u0066\u0061\u0063\u0074\u006f\u0072\u003a\u0020\u0025\u0064",factor );
|
|
};return _dff (_fbbc ,factor );};func _bfg (_aae ,_baec *Monochrome ,_ege []byte ,_gda int )(_aea error ){var (_bca ,_egg ,_cca ,_aabc ,_fef ,_daa ,_gfc ,_eaf int ;_gca ,_acd uint32 ;_fec ,_cad byte ;_gfdb uint16 ;);_dcbb :=make ([]byte ,4);_cbd :=make ([]byte ,4);
|
|
for _cca =0;_cca < _aae .Height -1;_cca ,_aabc =_cca +2,_aabc +1{_bca =_cca *_aae .BytesPerLine ;_egg =_aabc *_baec .BytesPerLine ;for _fef ,_daa =0,0;_fef < _gda ;_fef ,_daa =_fef +4,_daa +1{for _gfc =0;_gfc < 4;_gfc ++{_eaf =_bca +_fef +_gfc ;if _eaf <=len (_aae .Data )-1&&_eaf < _bca +_aae .BytesPerLine {_dcbb [_gfc ]=_aae .Data [_eaf ];
|
|
}else {_dcbb [_gfc ]=0x00;};_eaf =_bca +_aae .BytesPerLine +_fef +_gfc ;if _eaf <=len (_aae .Data )-1&&_eaf < _bca +(2*_aae .BytesPerLine ){_cbd [_gfc ]=_aae .Data [_eaf ];}else {_cbd [_gfc ]=0x00;};};_gca =_ce .BigEndian .Uint32 (_dcbb );_acd =_ce .BigEndian .Uint32 (_cbd );
|
|
_acd |=_gca ;_acd |=_acd <<1;_acd &=0xaaaaaaaa;_gca =_acd |(_acd <<7);_fec =byte (_gca >>24);_cad =byte ((_gca >>8)&0xff);_eaf =_egg +_daa ;if _eaf +1==len (_baec .Data )-1||_eaf +1>=_egg +_baec .BytesPerLine {_baec .Data [_eaf ]=_ege [_fec ];}else {_gfdb =(uint16 (_ege [_fec ])<<8)|uint16 (_ege [_cad ]);
|
|
if _aea =_baec .setTwoBytes (_eaf ,_gfdb );_aea !=nil {return _e .Errorf ("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",_eaf );
|
|
};_daa ++;};};};return nil ;};func (_agga *Monochrome )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Monochrome ,sx ,sy int )error {return _faad (_agga ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};var _ Gray =&Gray16 {};func (_agadc *NRGBA32 )Set (x ,y int ,c _c .Color ){_baddb :=y *_agadc .Width +x ;
|
|
_dbge :=3*_baddb ;if _dbge +2>=len (_agadc .Data ){return ;};_cegb :=_c .NRGBAModel .Convert (c ).(_c .NRGBA );_agadc .setRGBA (_baddb ,_cegb );};func (_ggda *Monochrome )Set (x ,y int ,c _c .Color ){_ace :=y *_ggda .BytesPerLine +x >>3;if _ace > len (_ggda .Data )-1{return ;
|
|
};_ccgg :=_ggda .ColorModel ().Convert (c ).(_c .Gray );_ggda .setGray (x ,_ccgg ,_ace );};type monochromeThresholdConverter struct{Threshold uint8 ;};func (_aeced *RGBA32 )Validate ()error {if len (_aeced .Data )!=3*_aeced .Width *_aeced .Height {return _f .New ("i\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0069\u006da\u0067\u0065\u0020\u0064\u0061\u0074\u0061 s\u0069\u007a\u0065\u0020f\u006f\u0072\u0020\u0070\u0072\u006f\u0076\u0069\u0064ed\u0020\u0064i\u006d\u0065\u006e\u0073\u0069\u006f\u006e\u0073");
|
|
};return nil ;};func _fcgf (_gaba ,_bfaf NRGBA ,_ced _fc .Rectangle ){for _ffdge :=0;_ffdge < _ced .Max .X ;_ffdge ++{for _cdfg :=0;_cdfg < _ced .Max .Y ;_cdfg ++{_bfaf .SetNRGBA (_ffdge ,_cdfg ,_gaba .NRGBAAt (_ffdge ,_cdfg ));};};};func _bagf (_fba _fc .Image )(Image ,error ){if _eedb ,_abe :=_fba .(*CMYK32 );
|
|
_abe {return _eedb .Copy (),nil ;};_ebea :=_fba .Bounds ();_bad ,_eddb :=NewImage (_ebea .Max .X ,_ebea .Max .Y ,8,4,nil ,nil ,nil );if _eddb !=nil {return nil ,_eddb ;};switch _affg :=_fba .(type ){case CMYK :_gbbd (_affg ,_bad .(CMYK ),_ebea );case Gray :_bdba (_affg ,_bad .(CMYK ),_ebea );
|
|
case NRGBA :_afa (_affg ,_bad .(CMYK ),_ebea );case RGBA :_cfeb (_affg ,_bad .(CMYK ),_ebea );default:_adc (_fba ,_bad ,_ebea );};return _bad ,nil ;};func (_gaaf *Monochrome )Validate ()error {if len (_gaaf .Data )!=_gaaf .Height *_gaaf .BytesPerLine {return ErrInvalidImage ;
|
|
};return nil ;};func GrayHistogram (g Gray )(_eebd [256]int ){switch _bddg :=g .(type ){case Histogramer :return _bddg .Histogram ();case _fc .Image :_dgda :=_bddg .Bounds ();for _agcg :=0;_agcg < _dgda .Max .X ;_agcg ++{for _ecfc :=0;_ecfc < _dgda .Max .Y ;
|
|
_ecfc ++{_eebd [g .GrayAt (_agcg ,_ecfc ).Y ]++;};};return _eebd ;default:return [256]int {};};};func _cecg (_bffd _c .NRGBA64 )_c .NRGBA {return _c .NRGBA {R :uint8 (_bffd .R >>8),G :uint8 (_bffd .G >>8),B :uint8 (_bffd .B >>8),A :uint8 (_bffd .A >>8)};
|
|
};func (_ggd *CMYK32 )At (x ,y int )_c .Color {_eea ,_ :=_ggd .ColorAt (x ,y );return _eea };func _bfeg (_agcf NRGBA ,_cceec RGBA ,_cgda _fc .Rectangle ){for _efdf :=0;_efdf < _cgda .Max .X ;_efdf ++{for _ceag :=0;_ceag < _cgda .Max .Y ;_ceag ++{_cddd :=_agcf .NRGBAAt (_efdf ,_ceag );
|
|
_cceec .SetRGBA (_efdf ,_ceag ,_ggg (_cddd ));};};};func (_ddgc *Gray8 )Histogram ()(_gcdd [256]int ){for _agdc :=0;_agdc < len (_ddgc .Data );_agdc ++{_gcdd [_ddgc .Data [_agdc ]]++;};return _gcdd ;};func (_ddb *Monochrome )AddPadding ()(_caga error ){if _dfef :=((_ddb .Width *_ddb .Height )+7)>>3;
|
|
len (_ddb .Data )< _dfef {return _e .Errorf ("\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 (_ddb .Data ),_dfef );
|
|
};_aed :=_ddb .Width %8;if _aed ==0{return nil ;};_dddb :=_ddb .Width /8;_cafc :=_da .NewReader (_ddb .Data );_daf :=make ([]byte ,_ddb .Height *_ddb .BytesPerLine );_edba :=_da .NewWriterMSB (_daf );_aeab :=make ([]byte ,_dddb );var (_ggce int ;_dfca uint64 ;
|
|
);for _ggce =0;_ggce < _ddb .Height ;_ggce ++{if _ ,_caga =_cafc .Read (_aeab );_caga !=nil {return _caga ;};if _ ,_caga =_edba .Write (_aeab );_caga !=nil {return _caga ;};if _dfca ,_caga =_cafc .ReadBits (byte (_aed ));_caga !=nil {return _caga ;};if _caga =_edba .WriteByte (byte (_dfca )<<uint (8-_aed ));
|
|
_caga !=nil {return _caga ;};};_ddb .Data =_edba .Data ();return nil ;};var _ Image =&Monochrome {};func _afe (_gbgg Gray ,_fbaa NRGBA ,_bfde _fc .Rectangle ){for _fcdc :=0;_fcdc < _bfde .Max .X ;_fcdc ++{for _dgea :=0;_dgea < _bfde .Max .Y ;_dgea ++{_fbgg :=_gfa (_fbaa .NRGBAAt (_fcdc ,_dgea ));
|
|
_gbgg .SetGray (_fcdc ,_dgea ,_fbgg );};};};func _aef (_gcaa ,_efe *Monochrome ,_dde []byte ,_eed int )(_aee error ){var (_bba ,_bfe ,_dccg ,_babb ,_bfa ,_agae ,_eggd ,_bfgb int ;_acba ,_cec uint32 ;_eeda ,_gbbf byte ;_fee uint16 ;);_ggb :=make ([]byte ,4);
|
|
_fgfd :=make ([]byte ,4);for _dccg =0;_dccg < _gcaa .Height -1;_dccg ,_babb =_dccg +2,_babb +1{_bba =_dccg *_gcaa .BytesPerLine ;_bfe =_babb *_efe .BytesPerLine ;for _bfa ,_agae =0,0;_bfa < _eed ;_bfa ,_agae =_bfa +4,_agae +1{for _eggd =0;_eggd < 4;_eggd ++{_bfgb =_bba +_bfa +_eggd ;
|
|
if _bfgb <=len (_gcaa .Data )-1&&_bfgb < _bba +_gcaa .BytesPerLine {_ggb [_eggd ]=_gcaa .Data [_bfgb ];}else {_ggb [_eggd ]=0x00;};_bfgb =_bba +_gcaa .BytesPerLine +_bfa +_eggd ;if _bfgb <=len (_gcaa .Data )-1&&_bfgb < _bba +(2*_gcaa .BytesPerLine ){_fgfd [_eggd ]=_gcaa .Data [_bfgb ];
|
|
}else {_fgfd [_eggd ]=0x00;};};_acba =_ce .BigEndian .Uint32 (_ggb );_cec =_ce .BigEndian .Uint32 (_fgfd );_cec &=_acba ;_cec &=_cec <<1;_cec &=0xaaaaaaaa;_acba =_cec |(_cec <<7);_eeda =byte (_acba >>24);_gbbf =byte ((_acba >>8)&0xff);_bfgb =_bfe +_agae ;
|
|
if _bfgb +1==len (_efe .Data )-1||_bfgb +1>=_bfe +_efe .BytesPerLine {_efe .Data [_bfgb ]=_dde [_eeda ];if _aee =_efe .setByte (_bfgb ,_dde [_eeda ]);_aee !=nil {return _e .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_bfgb );};}else {_fee =(uint16 (_dde [_eeda ])<<8)|uint16 (_dde [_gbbf ]);
|
|
if _aee =_efe .setTwoBytes (_bfgb ,_fee );_aee !=nil {return _e .Errorf ("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",_bfgb );
|
|
};_agae ++;};};};return nil ;};func _gcdcc (_gdfg *_fc .NYCbCrA ,_eaadf RGBA ,_ddgcc _fc .Rectangle ){for _dec :=0;_dec < _ddgcc .Max .X ;_dec ++{for _gadcc :=0;_gadcc < _ddgcc .Max .Y ;_gadcc ++{_ddaca :=_gdfg .NYCbCrAAt (_dec ,_gadcc );_eaadf .SetRGBA (_dec ,_gadcc ,_fbbb (_ddaca ));
|
|
};};};func _dgac (_dagd _c .Gray )_c .Gray {_dagd .Y >>=4;_dagd .Y |=_dagd .Y <<4;return _dagd };func BytesPerLine (width ,bitsPerComponent ,colorComponents int )int {return ((width *bitsPerComponent )*colorComponents +7)>>3;};func (_bdgfa *ImageBase )Pix ()[]byte {return _bdgfa .Data };
|
|
func (_aba *ImageBase )MakeAlpha (){_aba .newAlpha ()};func (_ddge *CMYK32 )SetCMYK (x ,y int ,c _c .CMYK ){_fgfe :=4*(y *_ddge .Width +x );if _fgfe +3>=len (_ddge .Data ){return ;};_ddge .Data [_fgfe ]=c .C ;_ddge .Data [_fgfe +1]=c .M ;_ddge .Data [_fgfe +2]=c .Y ;
|
|
_ddge .Data [_fgfe +3]=c .K ;};func _abd (_cde _c .RGBA )_c .Gray {_eggb :=(19595*uint32 (_cde .R )+38470*uint32 (_cde .G )+7471*uint32 (_cde .B )+1<<7)>>16;return _c .Gray {Y :uint8 (_eggb )};};func (_abdd *Gray4 )Copy ()Image {return &Gray4 {ImageBase :_abdd .copy ()}};
|
|
func (_fdca *Gray2 )Histogram ()(_edgd [256]int ){for _agf :=0;_agf < _fdca .Width ;_agf ++{for _fbcb :=0;_fbcb < _fdca .Height ;_fbcb ++{_edgd [_fdca .GrayAt (_agf ,_fbcb ).Y ]++;};};return _edgd ;};func (_dade *Gray4 )Base ()*ImageBase {return &_dade .ImageBase };
|
|
type NRGBA64 struct{ImageBase };func NextPowerOf2 (n uint )uint {if IsPowerOf2 (n ){return n ;};return 1<<(_cfea (n )+1);};func (_ddfd *NRGBA64 )Base ()*ImageBase {return &_ddfd .ImageBase };func (_cgeg *NRGBA16 )NRGBAAt (x ,y int )_c .NRGBA {_ffbd ,_ :=ColorAtNRGBA16 (x ,y ,_cgeg .Width ,_cgeg .BytesPerLine ,_cgeg .Data ,_cgeg .Alpha ,_cgeg .Decode );
|
|
return _ffbd ;};var _ Image =&NRGBA32 {};func (_gfcb *Monochrome )setBit (_fdbd ,_egd int ){_gfcb .Data [_fdbd +(_egd >>3)]|=0x80>>uint (_egd &7)};func (_gecc *Gray8 )ColorModel ()_c .Model {return _c .GrayModel };var _ Image =&Gray4 {};func _beadd (_edaf *Monochrome ,_fga ,_geagg ,_fcca ,_bdfd int ,_eabe RasterOperator ,_fbfe *Monochrome ,_febe ,_bfcc int )error {var (_ggba bool ;
|
|
_dcfd bool ;_gada byte ;_gadd int ;_aadf int ;_bcce int ;_bdcd int ;_agbd bool ;_gdfc int ;_daed int ;_bggb int ;_dcfb bool ;_ffdd byte ;_cbdg int ;_cgde int ;_afeg int ;_dccb byte ;_cebe int ;_ceed int ;_ffcb uint ;_dege uint ;_fccb byte ;_fdf shift ;
|
|
_caad bool ;_bef bool ;_dcff ,_caadf int ;);if _febe &7!=0{_ceed =8-(_febe &7);};if _fga &7!=0{_aadf =8-(_fga &7);};if _ceed ==0&&_aadf ==0{_fccb =_fcdd [0];}else {if _aadf > _ceed {_ffcb =uint (_aadf -_ceed );}else {_ffcb =uint (8-(_ceed -_aadf ));};_dege =8-_ffcb ;
|
|
_fccb =_fcdd [_ffcb ];};if (_fga &7)!=0{_ggba =true ;_gadd =8-(_fga &7);_gada =_fcdd [_gadd ];_bcce =_edaf .BytesPerLine *_geagg +(_fga >>3);_bdcd =_fbfe .BytesPerLine *_bfcc +(_febe >>3);_cebe =8-(_febe &7);if _gadd > _cebe {_fdf =_cabg ;if _fcca >=_ceed {_caad =true ;
|
|
};}else {_fdf =_begf ;};};if _fcca < _gadd {_dcfd =true ;_gada &=_dffc [8-_gadd +_fcca ];};if !_dcfd {_gdfc =(_fcca -_gadd )>>3;if _gdfc !=0{_agbd =true ;_daed =_edaf .BytesPerLine *_geagg +((_fga +_aadf )>>3);_bggb =_fbfe .BytesPerLine *_bfcc +((_febe +_aadf )>>3);
|
|
};};_cbdg =(_fga +_fcca )&7;if !(_dcfd ||_cbdg ==0){_dcfb =true ;_ffdd =_dffc [_cbdg ];_cgde =_edaf .BytesPerLine *_geagg +((_fga +_aadf )>>3)+_gdfc ;_afeg =_fbfe .BytesPerLine *_bfcc +((_febe +_aadf )>>3)+_gdfc ;if _cbdg > int (_dege ){_bef =true ;};};
|
|
switch _eabe {case PixSrc :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );};}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],_dccb ,_gada );
|
|
_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );_edaf .Data [_daed +_caadf ]=_dccb ;
|
|
};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;};};if _dcfb {for _dcff =0;_dcff < _bdfd ;_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],_dccb ,_ffdd );
|
|
_cgde +=_edaf .BytesPerLine ;_afeg +=_fbfe .BytesPerLine ;};};case PixNotSrc :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );};}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;
|
|
};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],^_dccb ,_gada );_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );
|
|
_edaf .Data [_daed +_caadf ]=^_dccb ;};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;};};if _dcfb {for _dcff =0;_dcff < _bdfd ;_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );
|
|
};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],^_dccb ,_ffdd );_cgde +=_edaf .BytesPerLine ;_afeg +=_fbfe .BytesPerLine ;};};case PixSrcOrDst :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );
|
|
};}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],_dccb |_edaf .Data [_bcce ],_gada );_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;
|
|
_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );_edaf .Data [_daed +_caadf ]|=_dccb ;};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;};};if _dcfb {for _dcff =0;_dcff < _bdfd ;
|
|
_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],_dccb |_edaf .Data [_cgde ],_ffdd );_cgde +=_edaf .BytesPerLine ;_afeg +=_fbfe .BytesPerLine ;
|
|
};};case PixSrcAndDst :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );};}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],_dccb &_edaf .Data [_bcce ],_gada );
|
|
_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );_edaf .Data [_daed +_caadf ]&=_dccb ;
|
|
};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;};};if _dcfb {for _dcff =0;_dcff < _bdfd ;_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],_dccb &_edaf .Data [_cgde ],_ffdd );
|
|
_cgde +=_edaf .BytesPerLine ;_afeg +=_fbfe .BytesPerLine ;};};case PixSrcXorDst :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );};
|
|
}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],_dccb ^_edaf .Data [_bcce ],_gada );_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;
|
|
_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );_edaf .Data [_daed +_caadf ]^=_dccb ;};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;};};if _dcfb {for _dcff =0;_dcff < _bdfd ;
|
|
_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],_dccb ^_edaf .Data [_cgde ],_ffdd );_cgde +=_edaf .BytesPerLine ;_afeg +=_fbfe .BytesPerLine ;
|
|
};};case PixNotSrcOrDst :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );};}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],^_dccb |_edaf .Data [_bcce ],_gada );
|
|
_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );_edaf .Data [_daed +_caadf ]|=^_dccb ;
|
|
};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;};};if _dcfb {for _dcff =0;_dcff < _bdfd ;_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],^_dccb |_edaf .Data [_cgde ],_ffdd );
|
|
_cgde +=_edaf .BytesPerLine ;_afeg +=_fbfe .BytesPerLine ;};};case PixNotSrcAndDst :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );
|
|
};}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],^_dccb &_edaf .Data [_bcce ],_gada );_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;
|
|
_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );_edaf .Data [_daed +_caadf ]&=^_dccb ;};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;};};if _dcfb {for _dcff =0;_dcff < _bdfd ;
|
|
_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],^_dccb &_edaf .Data [_cgde ],_ffdd );_cgde +=_edaf .BytesPerLine ;_afeg +=_fbfe .BytesPerLine ;
|
|
};};case PixSrcOrNotDst :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );};}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],_dccb |^_edaf .Data [_bcce ],_gada );
|
|
_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );_edaf .Data [_daed +_caadf ]=_dccb |^_edaf .Data [_daed +_caadf ];
|
|
};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;};};if _dcfb {for _dcff =0;_dcff < _bdfd ;_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],_dccb |^_edaf .Data [_cgde ],_ffdd );
|
|
_cgde +=_edaf .BytesPerLine ;_afeg +=_fbfe .BytesPerLine ;};};case PixSrcAndNotDst :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );
|
|
};}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],_dccb &^_edaf .Data [_bcce ],_gada );_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;
|
|
_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );_edaf .Data [_daed +_caadf ]=_dccb &^_edaf .Data [_daed +_caadf ];};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;};
|
|
};if _dcfb {for _dcff =0;_dcff < _bdfd ;_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],_dccb &^_edaf .Data [_cgde ],_ffdd );_cgde +=_edaf .BytesPerLine ;
|
|
_afeg +=_fbfe .BytesPerLine ;};};case PixNotPixSrcOrDst :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );};}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;
|
|
};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],^(_dccb |_edaf .Data [_bcce ]),_gada );_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );
|
|
_edaf .Data [_daed +_caadf ]=^(_dccb |_edaf .Data [_daed +_caadf ]);};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;};};if _dcfb {for _dcff =0;_dcff < _bdfd ;_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );
|
|
};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],^(_dccb |_edaf .Data [_cgde ]),_ffdd );_cgde +=_edaf .BytesPerLine ;_afeg +=_fbfe .BytesPerLine ;};};case PixNotPixSrcAndDst :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;
|
|
if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );};}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],^(_dccb &_edaf .Data [_bcce ]),_gada );_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;
|
|
};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );_edaf .Data [_daed +_caadf ]=^(_dccb &_edaf .Data [_daed +_caadf ]);
|
|
};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;};};if _dcfb {for _dcff =0;_dcff < _bdfd ;_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],^(_dccb &_edaf .Data [_cgde ]),_ffdd );
|
|
_cgde +=_edaf .BytesPerLine ;_afeg +=_fbfe .BytesPerLine ;};};case PixNotPixSrcXorDst :if _ggba {for _dcff =0;_dcff < _bdfd ;_dcff ++{if _fdf ==_cabg {_dccb =_fbfe .Data [_bdcd ]<<_ffcb ;if _caad {_dccb =_fgaf (_dccb ,_fbfe .Data [_bdcd +1]>>_dege ,_fccb );
|
|
};}else {_dccb =_fbfe .Data [_bdcd ]>>_dege ;};_edaf .Data [_bcce ]=_fgaf (_edaf .Data [_bcce ],^(_dccb ^_edaf .Data [_bcce ]),_gada );_bcce +=_edaf .BytesPerLine ;_bdcd +=_fbfe .BytesPerLine ;};};if _agbd {for _dcff =0;_dcff < _bdfd ;_dcff ++{for _caadf =0;
|
|
_caadf < _gdfc ;_caadf ++{_dccb =_fgaf (_fbfe .Data [_bggb +_caadf ]<<_ffcb ,_fbfe .Data [_bggb +_caadf +1]>>_dege ,_fccb );_edaf .Data [_daed +_caadf ]=^(_dccb ^_edaf .Data [_daed +_caadf ]);};_daed +=_edaf .BytesPerLine ;_bggb +=_fbfe .BytesPerLine ;
|
|
};};if _dcfb {for _dcff =0;_dcff < _bdfd ;_dcff ++{_dccb =_fbfe .Data [_afeg ]<<_ffcb ;if _bef {_dccb =_fgaf (_dccb ,_fbfe .Data [_afeg +1]>>_dege ,_fccb );};_edaf .Data [_cgde ]=_fgaf (_edaf .Data [_cgde ],^(_dccb ^_edaf .Data [_cgde ]),_ffdd );_cgde +=_edaf .BytesPerLine ;
|
|
_afeg +=_fbfe .BytesPerLine ;};};default:_b .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",_eabe );return _f .New ("\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 (_gea *CMYK32 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtCMYK (x ,y ,_gea .Width ,_gea .Data ,_gea .Decode );};func FromGoImage (i _fc .Image )(Image ,error ){switch _gbdb :=i .(type ){case Image :return _gbdb .Copy (),nil ;
|
|
case Gray :return GrayConverter .Convert (i );case *_fc .Gray16 :return Gray16Converter .Convert (i );case CMYK :return CMYKConverter .Convert (i );case *_fc .NRGBA64 :return NRGBA64Converter .Convert (i );default:return NRGBAConverter .Convert (i );};
|
|
};func (_acda *Gray8 )Base ()*ImageBase {return &_acda .ImageBase };func _ega (_cd *Monochrome ,_bag ,_gcg int )(*Monochrome ,error ){if _cd ==nil {return nil ,_f .New ("\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _bag <=0||_gcg <=0{return nil ,_f .New ("\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 _bag ==_gcg {if _bag ==1{return _cd .copy (),nil ;};
|
|
if _bag ==2||_bag ==4||_bag ==8{_ebd ,_cbef :=_dff (_cd ,_bag );if _cbef !=nil {return nil ,_cbef ;};return _ebd ,nil ;};};_fcc :=_bag *_cd .Width ;_ec :=_gcg *_cd .Height ;_ccff :=_eeb (_fcc ,_ec );_dc :=_ccff .BytesPerLine ;var (_dd ,_eag ,_aa ,_fae ,_aaa int ;
|
|
_fac byte ;_dcb error ;);for _eag =0;_eag < _cd .Height ;_eag ++{_dd =_gcg *_eag *_dc ;for _aa =0;_aa < _cd .Width ;_aa ++{if _gb :=_cd .getBitAt (_aa ,_eag );_gb {_aaa =_bag *_aa ;for _fae =0;_fae < _bag ;_fae ++{_ccff .setIndexedBit (_dd *8+_aaa +_fae );
|
|
};};};for _fae =1;_fae < _gcg ;_fae ++{_cgg :=_dd +_fae *_dc ;for _bedc :=0;_bedc < _dc ;_bedc ++{if _fac ,_dcb =_ccff .getByte (_dd +_bedc );_dcb !=nil {return nil ,_dcb ;};if _dcb =_ccff .setByte (_cgg +_bedc ,_fac );_dcb !=nil {return nil ,_dcb ;};};
|
|
};};return _ccff ,nil ;};func MonochromeThresholdConverter (threshold uint8 )ColorConverter {return &monochromeThresholdConverter {Threshold :threshold };};var (MonochromeConverter =ConverterFunc (_abdg );Gray2Converter =ConverterFunc (_ffgeb );Gray4Converter =ConverterFunc (_eafa );
|
|
GrayConverter =ConverterFunc (_gefd );Gray16Converter =ConverterFunc (_eedbf );NRGBA16Converter =ConverterFunc (_cecbg );NRGBAConverter =ConverterFunc (_effe );NRGBA64Converter =ConverterFunc (_eadg );RGBAConverter =ConverterFunc (_gcfe );CMYKConverter =ConverterFunc (_bagf );
|
|
);var _ RGBA =&RGBA32 {};func ColorAtGrayscale (x ,y ,bitsPerColor ,bytesPerLine int ,data []byte ,decode []float64 )(_c .Color ,error ){switch bitsPerColor {case 1:return ColorAtGray1BPC (x ,y ,bytesPerLine ,data ,decode );case 2:return ColorAtGray2BPC (x ,y ,bytesPerLine ,data ,decode );
|
|
case 4:return ColorAtGray4BPC (x ,y ,bytesPerLine ,data ,decode );case 8:return ColorAtGray8BPC (x ,y ,bytesPerLine ,data ,decode );case 16:return ColorAtGray16BPC (x ,y ,bytesPerLine ,data ,decode );default:return nil ,_e .Errorf ("\u0075\u006e\u0073\u0075\u0070\u0070\u006f\u0072\u0074\u0065\u0064\u0020\u0067\u0072\u0061\u0079\u0020\u0073c\u0061\u006c\u0065\u0020\u0062\u0069\u0074s\u0020\u0070\u0065\u0072\u0020\u0063\u006f\u006c\u006f\u0072\u0020a\u006d\u006f\u0075\u006e\u0074\u003a\u0020\u0027\u0025\u0064\u0027",bitsPerColor );
|
|
};};func (_agg *Gray16 )GrayAt (x ,y int )_c .Gray {_cdg ,_ :=_agg .ColorAt (x ,y );return _c .Gray {Y :uint8 (_cdg .(_c .Gray16 ).Y >>8)};};func (_eda *Gray4 )Bounds ()_fc .Rectangle {return _fc .Rectangle {Max :_fc .Point {X :_eda .Width ,Y :_eda .Height }};
|
|
};func (_edag *Gray16 )Copy ()Image {return &Gray16 {ImageBase :_edag .copy ()}};func _gfcf (_cfca *Monochrome ,_ecab ,_gga ,_gade ,_egbcf int ,_bgba RasterOperator ,_edbc *Monochrome ,_dgdce ,_fgfg int )error {var (_fbeaf byte ;_gdeb int ;_gaad int ;_cgf ,_gbaef int ;
|
|
_eecab ,_fbabc int ;);_gfca :=_gade >>3;_eadf :=_gade &7;if _eadf > 0{_fbeaf =_dffc [_eadf ];};_gdeb =_edbc .BytesPerLine *_fgfg +(_dgdce >>3);_gaad =_cfca .BytesPerLine *_gga +(_ecab >>3);switch _bgba {case PixSrc :for _eecab =0;_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;
|
|
_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]=_edbc .Data [_cgf ];_gbaef ++;_cgf ++;};if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],_edbc .Data [_cgf ],_fbeaf );};};case PixNotSrc :for _eecab =0;
|
|
_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]=^(_edbc .Data [_cgf ]);_gbaef ++;_cgf ++;};if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],^_edbc .Data [_cgf ],_fbeaf );
|
|
};};case PixSrcOrDst :for _eecab =0;_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]|=_edbc .Data [_cgf ];_gbaef ++;_cgf ++;};
|
|
if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],_edbc .Data [_cgf ]|_cfca .Data [_gbaef ],_fbeaf );};};case PixSrcAndDst :for _eecab =0;_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;
|
|
for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]&=_edbc .Data [_cgf ];_gbaef ++;_cgf ++;};if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],_edbc .Data [_cgf ]&_cfca .Data [_gbaef ],_fbeaf );};};case PixSrcXorDst :for _eecab =0;
|
|
_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]^=_edbc .Data [_cgf ];_gbaef ++;_cgf ++;};if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],_edbc .Data [_cgf ]^_cfca .Data [_gbaef ],_fbeaf );
|
|
};};case PixNotSrcOrDst :for _eecab =0;_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]|=^(_edbc .Data [_cgf ]);_gbaef ++;_cgf ++;
|
|
};if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],^(_edbc .Data [_cgf ])|_cfca .Data [_gbaef ],_fbeaf );};};case PixNotSrcAndDst :for _eecab =0;_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;
|
|
for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]&=^(_edbc .Data [_cgf ]);_gbaef ++;_cgf ++;};if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],^(_edbc .Data [_cgf ])&_cfca .Data [_gbaef ],_fbeaf );};};case PixSrcOrNotDst :for _eecab =0;
|
|
_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]=_edbc .Data [_cgf ]|^(_cfca .Data [_gbaef ]);_gbaef ++;_cgf ++;};if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],_edbc .Data [_cgf ]|^(_cfca .Data [_gbaef ]),_fbeaf );
|
|
};};case PixSrcAndNotDst :for _eecab =0;_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]=_edbc .Data [_cgf ]&^(_cfca .Data [_gbaef ]);
|
|
_gbaef ++;_cgf ++;};if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],_edbc .Data [_cgf ]&^(_cfca .Data [_gbaef ]),_fbeaf );};};case PixNotPixSrcOrDst :for _eecab =0;_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;
|
|
for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]=^(_edbc .Data [_cgf ]|_cfca .Data [_gbaef ]);_gbaef ++;_cgf ++;};if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],^(_edbc .Data [_cgf ]|_cfca .Data [_gbaef ]),_fbeaf );};};case PixNotPixSrcAndDst :for _eecab =0;
|
|
_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]=^(_edbc .Data [_cgf ]&_cfca .Data [_gbaef ]);_gbaef ++;_cgf ++;};if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],^(_edbc .Data [_cgf ]&_cfca .Data [_gbaef ]),_fbeaf );
|
|
};};case PixNotPixSrcXorDst :for _eecab =0;_eecab < _egbcf ;_eecab ++{_cgf =_gdeb +_eecab *_edbc .BytesPerLine ;_gbaef =_gaad +_eecab *_cfca .BytesPerLine ;for _fbabc =0;_fbabc < _gfca ;_fbabc ++{_cfca .Data [_gbaef ]=^(_edbc .Data [_cgf ]^_cfca .Data [_gbaef ]);
|
|
_gbaef ++;_cgf ++;};if _eadf > 0{_cfca .Data [_gbaef ]=_fgaf (_cfca .Data [_gbaef ],^(_edbc .Data [_cgf ]^_cfca .Data [_gbaef ]),_fbeaf );};};default:_b .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",_bgba );
|
|
return _f .New ("\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");};return nil ;};func (_cdfc *NRGBA64 )Copy ()Image {return &NRGBA64 {ImageBase :_cdfc .copy ()}};var _ Image =&Gray2 {};
|
|
func (_badd *Monochrome )setIndexedBit (_aaag int ){_badd .Data [(_aaag >>3)]|=0x80>>uint (_aaag &7)};var (_dffc =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};_fcdd =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);var _ _fc .Image =&NRGBA64 {};
|
|
func _afa (_ccd NRGBA ,_ffca CMYK ,_dag _fc .Rectangle ){for _fbd :=0;_fbd < _dag .Max .X ;_fbd ++{for _gdg :=0;_gdg < _dag .Max .Y ;_gdg ++{_eddd :=_ccd .NRGBAAt (_fbd ,_gdg );_ffca .SetCMYK (_fbd ,_gdg ,_ddf (_eddd ));};};};func init (){_ccdd ()};func _aab (_fgc *Monochrome ,_dgb int ,_bdf []byte )(_fdc *Monochrome ,_deb error ){const _dda ="\u0072\u0065d\u0075\u0063\u0065R\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079";
|
|
if _fgc ==nil {return nil ,_f .New ("\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _dgb < 1||_dgb > 4{return nil ,_f .New ("\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 _fgc .Height <=1{return nil ,_f .New ("\u0073\u006f\u0075rc\u0065\u0020\u0068\u0065\u0069\u0067\u0068\u0074\u0020m\u0075s\u0074 \u0062e\u0020\u0061\u0074\u0020\u006c\u0065\u0061\u0073\u0074\u0020\u0027\u0032\u0027");};_fdc =_eeb (_fgc .Width /2,_fgc .Height /2);
|
|
if _bdf ==nil {_bdf =_aff ();};_ede :=_cfab (_fgc .BytesPerLine ,2*_fdc .BytesPerLine );switch _dgb {case 1:_deb =_bfg (_fgc ,_fdc ,_bdf ,_ede );case 2:_deb =_bdg (_fgc ,_fdc ,_bdf ,_ede );case 3:_deb =_gege (_fgc ,_fdc ,_bdf ,_ede );case 4:_deb =_aef (_fgc ,_fdc ,_bdf ,_ede );
|
|
};if _deb !=nil {return nil ,_deb ;};return _fdc ,nil ;};func (_dcg *Gray2 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtGray2BPC (x ,y ,_dcg .BytesPerLine ,_dcg .Data ,_dcg .Decode );};func _ccgce (_fegad []byte ,_ebgc Image )error {_befe :=true ;
|
|
for _cgdg :=0;_cgdg < len (_fegad );_cgdg ++{if _fegad [_cgdg ]!=0xff{_befe =false ;break ;};};if _befe {switch _dgbg :=_ebgc .(type ){case *NRGBA32 :_dgbg .Alpha =nil ;case *NRGBA64 :_dgbg .Alpha =nil ;default:return _e .Errorf ("i\u006ete\u0072n\u0061l\u0020\u0065\u0072\u0072\u006fr\u0020\u002d\u0020i\u006d\u0061\u0067\u0065\u0020s\u0068\u006f\u0075l\u0064\u0020\u0062\u0065\u0020\u006f\u0066\u0020\u0074\u0079\u0070e\u0020\u002a\u004eRGB\u0041\u0033\u0032\u0020\u006f\u0072 \u002a\u004e\u0052\u0047\u0042\u0041\u0036\u0034\u0020\u0062\u0075\u0074 \u0069s\u003a\u0020\u0025\u0054",_ebgc );
|
|
};};return nil ;};func ColorAt (x ,y ,width ,bitsPerColor ,colorComponents ,bytesPerLine int ,data ,alpha []byte ,decode []float64 )(_c .Color ,error ){switch colorComponents {case 1:return ColorAtGrayscale (x ,y ,bitsPerColor ,bytesPerLine ,data ,decode );
|
|
case 3:return ColorAtNRGBA (x ,y ,width ,bytesPerLine ,bitsPerColor ,data ,alpha ,decode );case 4:return ColorAtCMYK (x ,y ,width ,data ,decode );default:return nil ,_e .Errorf ("\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0063o\u006c\u006f\u0072\u0020\u0063\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0020\u0066\u006f\u0072\u0020\u0074h\u0065\u0020\u0069\u006d\u0061\u0067\u0065\u003a\u0020\u0025\u0064",colorComponents );
|
|
};};func _bffa (_acgg Gray ,_feb nrgba64 ,_cefg _fc .Rectangle ){for _edfg :=0;_edfg < _cefg .Max .X ;_edfg ++{for _fbab :=0;_fbab < _cefg .Max .Y ;_fbab ++{_fdcb :=_fcdb (_feb .NRGBA64At (_edfg ,_fbab ));_acgg .SetGray (_edfg ,_fbab ,_fdcb );};};};func (_afce *Monochrome )InverseData ()error {return _afce .RasterOperation (0,0,_afce .Width ,_afce .Height ,PixNotDst ,nil ,0,0);
|
|
};func _agee (_eccc _c .Color )_c .Color {_dbfa :=_c .GrayModel .Convert (_eccc ).(_c .Gray );return _bcdc (_dbfa );};var _ _fc .Image =&Gray8 {};var ErrInvalidImage =_f .New ("i\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0069\u006da\u0067\u0065\u0020\u0064\u0061\u0074\u0061 s\u0069\u007a\u0065\u0020f\u006f\u0072\u0020\u0070\u0072\u006f\u0076\u0069\u0064ed\u0020\u0064i\u006d\u0065\u006e\u0073\u0069\u006f\u006e\u0073");
|
|
func _cbca (_gceb nrgba64 ,_bgafg RGBA ,_aag _fc .Rectangle ){for _gagd :=0;_gagd < _aag .Max .X ;_gagd ++{for _fbad :=0;_fbad < _aag .Max .Y ;_fbad ++{_agceg :=_gceb .NRGBA64At (_gagd ,_fbad );_bgafg .SetRGBA (_gagd ,_fbad ,_feeg (_agceg ));};};};func (_gcad *RGBA32 )SetRGBA (x ,y int ,c _c .RGBA ){_cefd :=y *_gcad .Width +x ;
|
|
_fedg :=3*_cefd ;if _fedg +2>=len (_gcad .Data ){return ;};_gcad .setRGBA (_cefd ,c );};func _dgdf (_dgf _fc .Image ,_agge Image ,_fbcg _fc .Rectangle ){switch _fecc :=_dgf .(type ){case Gray :_adae (_fecc ,_agge .(Gray ),_fbcg );case NRGBA :_cebd (_fecc ,_agge .(Gray ),_fbcg );
|
|
case CMYK :_adce (_fecc ,_agge .(Gray ),_fbcg );case RGBA :_bfga (_fecc ,_agge .(Gray ),_fbcg );default:_adc (_dgf ,_agge ,_fbcg );};};var _ _fc .Image =&Gray16 {};func (_bfbg *CMYK32 )CMYKAt (x ,y int )_c .CMYK {_afg ,_ :=ColorAtCMYK (x ,y ,_bfbg .Width ,_bfbg .Data ,_bfbg .Decode );
|
|
return _afg ;};func _fcgfc (_gcbc _fc .Image ,_gdbeb uint8 )*_fc .Gray {_aggcf :=_gcbc .Bounds ();_fbfg :=_fc .NewGray (_aggcf );var (_geagd _c .Color ;_faeb _c .Gray ;);for _gbbef :=0;_gbbef < _aggcf .Max .X ;_gbbef ++{for _eage :=0;_eage < _aggcf .Max .Y ;
|
|
_eage ++{_geagd =_gcbc .At (_gbbef ,_eage );_fbfg .Set (_gbbef ,_eage ,_geagd );_faeb =_fbfg .GrayAt (_gbbef ,_eage );_fbfg .SetGray (_gbbef ,_eage ,_c .Gray {Y :_bgcc (_faeb .Y ,_gdbeb )});};};return _fbfg ;};func (_fbde *RGBA32 )Set (x ,y int ,c _c .Color ){_efbd :=y *_fbde .Width +x ;
|
|
_bagd :=3*_efbd ;if _bagd +2>=len (_fbde .Data ){return ;};_eead :=_c .RGBAModel .Convert (c ).(_c .RGBA );_fbde .setRGBA (_efbd ,_eead );};func RasterOperation (dest *Monochrome ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Monochrome ,sx ,sy int )error {return _faad (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
};func (_bcbe *NRGBA32 )ColorModel ()_c .Model {return _c .NRGBAModel };func (_aaef *NRGBA16 )SetNRGBA (x ,y int ,c _c .NRGBA ){_efgf :=y *_aaef .BytesPerLine +x *3/2;if _efgf +1>=len (_aaef .Data ){return ;};c =_cbec (c );_aaef .setNRGBA (x ,y ,_efgf ,c );
|
|
};func ColorAtGray1BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_c .Gray ,error ){_ccac :=y *bytesPerLine +x >>3;if _ccac >=len (data ){return _c .Gray {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
};_abed :=data [_ccac ]>>uint (7-(x &7))&1;if len (decode )==2{_abed =uint8 (LinearInterpolate (float64 (_abed ),0.0,1.0,decode [0],decode [1]))&1;};return _c .Gray {Y :_abed *255},nil ;};func (_ffe *RGBA32 )RGBAAt (x ,y int )_c .RGBA {_bcad ,_ :=ColorAtRGBA32 (x ,y ,_ffe .Width ,_ffe .Data ,_ffe .Alpha ,_ffe .Decode );
|
|
return _bcad ;};func _fgb (_fcb *Monochrome ,_bc int ,_be []uint )(*Monochrome ,error ){_cb :=_bc *_fcb .Width ;_fa :=_bc *_fcb .Height ;_ag :=_eeb (_cb ,_fa );for _cc ,_fd :=range _be {var _af error ;switch _fd {case 2:_af =_ab (_ag ,_fcb );case 4:_af =_ad (_ag ,_fcb );
|
|
case 8:_af =_ada (_ag ,_fcb );};if _af !=nil {return nil ,_af ;};if _cc !=len (_be )-1{_fcb =_ag .copy ();};};return _ag ,nil ;};func (_afd *NRGBA32 )Validate ()error {if len (_afd .Data )!=3*_afd .Width *_afd .Height {return _f .New ("i\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0069\u006da\u0067\u0065\u0020\u0064\u0061\u0074\u0061 s\u0069\u007a\u0065\u0020f\u006f\u0072\u0020\u0070\u0072\u006f\u0076\u0069\u0064ed\u0020\u0064i\u006d\u0065\u006e\u0073\u0069\u006f\u006e\u0073");
|
|
};return nil ;};type NRGBA interface{NRGBAAt (_fege ,_bcgd int )_c .NRGBA ;SetNRGBA (_bggfg ,_dbbbd int ,_dgcd _c .NRGBA );};func _befd (_ggea RGBA ,_acbd NRGBA ,_dfcge _fc .Rectangle ){for _eacga :=0;_eacga < _dfcge .Max .X ;_eacga ++{for _egbf :=0;_egbf < _dfcge .Max .Y ;
|
|
_egbf ++{_gabaa :=_ggea .RGBAAt (_eacga ,_egbf );_acbd .SetNRGBA (_eacga ,_egbf ,_cbgc (_gabaa ));};};};func (_fegc *Gray8 )At (x ,y int )_c .Color {_bgcb ,_ :=_fegc .ColorAt (x ,y );return _bgcb };func (_cadea *NRGBA16 )ColorModel ()_c .Model {return NRGBA16Model };
|
|
var _ Gray =&Gray4 {};func _abdb (_dbcbc *Monochrome ,_agaf ,_dca ,_babbc ,_defd int ,_efgge RasterOperator ,_bbbc *Monochrome ,_cbge ,_feecc int )error {var (_ceeg bool ;_fcda bool ;_ggcg int ;_bfead int ;_eebf int ;_gbdc bool ;_eaa byte ;_eaec int ;_ggee int ;
|
|
_abbg int ;_bead ,_eagd int ;);_fddd :=8-(_agaf &7);_cbbe :=_fcdd [_fddd ];_cfga :=_dbcbc .BytesPerLine *_dca +(_agaf >>3);_fgcg :=_bbbc .BytesPerLine *_feecc +(_cbge >>3);if _babbc < _fddd {_ceeg =true ;_cbbe &=_dffc [8-_fddd +_babbc ];};if !_ceeg {_ggcg =(_babbc -_fddd )>>3;
|
|
if _ggcg > 0{_fcda =true ;_bfead =_cfga +1;_eebf =_fgcg +1;};};_eaec =(_agaf +_babbc )&7;if !(_ceeg ||_eaec ==0){_gbdc =true ;_eaa =_dffc [_eaec ];_ggee =_cfga +1+_ggcg ;_abbg =_fgcg +1+_ggcg ;};switch _efgge {case PixSrc :for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],_bbbc .Data [_fgcg ],_cbbe );
|
|
_cfga +=_dbcbc .BytesPerLine ;_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;_bead ++{for _eagd =0;_eagd < _ggcg ;_eagd ++{_dbcbc .Data [_bfead +_eagd ]=_bbbc .Data [_eebf +_eagd ];};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;
|
|
};};if _gbdc {for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],_bbbc .Data [_abbg ],_eaa );_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;};};case PixNotSrc :for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],^_bbbc .Data [_fgcg ],_cbbe );
|
|
_cfga +=_dbcbc .BytesPerLine ;_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;_bead ++{for _eagd =0;_eagd < _ggcg ;_eagd ++{_dbcbc .Data [_bfead +_eagd ]=^_bbbc .Data [_eebf +_eagd ];};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;
|
|
};};if _gbdc {for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],^_bbbc .Data [_abbg ],_eaa );_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;};};case PixSrcOrDst :for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],_bbbc .Data [_fgcg ]|_dbcbc .Data [_cfga ],_cbbe );
|
|
_cfga +=_dbcbc .BytesPerLine ;_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;_bead ++{for _eagd =0;_eagd < _ggcg ;_eagd ++{_dbcbc .Data [_bfead +_eagd ]|=_bbbc .Data [_eebf +_eagd ];};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;
|
|
};};if _gbdc {for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],_bbbc .Data [_abbg ]|_dbcbc .Data [_ggee ],_eaa );_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;};};case PixSrcAndDst :for _bead =0;_bead < _defd ;
|
|
_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],_bbbc .Data [_fgcg ]&_dbcbc .Data [_cfga ],_cbbe );_cfga +=_dbcbc .BytesPerLine ;_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;_bead ++{for _eagd =0;_eagd < _ggcg ;_eagd ++{_dbcbc .Data [_bfead +_eagd ]&=_bbbc .Data [_eebf +_eagd ];
|
|
};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;};};if _gbdc {for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],_bbbc .Data [_abbg ]&_dbcbc .Data [_ggee ],_eaa );_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;
|
|
};};case PixSrcXorDst :for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],_bbbc .Data [_fgcg ]^_dbcbc .Data [_cfga ],_cbbe );_cfga +=_dbcbc .BytesPerLine ;_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;
|
|
_bead ++{for _eagd =0;_eagd < _ggcg ;_eagd ++{_dbcbc .Data [_bfead +_eagd ]^=_bbbc .Data [_eebf +_eagd ];};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;};};if _gbdc {for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],_bbbc .Data [_abbg ]^_dbcbc .Data [_ggee ],_eaa );
|
|
_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;};};case PixNotSrcOrDst :for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],^(_bbbc .Data [_fgcg ])|_dbcbc .Data [_cfga ],_cbbe );_cfga +=_dbcbc .BytesPerLine ;
|
|
_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;_bead ++{for _eagd =0;_eagd < _ggcg ;_eagd ++{_dbcbc .Data [_bfead +_eagd ]|=^(_bbbc .Data [_eebf +_eagd ]);};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;};};if _gbdc {for _bead =0;
|
|
_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],^(_bbbc .Data [_abbg ])|_dbcbc .Data [_ggee ],_eaa );_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;};};case PixNotSrcAndDst :for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],^(_bbbc .Data [_fgcg ])&_dbcbc .Data [_cfga ],_cbbe );
|
|
_cfga +=_dbcbc .BytesPerLine ;_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;_bead ++{for _eagd =0;_eagd < _ggcg ;_eagd ++{_dbcbc .Data [_bfead +_eagd ]&=^_bbbc .Data [_eebf +_eagd ];};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;
|
|
};};if _gbdc {for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],^(_bbbc .Data [_abbg ])&_dbcbc .Data [_ggee ],_eaa );_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;};};case PixSrcOrNotDst :for _bead =0;
|
|
_bead < _defd ;_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],_bbbc .Data [_fgcg ]|^(_dbcbc .Data [_cfga ]),_cbbe );_cfga +=_dbcbc .BytesPerLine ;_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;_bead ++{for _eagd =0;_eagd < _ggcg ;
|
|
_eagd ++{_dbcbc .Data [_bfead +_eagd ]=_bbbc .Data [_eebf +_eagd ]|^(_dbcbc .Data [_bfead +_eagd ]);};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;};};if _gbdc {for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],_bbbc .Data [_abbg ]|^(_dbcbc .Data [_ggee ]),_eaa );
|
|
_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;};};case PixSrcAndNotDst :for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],_bbbc .Data [_fgcg ]&^(_dbcbc .Data [_cfga ]),_cbbe );_cfga +=_dbcbc .BytesPerLine ;
|
|
_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;_bead ++{for _eagd =0;_eagd < _ggcg ;_eagd ++{_dbcbc .Data [_bfead +_eagd ]=_bbbc .Data [_eebf +_eagd ]&^(_dbcbc .Data [_bfead +_eagd ]);};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;
|
|
};};if _gbdc {for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],_bbbc .Data [_abbg ]&^(_dbcbc .Data [_ggee ]),_eaa );_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;};};case PixNotPixSrcOrDst :for _bead =0;
|
|
_bead < _defd ;_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],^(_bbbc .Data [_fgcg ]|_dbcbc .Data [_cfga ]),_cbbe );_cfga +=_dbcbc .BytesPerLine ;_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;_bead ++{for _eagd =0;_eagd < _ggcg ;
|
|
_eagd ++{_dbcbc .Data [_bfead +_eagd ]=^(_bbbc .Data [_eebf +_eagd ]|_dbcbc .Data [_bfead +_eagd ]);};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;};};if _gbdc {for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],^(_bbbc .Data [_abbg ]|_dbcbc .Data [_ggee ]),_eaa );
|
|
_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;};};case PixNotPixSrcAndDst :for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],^(_bbbc .Data [_fgcg ]&_dbcbc .Data [_cfga ]),_cbbe );_cfga +=_dbcbc .BytesPerLine ;
|
|
_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;_bead ++{for _eagd =0;_eagd < _ggcg ;_eagd ++{_dbcbc .Data [_bfead +_eagd ]=^(_bbbc .Data [_eebf +_eagd ]&_dbcbc .Data [_bfead +_eagd ]);};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;
|
|
};};if _gbdc {for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],^(_bbbc .Data [_abbg ]&_dbcbc .Data [_ggee ]),_eaa );_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;};};case PixNotPixSrcXorDst :for _bead =0;
|
|
_bead < _defd ;_bead ++{_dbcbc .Data [_cfga ]=_fgaf (_dbcbc .Data [_cfga ],^(_bbbc .Data [_fgcg ]^_dbcbc .Data [_cfga ]),_cbbe );_cfga +=_dbcbc .BytesPerLine ;_fgcg +=_bbbc .BytesPerLine ;};if _fcda {for _bead =0;_bead < _defd ;_bead ++{for _eagd =0;_eagd < _ggcg ;
|
|
_eagd ++{_dbcbc .Data [_bfead +_eagd ]=^(_bbbc .Data [_eebf +_eagd ]^_dbcbc .Data [_bfead +_eagd ]);};_bfead +=_dbcbc .BytesPerLine ;_eebf +=_bbbc .BytesPerLine ;};};if _gbdc {for _bead =0;_bead < _defd ;_bead ++{_dbcbc .Data [_ggee ]=_fgaf (_dbcbc .Data [_ggee ],^(_bbbc .Data [_abbg ]^_dbcbc .Data [_ggee ]),_eaa );
|
|
_ggee +=_dbcbc .BytesPerLine ;_abbg +=_bbbc .BytesPerLine ;};};default:_b .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",_efgge );return _f .New ("\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
};return nil ;};func (_dcbe *NRGBA16 )Set (x ,y int ,c _c .Color ){_gaaeb :=y *_dcbe .BytesPerLine +x *3/2;if _gaaeb +1>=len (_dcbe .Data ){return ;};_egda :=NRGBA16Model .Convert (c ).(_c .NRGBA );_dcbe .setNRGBA (x ,y ,_gaaeb ,_egda );};func (_cgdc *ImageBase )setEightFullBytes (_bgea int ,_edab uint64 )error {if _bgea +7> len (_cgdc .Data )-1{return _f .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
};_cgdc .Data [_bgea ]=byte ((_edab &0xff00000000000000)>>56);_cgdc .Data [_bgea +1]=byte ((_edab &0xff000000000000)>>48);_cgdc .Data [_bgea +2]=byte ((_edab &0xff0000000000)>>40);_cgdc .Data [_bgea +3]=byte ((_edab &0xff00000000)>>32);_cgdc .Data [_bgea +4]=byte ((_edab &0xff000000)>>24);
|
|
_cgdc .Data [_bgea +5]=byte ((_edab &0xff0000)>>16);_cgdc .Data [_bgea +6]=byte ((_edab &0xff00)>>8);_cgdc .Data [_bgea +7]=byte (_edab &0xff);return nil ;};func (_ecg *Gray4 )Validate ()error {if len (_ecg .Data )!=_ecg .Height *_ecg .BytesPerLine {return ErrInvalidImage ;
|
|
};return nil ;};func _bdg (_gdc ,_dce *Monochrome ,_gbf []byte ,_dac int )(_acg error ){var (_gef ,_bgfb ,_cbdb ,_gaa ,_fbb ,_egba ,_aad ,_caa int ;_ggc ,_edc ,_fbgeb ,_bga uint32 ;_caf ,_cefb byte ;_acb uint16 ;);_bb :=make ([]byte ,4);_gbfb :=make ([]byte ,4);
|
|
for _cbdb =0;_cbdb < _gdc .Height -1;_cbdb ,_gaa =_cbdb +2,_gaa +1{_gef =_cbdb *_gdc .BytesPerLine ;_bgfb =_gaa *_dce .BytesPerLine ;for _fbb ,_egba =0,0;_fbb < _dac ;_fbb ,_egba =_fbb +4,_egba +1{for _aad =0;_aad < 4;_aad ++{_caa =_gef +_fbb +_aad ;if _caa <=len (_gdc .Data )-1&&_caa < _gef +_gdc .BytesPerLine {_bb [_aad ]=_gdc .Data [_caa ];
|
|
}else {_bb [_aad ]=0x00;};_caa =_gef +_gdc .BytesPerLine +_fbb +_aad ;if _caa <=len (_gdc .Data )-1&&_caa < _gef +(2*_gdc .BytesPerLine ){_gbfb [_aad ]=_gdc .Data [_caa ];}else {_gbfb [_aad ]=0x00;};};_ggc =_ce .BigEndian .Uint32 (_bb );_edc =_ce .BigEndian .Uint32 (_gbfb );
|
|
_fbgeb =_ggc &_edc ;_fbgeb |=_fbgeb <<1;_bga =_ggc |_edc ;_bga &=_bga <<1;_edc =_fbgeb |_bga ;_edc &=0xaaaaaaaa;_ggc =_edc |(_edc <<7);_caf =byte (_ggc >>24);_cefb =byte ((_ggc >>8)&0xff);_caa =_bgfb +_egba ;if _caa +1==len (_dce .Data )-1||_caa +1>=_bgfb +_dce .BytesPerLine {if _acg =_dce .setByte (_caa ,_gbf [_caf ]);
|
|
_acg !=nil {return _e .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_caa );};}else {_acb =(uint16 (_gbf [_caf ])<<8)|uint16 (_gbf [_cefb ]);if _acg =_dce .setTwoBytes (_caa ,_acb );_acg !=nil {return _e .Errorf ("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",_caa );
|
|
};_egba ++;};};};return nil ;};func (_beab *Monochrome )clearBit (_fdaa ,_gead int ){_beab .Data [_fdaa ]&=^(0x80>>uint (_gead &7))};func _eee (_dffe *Monochrome ,_afcd ,_eedc int ,_gfbdc ,_eaba int ,_bffb RasterOperator ){var (_aeec bool ;_fbfc bool ;
|
|
_fbec int ;_bbda int ;_agdf int ;_dccc int ;_egea bool ;_cab byte ;);_bgafc :=8-(_afcd &7);_cdgc :=_fcdd [_bgafc ];_fecca :=_dffe .BytesPerLine *_eedc +(_afcd >>3);if _gfbdc < _bgafc {_aeec =true ;_cdgc &=_dffc [8-_bgafc +_gfbdc ];};if !_aeec {_fbec =(_gfbdc -_bgafc )>>3;
|
|
if _fbec !=0{_fbfc =true ;_bbda =_fecca +1;};};_agdf =(_afcd +_gfbdc )&7;if !(_aeec ||_agdf ==0){_egea =true ;_cab =_dffc [_agdf ];_dccc =_fecca +1+_fbec ;};var _cgbg ,_egef int ;switch _bffb {case PixClr :for _cgbg =0;_cgbg < _eaba ;_cgbg ++{_dffe .Data [_fecca ]=_fgaf (_dffe .Data [_fecca ],0x0,_cdgc );
|
|
_fecca +=_dffe .BytesPerLine ;};if _fbfc {for _cgbg =0;_cgbg < _eaba ;_cgbg ++{for _egef =0;_egef < _fbec ;_egef ++{_dffe .Data [_bbda +_egef ]=0x0;};_bbda +=_dffe .BytesPerLine ;};};if _egea {for _cgbg =0;_cgbg < _eaba ;_cgbg ++{_dffe .Data [_dccc ]=_fgaf (_dffe .Data [_dccc ],0x0,_cab );
|
|
_dccc +=_dffe .BytesPerLine ;};};case PixSet :for _cgbg =0;_cgbg < _eaba ;_cgbg ++{_dffe .Data [_fecca ]=_fgaf (_dffe .Data [_fecca ],0xff,_cdgc );_fecca +=_dffe .BytesPerLine ;};if _fbfc {for _cgbg =0;_cgbg < _eaba ;_cgbg ++{for _egef =0;_egef < _fbec ;
|
|
_egef ++{_dffe .Data [_bbda +_egef ]=0xff;};_bbda +=_dffe .BytesPerLine ;};};if _egea {for _cgbg =0;_cgbg < _eaba ;_cgbg ++{_dffe .Data [_dccc ]=_fgaf (_dffe .Data [_dccc ],0xff,_cab );_dccc +=_dffe .BytesPerLine ;};};case PixNotDst :for _cgbg =0;_cgbg < _eaba ;
|
|
_cgbg ++{_dffe .Data [_fecca ]=_fgaf (_dffe .Data [_fecca ],^_dffe .Data [_fecca ],_cdgc );_fecca +=_dffe .BytesPerLine ;};if _fbfc {for _cgbg =0;_cgbg < _eaba ;_cgbg ++{for _egef =0;_egef < _fbec ;_egef ++{_dffe .Data [_bbda +_egef ]=^(_dffe .Data [_bbda +_egef ]);
|
|
};_bbda +=_dffe .BytesPerLine ;};};if _egea {for _cgbg =0;_cgbg < _eaba ;_cgbg ++{_dffe .Data [_dccc ]=_fgaf (_dffe .Data [_dccc ],^_dffe .Data [_dccc ],_cab );_dccc +=_dffe .BytesPerLine ;};};};};func LinearInterpolate (x ,xmin ,xmax ,ymin ,ymax float64 )float64 {if _g .Abs (xmax -xmin )< 0.000001{return ymin ;
|
|
};_agbb :=ymin +(x -xmin )*(ymax -ymin )/(xmax -xmin );return _agbb ;};var _ NRGBA =&NRGBA32 {};func _afc (_efed _c .NRGBA )_c .Gray {_ece ,_bec ,_dgd ,_ :=_efed .RGBA ();_agd :=(19595*_ece +38470*_bec +7471*_dgd +1<<15)>>24;return _c .Gray {Y :uint8 (_agd )};
|
|
};func (_cdae *RGBA32 )Base ()*ImageBase {return &_cdae .ImageBase };func _faed (_dbc int )[]uint {var _bdd []uint ;_cgd :=_dbc ;_bab :=_cgd /8;if _bab !=0{for _egc :=0;_egc < _bab ;_egc ++{_bdd =append (_bdd ,8);};_ddd :=_cgd %8;_cgd =0;if _ddd !=0{_cgd =_ddd ;
|
|
};};_bgf :=_cgd /4;if _bgf !=0{for _cgc :=0;_cgc < _bgf ;_cgc ++{_bdd =append (_bdd ,4);};_ga :=_cgd %4;_cgd =0;if _ga !=0{_cgd =_ga ;};};_dee :=_cgd /2;if _dee !=0{for _ceg :=0;_ceg < _dee ;_ceg ++{_bdd =append (_bdd ,2);};};return _bdd ;};func _abdg (_fecf _fc .Image )(Image ,error ){if _ddc ,_gdbe :=_fecf .(*Monochrome );
|
|
_gdbe {return _ddc ,nil ;};_dga :=_fecf .Bounds ();var _edb Gray ;switch _cffe :=_fecf .(type ){case Gray :_edb =_cffe ;case NRGBA :_edb =&Gray8 {ImageBase :NewImageBase (_dga .Max .X ,_dga .Max .Y ,8,1,nil ,nil ,nil )};_afe (_edb ,_cffe ,_dga );case nrgba64 :_edb =&Gray8 {ImageBase :NewImageBase (_dga .Max .X ,_dga .Max .Y ,8,1,nil ,nil ,nil )};
|
|
_bffa (_edb ,_cffe ,_dga );default:_efg ,_fafa :=GrayConverter .Convert (_fecf );if _fafa !=nil {return nil ,_fafa ;};_edb =_efg .(Gray );};_ebfc ,_bdbd :=NewImage (_dga .Max .X ,_dga .Max .Y ,1,1,nil ,nil ,nil );if _bdbd !=nil {return nil ,_bdbd ;};_gfg :=_ebfc .(*Monochrome );
|
|
_bbae :=AutoThresholdTriangle (GrayHistogram (_edb ));for _cbeg :=0;_cbeg < _dga .Max .X ;_cbeg ++{for _gcda :=0;_gcda < _dga .Max .Y ;_gcda ++{_fcf :=_ccbac (_edb .GrayAt (_cbeg ,_gcda ),monochromeModel (_bbae ));_gfg .SetGray (_cbeg ,_gcda ,_fcf );};
|
|
};return _ebfc ,nil ;};func (_ggad *NRGBA32 )SetNRGBA (x ,y int ,c _c .NRGBA ){_adac :=y *_ggad .Width +x ;_dfdb :=3*_adac ;if _dfdb +2>=len (_ggad .Data ){return ;};_ggad .setRGBA (_adac ,c );};func _fcab (_dcaf *_fc .NYCbCrA ,_aegbb NRGBA ,_egefd _fc .Rectangle ){for _bcab :=0;
|
|
_bcab < _egefd .Max .X ;_bcab ++{for _gaf :=0;_gaf < _egefd .Max .Y ;_gaf ++{_cffa :=_dcaf .NYCbCrAAt (_bcab ,_gaf );_aegbb .SetNRGBA (_bcab ,_gaf ,_bgfbf (_cffa ));};};};func _ddgd (_abfgd *Monochrome ,_bgcd ,_bdfb int ,_dgfb ,_gcdag int ,_ebbc RasterOperator ,_ggec *Monochrome ,_aeba ,_gccc int )error {var _dbadc ,_dbg ,_fedb ,_bfge int ;
|
|
if _bgcd < 0{_aeba -=_bgcd ;_dgfb +=_bgcd ;_bgcd =0;};if _aeba < 0{_bgcd -=_aeba ;_dgfb +=_aeba ;_aeba =0;};_dbadc =_bgcd +_dgfb -_abfgd .Width ;if _dbadc > 0{_dgfb -=_dbadc ;};_dbg =_aeba +_dgfb -_ggec .Width ;if _dbg > 0{_dgfb -=_dbg ;};if _bdfb < 0{_gccc -=_bdfb ;
|
|
_gcdag +=_bdfb ;_bdfb =0;};if _gccc < 0{_bdfb -=_gccc ;_gcdag +=_gccc ;_gccc =0;};_fedb =_bdfb +_gcdag -_abfgd .Height ;if _fedb > 0{_gcdag -=_fedb ;};_bfge =_gccc +_gcdag -_ggec .Height ;if _bfge > 0{_gcdag -=_bfge ;};if _dgfb <=0||_gcdag <=0{return nil ;
|
|
};var _efab error ;switch {case _bgcd &7==0&&_aeba &7==0:_efab =_gfcf (_abfgd ,_bgcd ,_bdfb ,_dgfb ,_gcdag ,_ebbc ,_ggec ,_aeba ,_gccc );case _bgcd &7==_aeba &7:_efab =_abdb (_abfgd ,_bgcd ,_bdfb ,_dgfb ,_gcdag ,_ebbc ,_ggec ,_aeba ,_gccc );default:_efab =_beadd (_abfgd ,_bgcd ,_bdfb ,_dgfb ,_gcdag ,_ebbc ,_ggec ,_aeba ,_gccc );
|
|
};if _efab !=nil {return _efab ;};return nil ;};func (_cbc *Monochrome )Bounds ()_fc .Rectangle {return _fc .Rectangle {Max :_fc .Point {X :_cbc .Width ,Y :_cbc .Height }};};type RGBA32 struct{ImageBase };func (_dfa *CMYK32 )Set (x ,y int ,c _c .Color ){_eac :=4*(y *_dfa .Width +x );
|
|
if _eac +3>=len (_dfa .Data ){return ;};_aeed :=_c .CMYKModel .Convert (c ).(_c .CMYK );_dfa .Data [_eac ]=_aeed .C ;_dfa .Data [_eac +1]=_aeed .M ;_dfa .Data [_eac +2]=_aeed .Y ;_dfa .Data [_eac +3]=_aeed .K ;};func (_affgd *Gray16 )ColorModel ()_c .Model {return _c .Gray16Model };
|
|
type NRGBA16 struct{ImageBase };type shift int ;func ColorAtGray16BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_c .Gray16 ,error ){_dgeg :=(y *bytesPerLine /2+x )*2;if _dgeg +1>=len (data ){return _c .Gray16 {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
};_gbfdb :=uint16 (data [_dgeg ])<<8|uint16 (data [_dgeg +1]);if len (decode )==2{_gbfdb =uint16 (uint64 (LinearInterpolate (float64 (_gbfdb ),0,65535,decode [0],decode [1])));};return _c .Gray16 {Y :_gbfdb },nil ;};func _ffgeb (_gaae _fc .Image )(Image ,error ){if _gcf ,_ebda :=_gaae .(*Gray2 );
|
|
_ebda {return _gcf .Copy (),nil ;};_cdeg :=_gaae .Bounds ();_fde ,_eef :=NewImage (_cdeg .Max .X ,_cdeg .Max .Y ,2,1,nil ,nil ,nil );if _eef !=nil {return nil ,_eef ;};_dgdf (_gaae ,_fde ,_cdeg );return _fde ,nil ;};func _dff (_ff *Monochrome ,_fg int )(*Monochrome ,error ){if _ff ==nil {return nil ,_f .New ("\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _fg ==1{return _ff .copy (),nil ;};if !IsPowerOf2 (uint (_fg )){return nil ,_e .Errorf ("\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006ci\u0064 \u0065x\u0070a\u006e\u0064\u0020\u0066\u0061\u0063\u0074\u006f\u0072\u003a\u0020\u0025\u0064",_fg );
|
|
};_gc :=_faed (_fg );return _fgb (_ff ,_fg ,_gc );};func _dadg (_aadff Gray ,_adgd NRGBA ,_ebba _fc .Rectangle ){for _ecdfe :=0;_ecdfe < _ebba .Max .X ;_ecdfe ++{for _cbbf :=0;_cbbf < _ebba .Max .Y ;_cbbf ++{_afgb :=_aadff .GrayAt (_ecdfe ,_cbbf );_adgd .SetNRGBA (_ecdfe ,_cbbf ,_ebb (_afgb ));
|
|
};};};func _cfab (_dfcg int ,_bdc int )int {if _dfcg < _bdc {return _dfcg ;};return _bdc ;};func (_dgga *Monochrome )ColorModel ()_c .Model {return MonochromeModel (_dgga .ModelThreshold )};func (_cade *ImageBase )setTwoBytes (_beeb int ,_cdce uint16 )error {if _beeb +1> len (_cade .Data )-1{return _f .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
};_cade .Data [_beeb ]=byte ((_cdce &0xff00)>>8);_cade .Data [_beeb +1]=byte (_cdce &0xff);return nil ;};func (_begd *NRGBA32 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtNRGBA32 (x ,y ,_begd .Width ,_begd .Data ,_begd .Alpha ,_begd .Decode );
|
|
};func _cbec (_fegfg _c .NRGBA )_c .NRGBA {_fegfg .R =_fegfg .R >>4|(_fegfg .R >>4)<<4;_fegfg .G =_fegfg .G >>4|(_fegfg .G >>4)<<4;_fegfg .B =_fegfg .B >>4|(_fegfg .B >>4)<<4;return _fegfg ;};func (_ggaa *NRGBA16 )Base ()*ImageBase {return &_ggaa .ImageBase };
|
|
func (_ecd *Monochrome )GrayAt (x ,y int )_c .Gray {_cfce ,_ :=ColorAtGray1BPC (x ,y ,_ecd .BytesPerLine ,_ecd .Data ,_ecd .Decode );return _cfce ;};func NewImageBase (width int ,height int ,bitsPerComponent int ,colorComponents int ,data []byte ,alpha []byte ,decode []float64 )ImageBase {_bdec :=ImageBase {Width :width ,Height :height ,BitsPerComponent :bitsPerComponent ,ColorComponents :colorComponents ,Data :data ,Alpha :alpha ,Decode :decode ,BytesPerLine :BytesPerLine (width ,bitsPerComponent ,colorComponents )};
|
|
if data ==nil {_bdec .Data =make ([]byte ,height *_bdec .BytesPerLine );};return _bdec ;};func (_fffbc *ImageBase )GetAlpha ()[]byte {return _fffbc .Alpha };func _eadg (_ceac _fc .Image )(Image ,error ){if _bgee ,_efee :=_ceac .(*NRGBA64 );_efee {return _bgee .Copy (),nil ;
|
|
};_bgff ,_adga ,_beccg :=_bgaa (_ceac ,2);_fdfe ,_ccgd :=NewImage (_bgff .Max .X ,_bgff .Max .Y ,16,3,nil ,_beccg ,nil );if _ccgd !=nil {return nil ,_ccgd ;};_dccge (_ceac ,_fdfe ,_bgff );if len (_beccg )!=0&&!_adga {if _gdgd :=_ccgce (_beccg ,_fdfe );
|
|
_gdgd !=nil {return nil ,_gdgd ;};};return _fdfe ,nil ;};type CMYK interface{CMYKAt (_cdf ,_egbc int )_c .CMYK ;SetCMYK (_bbb ,_abb int ,_gge _c .CMYK );};func _fgaf (_fdfb ,_facab ,_fddc byte )byte {return (_fdfb &^(_fddc ))|(_facab &_fddc )};type nrgba64 interface{NRGBA64At (_eagf ,_bbbce int )_c .NRGBA64 ;
|
|
SetNRGBA64 (_gcgg ,_gdaa int ,_deeb _c .NRGBA64 );};var _ _fc .Image =&Gray4 {};func ColorAtNRGBA32 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_c .NRGBA ,error ){_deaa :=y *width +x ;_eagb :=3*_deaa ;if _eagb +2>=len (data ){return _c .NRGBA {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
};_cbbb :=uint8 (0xff);if alpha !=nil &&len (alpha )> _deaa {_cbbb =alpha [_deaa ];};_abedd ,_ccad ,_eabb :=data [_eagb ],data [_eagb +1],data [_eagb +2];if len (decode )==6{_abedd =uint8 (uint32 (LinearInterpolate (float64 (_abedd ),0,255,decode [0],decode [1]))&0xff);
|
|
_ccad =uint8 (uint32 (LinearInterpolate (float64 (_ccad ),0,255,decode [2],decode [3]))&0xff);_eabb =uint8 (uint32 (LinearInterpolate (float64 (_eabb ),0,255,decode [4],decode [5]))&0xff);};return _c .NRGBA {R :_abedd ,G :_ccad ,B :_eabb ,A :_cbbb },nil ;
|
|
};func (_fecff *Monochrome )getBitAt (_afae ,_fcbbf int )bool {_cae :=_fcbbf *_fecff .BytesPerLine +(_afae >>3);_fca :=_afae &0x07;_fdg :=uint (7-_fca );if _cae > len (_fecff .Data )-1{return false ;};if (_fecff .Data [_cae ]>>_fdg )&0x01>=1{return true ;
|
|
};return false ;};func _efbb (_gfe _c .CMYK )_c .Gray {_dad ,_cga ,_ccaf :=_c .CMYKToRGB (_gfe .C ,_gfe .M ,_gfe .Y ,_gfe .K );_aebg :=(19595*uint32 (_dad )+38470*uint32 (_cga )+7471*uint32 (_ccaf )+1<<7)>>16;return _c .Gray {Y :uint8 (_aebg )};};func (_egcc *Monochrome )Histogram ()(_dagb [256]int ){for _ ,_eacf :=range _egcc .Data {_dagb [0xff]+=int (_aeaba [_egcc .Data [_eacf ]]);
|
|
};return _dagb ;};func _gbda (_gbe _c .RGBA )_c .CMYK {_cefe ,_bcg ,_gce ,_bedb :=_c .RGBToCMYK (_gbe .R ,_gbe .G ,_gbe .B );return _c .CMYK {C :_cefe ,M :_bcg ,Y :_gce ,K :_bedb };};func (_ebf colorConverter )Convert (src _fc .Image )(Image ,error ){return _ebf ._ebeg (src )};
|
|
func ImgToGray (i _fc .Image )*_fc .Gray {if _bggg ,_gdde :=i .(*_fc .Gray );_gdde {return _bggg ;};_cabf :=i .Bounds ();_ebee :=_fc .NewGray (_cabf );for _ageee :=0;_ageee < _cabf .Max .X ;_ageee ++{for _bfbd :=0;_bfbd < _cabf .Max .Y ;_bfbd ++{_dbca :=i .At (_ageee ,_bfbd );
|
|
_ebee .Set (_ageee ,_bfbd ,_dbca );};};return _ebee ;};func (_cac *Gray4 )setGray (_cbfc int ,_baae int ,_gdba _c .Gray ){_bedd :=_baae *_cac .BytesPerLine ;_fcegg :=_bedd +(_cbfc >>1);if _fcegg >=len (_cac .Data ){return ;};_cffb :=_gdba .Y >>4;_cac .Data [_fcegg ]=(_cac .Data [_fcegg ]&(^(0xf0>>uint (4*(_cbfc &1)))))|(_cffb <<uint (4-4*(_cbfc &1)));
|
|
};func _eedbf (_ebfa _fc .Image )(Image ,error ){if _dgcb ,_egff :=_ebfa .(*Gray16 );_egff {return _dgcb .Copy (),nil ;};_cdc :=_ebfa .Bounds ();_ecfg ,_dbdc :=NewImage (_cdc .Max .X ,_cdc .Max .Y ,16,1,nil ,nil ,nil );if _dbdc !=nil {return nil ,_dbdc ;
|
|
};_dgdf (_ebfa ,_ecfg ,_cdc );return _ecfg ,nil ;};func _cbee ()(_dcc [256]uint32 ){for _faa :=0;_faa < 256;_faa ++{if _faa &0x01!=0{_dcc [_faa ]|=0xf;};if _faa &0x02!=0{_dcc [_faa ]|=0xf0;};if _faa &0x04!=0{_dcc [_faa ]|=0xf00;};if _faa &0x08!=0{_dcc [_faa ]|=0xf000;
|
|
};if _faa &0x10!=0{_dcc [_faa ]|=0xf0000;};if _faa &0x20!=0{_dcc [_faa ]|=0xf00000;};if _faa &0x40!=0{_dcc [_faa ]|=0xf000000;};if _faa &0x80!=0{_dcc [_faa ]|=0xf0000000;};};return _dcc ;};func MonochromeModel (threshold uint8 )_c .Model {return monochromeModel (threshold )};
|
|
func _ggg (_bfd _c .NRGBA )_c .RGBA {_fdb ,_eebe ,_feea ,_faf :=_bfd .RGBA ();return _c .RGBA {R :uint8 (_fdb >>8),G :uint8 (_eebe >>8),B :uint8 (_feea >>8),A :uint8 (_faf >>8)};};type Gray interface{GrayAt (_feef ,_fff int )_c .Gray ;SetGray (_fcg ,_fcbb int ,_ffge _c .Gray );
|
|
};func (_ddaf *Monochrome )ResolveDecode ()error {if len (_ddaf .Decode )!=2{return nil ;};if _ddaf .Decode [0]==1&&_ddaf .Decode [1]==0{if _ecb :=_ddaf .InverseData ();_ecb !=nil {return _ecb ;};_ddaf .Decode =nil ;};return nil ;};func (_baa *Monochrome )IsUnpadded ()bool {return (_baa .Width *_baa .Height )==len (_baa .Data )};
|
|
func _dfc (_bbg _c .Gray )_c .RGBA {return _c .RGBA {R :_bbg .Y ,G :_bbg .Y ,B :_bbg .Y ,A :0xff}};func _effe (_gedg _fc .Image )(Image ,error ){if _edcd ,_facabe :=_gedg .(*NRGBA32 );_facabe {return _edcd .Copy (),nil ;};_efff ,_bfad ,_bega :=_bgaa (_gedg ,1);
|
|
_gfbde ,_eabd :=NewImage (_efff .Max .X ,_efff .Max .Y ,8,3,nil ,_bega ,nil );if _eabd !=nil {return nil ,_eabd ;};_cefa (_gedg ,_gfbde ,_efff );if len (_bega )!=0&&!_bfad {if _dgcdg :=_ccgce (_bega ,_gfbde );_dgcdg !=nil {return nil ,_dgcdg ;};};return _gfbde ,nil ;
|
|
};func ConverterFunc (converterFunc func (_aeb _fc .Image )(Image ,error ))ColorConverter {return colorConverter {_ebeg :converterFunc };};func (_adba *NRGBA64 )Validate ()error {if len (_adba .Data )!=3*2*_adba .Width *_adba .Height {return _f .New ("i\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0069\u006da\u0067\u0065\u0020\u0064\u0061\u0074\u0061 s\u0069\u007a\u0065\u0020f\u006f\u0072\u0020\u0070\u0072\u006f\u0076\u0069\u0064ed\u0020\u0064i\u006d\u0065\u006e\u0073\u0069\u006f\u006e\u0073");
|
|
};return nil ;};func (_bbd *CMYK32 )Bounds ()_fc .Rectangle {return _fc .Rectangle {Max :_fc .Point {X :_bbd .Width ,Y :_bbd .Height }};};func (_cbabe *ImageBase )setEightBytes (_ddbb int ,_bbc uint64 )error {_faaa :=_cbabe .BytesPerLine -(_ddbb %_cbabe .BytesPerLine );
|
|
if _cbabe .BytesPerLine !=_cbabe .Width >>3{_faaa --;};if _faaa >=8{return _cbabe .setEightFullBytes (_ddbb ,_bbc );};return _cbabe .setEightPartlyBytes (_ddbb ,_faaa ,_bbc );};func (_bbed *NRGBA16 )At (x ,y int )_c .Color {_eedac ,_ :=_bbed .ColorAt (x ,y );
|
|
return _eedac };func _bcdc (_dcge _c .Gray )_c .Gray {_abc :=_dcge .Y >>6;_abc |=_abc <<2;_dcge .Y =_abc |_abc <<4;return _dcge ;};func _gbbd (_gab ,_eab CMYK ,_cggc _fc .Rectangle ){for _beg :=0;_beg < _cggc .Max .X ;_beg ++{for _geag :=0;_geag < _cggc .Max .Y ;
|
|
_geag ++{_eab .SetCMYK (_beg ,_geag ,_gab .CMYKAt (_beg ,_geag ));};};};type Gray16 struct{ImageBase };func _bdba (_gbfd Gray ,_aeg CMYK ,_gad _fc .Rectangle ){for _ddad :=0;_ddad < _gad .Max .X ;_ddad ++{for _cfe :=0;_cfe < _gad .Max .Y ;_cfe ++{_acc :=_gbfd .GrayAt (_ddad ,_cfe );
|
|
_aeg .SetCMYK (_ddad ,_cfe ,_ccbg (_acc ));};};};func _ccbac (_ged _c .Gray ,_dacb monochromeModel )_c .Gray {if _ged .Y > uint8 (_dacb ){return _c .Gray {Y :_g .MaxUint8 };};return _c .Gray {};};type CMYK32 struct{ImageBase };var _ Image =&Gray8 {};func (_cfd *Gray8 )Copy ()Image {return &Gray8 {ImageBase :_cfd .copy ()}};
|
|
func _cecbg (_add _fc .Image )(Image ,error ){if _fadgg ,_ccge :=_add .(*NRGBA16 );_ccge {return _fadgg .Copy (),nil ;};_fggb :=_add .Bounds ();_fgac ,_cbfce :=NewImage (_fggb .Max .X ,_fggb .Max .Y ,4,3,nil ,nil ,nil );if _cbfce !=nil {return nil ,_cbfce ;
|
|
};_cefa (_add ,_fgac ,_fggb );return _fgac ,nil ;};func _fcdb (_efa _c .NRGBA64 )_c .Gray {var _deg _c .NRGBA64 ;if _efa ==_deg {return _c .Gray {Y :0xff};};_dbdb ,_bge ,_ccg ,_ :=_efa .RGBA ();_cecb :=(19595*_dbdb +38470*_bge +7471*_ccg +1<<15)>>24;return _c .Gray {Y :uint8 (_cecb )};
|
|
};func _ecba (_bagbf _c .Color )_c .Color {_fcdf :=_c .NRGBAModel .Convert (_bagbf ).(_c .NRGBA );return _cbec (_fcdf );};func (_fceg *Gray4 )Set (x ,y int ,c _c .Color ){if x >=_fceg .Width ||y >=_fceg .Height {return ;};_gcaab :=Gray4Model .Convert (c ).(_c .Gray );
|
|
_fceg .setGray (x ,y ,_gcaab );};var _aeaba [256]uint8 ;func _bfga (_bggf RGBA ,_bfcf Gray ,_dcea _fc .Rectangle ){for _dfb :=0;_dfb < _dcea .Max .X ;_dfb ++{for _adb :=0;_adb < _dcea .Max .Y ;_adb ++{_gbef :=_abd (_bggf .RGBAAt (_dfb ,_adb ));_bfcf .SetGray (_dfb ,_adb ,_gbef );
|
|
};};};type Gray8 struct{ImageBase };func (_ddce *ImageBase )setFourBytes (_faca int ,_abfg uint32 )error {if _faca +3> len (_ddce .Data )-1{return _e .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_faca );
|
|
};_ddce .Data [_faca ]=byte ((_abfg &0xff000000)>>24);_ddce .Data [_faca +1]=byte ((_abfg &0xff0000)>>16);_ddce .Data [_faca +2]=byte ((_abfg &0xff00)>>8);_ddce .Data [_faca +3]=byte (_abfg &0xff);return nil ;};func (_bddb *Gray8 )Set (x ,y int ,c _c .Color ){_bde :=y *_bddb .BytesPerLine +x ;
|
|
if _bde > len (_bddb .Data )-1{return ;};_ffgd :=_c .GrayModel .Convert (c );_bddb .Data [_bde ]=_ffgd .(_c .Gray ).Y ;};var _ _fc .Image =&NRGBA32 {};func _fcee (_dfab *Monochrome ,_bgef ,_cafb ,_ebca ,_eecff int ,_dea RasterOperator ){if _bgef < 0{_ebca +=_bgef ;
|
|
_bgef =0;};_agbfg :=_bgef +_ebca -_dfab .Width ;if _agbfg > 0{_ebca -=_agbfg ;};if _cafb < 0{_eecff +=_cafb ;_cafb =0;};_ccbe :=_cafb +_eecff -_dfab .Height ;if _ccbe > 0{_eecff -=_ccbe ;};if _ebca <=0||_eecff <=0{return ;};if (_bgef &7)==0{_ccbae (_dfab ,_bgef ,_cafb ,_ebca ,_eecff ,_dea );
|
|
}else {_eee (_dfab ,_bgef ,_cafb ,_ebca ,_eecff ,_dea );};};var _ _fc .Image =&RGBA32 {};func (_ebae *Gray2 )Base ()*ImageBase {return &_ebae .ImageBase };func _cfea (_ffcc uint )uint {var _dddd uint ;for _ffcc !=0{_ffcc >>=1;_dddd ++;};return _dddd -1;
|
|
};func (_eae *Gray8 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtGray8BPC (x ,y ,_eae .BytesPerLine ,_eae .Data ,_eae .Decode );};func (_cda *Gray2 )Copy ()Image {return &Gray2 {ImageBase :_cda .copy ()}};func ColorAtGray2BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_c .Gray ,error ){_gaafg :=y *bytesPerLine +x >>2;
|
|
if _gaafg >=len (data ){return _c .Gray {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
};_dbeb :=data [_gaafg ]>>uint (6-(x &3)*2)&3;if len (decode )==2{_dbeb =uint8 (uint32 (LinearInterpolate (float64 (_dbeb ),0,3.0,decode [0],decode [1]))&3);};return _c .Gray {Y :_dbeb *85},nil ;};func (_eddc *ImageBase )setByte (_bcac int ,_cdda byte )error {if _bcac > len (_eddc .Data )-1{return _f .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
};_eddc .Data [_bcac ]=_cdda ;return nil ;};func (_efc *Monochrome )Copy ()Image {return &Monochrome {ImageBase :_efc .ImageBase .copy (),ModelThreshold :_efc .ModelThreshold };};func (_ffgf *NRGBA16 )setNRGBA (_daef ,_eaee ,_fdcba int ,_ccdfd _c .NRGBA ){if _daef *3%2==0{_ffgf .Data [_fdcba ]=(_ccdfd .R >>4)<<4|(_ccdfd .G >>4);
|
|
_ffgf .Data [_fdcba +1]=(_ccdfd .B >>4)<<4|(_ffgf .Data [_fdcba +1]&0xf);}else {_ffgf .Data [_fdcba ]=(_ffgf .Data [_fdcba ]&0xf0)|(_ccdfd .R >>4);_ffgf .Data [_fdcba +1]=(_ccdfd .G >>4)<<4|(_ccdfd .B >>4);};if _ffgf .Alpha !=nil {_fdgf :=_eaee *BytesPerLine (_ffgf .Width ,4,1);
|
|
if _fdgf < len (_ffgf .Alpha ){if _daef %2==0{_ffgf .Alpha [_fdgf ]=(_ccdfd .A >>uint (4))<<uint (4)|(_ffgf .Alpha [_fdcba ]&0xf);}else {_ffgf .Alpha [_fdgf ]=(_ffgf .Alpha [_fdgf ]&0xf0)|(_ccdfd .A >>uint (4));};};};};type monochromeModel uint8 ;var _ Image =&Gray16 {};
|
|
func (_becg *Gray4 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtGray4BPC (x ,y ,_becg .BytesPerLine ,_becg .Data ,_becg .Decode );};func (_acggb *NRGBA32 )At (x ,y int )_c .Color {_accgf ,_ :=_acggb .ColorAt (x ,y );return _accgf };type colorConverter struct{_ebeg func (_bcd _fc .Image )(Image ,error );
|
|
};type NRGBA32 struct{ImageBase };func (_fdeg *NRGBA64 )SetNRGBA64 (x ,y int ,c _c .NRGBA64 ){_feba :=(y *_fdeg .Width +x )*2;_gedf :=_feba *3;if _gedf +5>=len (_fdeg .Data ){return ;};_fdeg .setNRGBA64 (_gedf ,c ,_feba );};func (_gcaae *monochromeThresholdConverter )Convert (img _fc .Image )(Image ,error ){if _eeg ,_fed :=img .(*Monochrome );
|
|
_fed {return _eeg .Copy (),nil ;};_cdb :=img .Bounds ();_eace ,_ddada :=NewImage (_cdb .Max .X ,_cdb .Max .Y ,1,1,nil ,nil ,nil );if _ddada !=nil {return nil ,_ddada ;};_eace .(*Monochrome ).ModelThreshold =_gcaae .Threshold ;for _aegb :=0;_aegb < _cdb .Max .X ;
|
|
_aegb ++{for _afcf :=0;_afcf < _cdb .Max .Y ;_afcf ++{_bgg :=img .At (_aegb ,_afcf );_eace .Set (_aegb ,_afcf ,_bgg );};};return _eace ,nil ;};func (_debf *Gray2 )ColorModel ()_c .Model {return Gray2Model };func (_dgbd *Monochrome )At (x ,y int )_c .Color {_bgae ,_ :=_dgbd .ColorAt (x ,y );
|
|
return _bgae };func _cfaed (_egce *_fc .Gray ,_becab uint8 )*_fc .Gray {_gbgc :=_egce .Bounds ();_eabc :=_fc .NewGray (_gbgc );for _bcdgg :=0;_bcdgg < _gbgc .Dx ();_bcdgg ++{for _gedd :=0;_gedd < _gbgc .Dy ();_gedd ++{_ebeed :=_egce .GrayAt (_bcdgg ,_gedd );
|
|
_eabc .SetGray (_bcdgg ,_gedd ,_c .Gray {Y :_bgcc (_ebeed .Y ,_becab )});};};return _eabc ;};func ColorAtRGBA32 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_c .RGBA ,error ){_fcbd :=y *width +x ;_fbae :=3*_fcbd ;if _fbae +2>=len (data ){return _c .RGBA {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
};_eegb :=uint8 (0xff);if alpha !=nil &&len (alpha )> _fcbd {_eegb =alpha [_fcbd ];};_aecg ,_dfefg ,_febg :=data [_fbae ],data [_fbae +1],data [_fbae +2];if len (decode )==6{_aecg =uint8 (uint32 (LinearInterpolate (float64 (_aecg ),0,255,decode [0],decode [1]))&0xff);
|
|
_dfefg =uint8 (uint32 (LinearInterpolate (float64 (_dfefg ),0,255,decode [2],decode [3]))&0xff);_febg =uint8 (uint32 (LinearInterpolate (float64 (_febg ),0,255,decode [4],decode [5]))&0xff);};return _c .RGBA {R :_aecg ,G :_dfefg ,B :_febg ,A :_eegb },nil ;
|
|
};func (_ccfb *Monochrome )ReduceBinary (factor float64 )(*Monochrome ,error ){_dfag :=_cfea (uint (factor ));if !IsPowerOf2 (uint (factor )){_dfag ++;};_fbdg :=make ([]int ,_dfag );for _ffd :=range _fbdg {_fbdg [_ffd ]=4;};_cgge ,_ecc :=_gcc (_ccfb ,_fbdg ...);
|
|
if _ecc !=nil {return nil ,_ecc ;};return _cgge ,nil ;};func _bgfbf (_fbe _c .NYCbCrA )_c .NRGBA {_aded :=int32 (_fbe .Y )*0x10101;_dfd :=int32 (_fbe .Cb )-128;_acgb :=int32 (_fbe .Cr )-128;_dbfc :=_aded +91881*_acgb ;if uint32 (_dbfc )&0xff000000==0{_dbfc >>=8;
|
|
}else {_dbfc =^(_dbfc >>31)&0xffff;};_gaag :=_aded -22554*_dfd -46802*_acgb ;if uint32 (_gaag )&0xff000000==0{_gaag >>=8;}else {_gaag =^(_gaag >>31)&0xffff;};_adgg :=_aded +116130*_dfd ;if uint32 (_adgg )&0xff000000==0{_adgg >>=8;}else {_adgg =^(_adgg >>31)&0xffff;
|
|
};return _c .NRGBA {R :uint8 (_dbfc >>8),G :uint8 (_gaag >>8),B :uint8 (_adgg >>8),A :_fbe .A };};func (_efge *Gray4 )Histogram ()(_geda [256]int ){for _gccb :=0;_gccb < _efge .Width ;_gccb ++{for _feec :=0;_feec < _efge .Height ;_feec ++{_geda [_efge .GrayAt (_gccb ,_feec ).Y ]++;
|
|
};};return _geda ;};func _cebd (_caeb NRGBA ,_daaf Gray ,_dbcb _fc .Rectangle ){for _fgcf :=0;_fgcf < _dbcb .Max .X ;_fgcf ++{for _bcag :=0;_bcag < _dbcb .Max .Y ;_bcag ++{_egaf :=_afc (_caeb .NRGBAAt (_fgcf ,_bcag ));_daaf .SetGray (_fgcf ,_bcag ,_egaf );
|
|
};};};var _ Image =&RGBA32 {};func (_eede *NRGBA32 )Base ()*ImageBase {return &_eede .ImageBase };func (_gff *Gray2 )Set (x ,y int ,c _c .Color ){if x >=_gff .Width ||y >=_gff .Height {return ;};_aefc :=Gray2Model .Convert (c ).(_c .Gray );_dfebd :=y *_gff .BytesPerLine ;
|
|
_cdbf :=_dfebd +(x >>2);_fega :=_aefc .Y >>6;_gff .Data [_cdbf ]=(_gff .Data [_cdbf ]&(^(0xc0>>uint (2*((x )&3)))))|(_fega <<uint (6-2*(x &3)));};func (_fcba *NRGBA64 )Set (x ,y int ,c _c .Color ){_dafd :=(y *_fcba .Width +x )*2;_beed :=_dafd *3;if _beed +5>=len (_fcba .Data ){return ;
|
|
};_cbdda :=_c .NRGBA64Model .Convert (c ).(_c .NRGBA64 );_fcba .setNRGBA64 (_beed ,_cbdda ,_dafd );};func _ebdg (_gbbg int ,_fddg int )error {return _e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",_gbbg ,_fddg );
|
|
};func _dbd (_facd ,_fbge int ,_afb []byte )*Monochrome {_gfd :=_eeb (_facd ,_fbge );_gfd .Data =_afb ;return _gfd ;};func (_bebg *RGBA32 )setRGBA (_ggbb int ,_gdda _c .RGBA ){_gdbc :=3*_ggbb ;_bebg .Data [_gdbc ]=_gdda .R ;_bebg .Data [_gdbc +1]=_gdda .G ;
|
|
_bebg .Data [_gdbc +2]=_gdda .B ;if _ggbb < len (_bebg .Alpha ){_bebg .Alpha [_ggbb ]=_gdda .A ;};};func (_bbbf *ImageBase )newAlpha (){_ecac :=BytesPerLine (_bbbf .Width ,_bbbf .BitsPerComponent ,1);_bbbf .Alpha =make ([]byte ,_bbbf .Height *_ecac );};
|
|
type Histogramer interface{Histogram ()[256]int ;};func (_becd *RGBA32 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtRGBA32 (x ,y ,_becd .Width ,_becd .Data ,_becd .Alpha ,_becd .Decode );};func _ccdd (){for _fafae :=0;_fafae < 256;_fafae ++{_aeaba [_fafae ]=uint8 (_fafae &0x1)+(uint8 (_fafae >>1)&0x1)+(uint8 (_fafae >>2)&0x1)+(uint8 (_fafae >>3)&0x1)+(uint8 (_fafae >>4)&0x1)+(uint8 (_fafae >>5)&0x1)+(uint8 (_fafae >>6)&0x1)+(uint8 (_fafae >>7)&0x1);
|
|
};};func (_fdbc *Monochrome )setGray (_bbbe int ,_bac _c .Gray ,_bfcb int ){if _bac .Y ==0{_fdbc .clearBit (_bfcb ,_bbbe );}else {_fdbc .setGrayBit (_bfcb ,_bbbe );};};type RasterOperator int ;func _eeb (_fad ,_gf int )*Monochrome {return &Monochrome {ImageBase :NewImageBase (_fad ,_gf ,1,1,nil ,nil ,nil ),ModelThreshold :0x0f};
|
|
};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 _ab (_ac ,_bg *Monochrome )(_abf error ){_ed :=_bg .BytesPerLine ;_db :=_ac .BytesPerLine ;var (_cf byte ;_ccf uint16 ;_gd ,_ea ,_dbf ,_ba ,_dg int ;);for _dbf =0;_dbf < _bg .Height ;
|
|
_dbf ++{_gd =_dbf *_ed ;_ea =2*_dbf *_db ;for _ba =0;_ba < _ed ;_ba ++{_cf =_bg .Data [_gd +_ba ];_ccf =_bagb [_cf ];_dg =_ea +_ba *2;if _ac .BytesPerLine !=_bg .BytesPerLine *2&&(_ba +1)*2> _ac .BytesPerLine {_abf =_ac .setByte (_dg ,byte (_ccf >>8));
|
|
}else {_abf =_ac .setTwoBytes (_dg ,_ccf );};if _abf !=nil {return _abf ;};};for _ba =0;_ba < _db ;_ba ++{_dg =_ea +_db +_ba ;_cf =_ac .Data [_ea +_ba ];if _abf =_ac .setByte (_dg ,_cf );_abf !=nil {return _abf ;};};};return nil ;};const (_cabg shift =iota ;
|
|
_begf ;);func (_cfg *Monochrome )SetGray (x ,y int ,g _c .Gray ){_gcef :=y *_cfg .BytesPerLine +x >>3;if _gcef > len (_cfg .Data )-1{return ;};g =_ccbac (g ,monochromeModel (_cfg .ModelThreshold ));_cfg .setGray (x ,g ,_gcef );};func (_dfaa *Gray2 )GrayAt (x ,y int )_c .Gray {_acbc ,_ :=ColorAtGray2BPC (x ,y ,_dfaa .BytesPerLine ,_dfaa .Data ,_dfaa .Decode );
|
|
return _acbc ;};func AddDataPadding (width ,height ,bitsPerComponent ,colorComponents int ,data []byte )([]byte ,error ){_cgcf :=BytesPerLine (width ,bitsPerComponent ,colorComponents );if _cgcf ==width *colorComponents *bitsPerComponent /8{return data ,nil ;
|
|
};_gcb :=width *colorComponents *bitsPerComponent ;_gaab :=_cgcf *8;_ddbba :=8-(_gaab -_gcb );_aacc :=_da .NewReader (data );_eeagd :=_cgcf -1;_gdf :=make ([]byte ,_eeagd );_agefg :=make ([]byte ,height *_cgcf );_eefd :=_da .NewWriterMSB (_agefg );var _bdbc uint64 ;
|
|
var _gae error ;for _eaeb :=0;_eaeb < height ;_eaeb ++{_ ,_gae =_aacc .Read (_gdf );if _gae !=nil {return nil ,_gae ;};_ ,_gae =_eefd .Write (_gdf );if _gae !=nil {return nil ,_gae ;};_bdbc ,_gae =_aacc .ReadBits (byte (_ddbba ));if _gae !=nil {return nil ,_gae ;
|
|
};_ ,_gae =_eefd .WriteBits (_bdbc ,_ddbba );if _gae !=nil {return nil ,_gae ;};_eefd .FinishByte ();};return _agefg ,nil ;};func IsGrayImgBlackAndWhite (i *_fc .Gray )bool {return _ffbf (i )};func (_acef *Gray2 )SetGray (x ,y int ,gray _c .Gray ){_egcf :=_bcdc (gray );
|
|
_cgcc :=y *_acef .BytesPerLine ;_bgb :=_cgcc +(x >>2);if _bgb >=len (_acef .Data ){return ;};_cagg :=_egcf .Y >>6;_acef .Data [_bgb ]=(_acef .Data [_bgb ]&(^(0xc0>>uint (2*((x )&3)))))|(_cagg <<uint (6-2*(x &3)));};func (_aeda *Gray16 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtGray16BPC (x ,y ,_aeda .BytesPerLine ,_aeda .Data ,_aeda .Decode );
|
|
};func (_ead *Gray2 )At (x ,y int )_c .Color {_cfae ,_ :=_ead .ColorAt (x ,y );return _cfae };func (_dcef *Gray8 )SetGray (x ,y int ,g _c .Gray ){_bbgc :=y *_dcef .BytesPerLine +x ;if _bbgc > len (_dcef .Data )-1{return ;};_dcef .Data [_bbgc ]=g .Y ;};
|
|
func ColorAtNRGBA64 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_c .NRGBA64 ,error ){_fccg :=(y *width +x )*2;_gbfe :=_fccg *3;if _gbfe +5>=len (data ){return _c .NRGBA64 {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
};const _dbadb =0xffff;_cfdd :=uint16 (_dbadb );if alpha !=nil &&len (alpha )> _fccg +1{_cfdd =uint16 (alpha [_fccg ])<<8|uint16 (alpha [_fccg +1]);};_ggcd :=uint16 (data [_gbfe ])<<8|uint16 (data [_gbfe +1]);_cbbbb :=uint16 (data [_gbfe +2])<<8|uint16 (data [_gbfe +3]);
|
|
_bdfg :=uint16 (data [_gbfe +4])<<8|uint16 (data [_gbfe +5]);if len (decode )==6{_ggcd =uint16 (uint64 (LinearInterpolate (float64 (_ggcd ),0,65535,decode [0],decode [1]))&_dbadb );_cbbbb =uint16 (uint64 (LinearInterpolate (float64 (_cbbbb ),0,65535,decode [2],decode [3]))&_dbadb );
|
|
_bdfg =uint16 (uint64 (LinearInterpolate (float64 (_bdfg ),0,65535,decode [4],decode [5]))&_dbadb );};return _c .NRGBA64 {R :_ggcd ,G :_cbbbb ,B :_bdfg ,A :_cfdd },nil ;};func ColorAtNRGBA16 (x ,y ,width ,bytesPerLine int ,data ,alpha []byte ,decode []float64 )(_c .NRGBA ,error ){_abgb :=y *bytesPerLine +x *3/2;
|
|
if _abgb +1>=len (data ){return _c .NRGBA {},_ebdg (x ,y );};const (_febec =0xf;_affa =uint8 (0xff););_accg :=_affa ;if alpha !=nil {_fgg :=y *BytesPerLine (width ,4,1);if _fgg < len (alpha ){if x %2==0{_accg =(alpha [_fgg ]>>uint (4))&_febec ;}else {_accg =alpha [_fgg ]&_febec ;
|
|
};_accg |=_accg <<4;};};var _gadc ,_eaad ,_fegg uint8 ;if x *3%2==0{_gadc =(data [_abgb ]>>uint (4))&_febec ;_eaad =data [_abgb ]&_febec ;_fegg =(data [_abgb +1]>>uint (4))&_febec ;}else {_gadc =data [_abgb ]&_febec ;_eaad =(data [_abgb +1]>>uint (4))&_febec ;
|
|
_fegg =data [_abgb +1]&_febec ;};if len (decode )==6{_gadc =uint8 (uint32 (LinearInterpolate (float64 (_gadc ),0,15,decode [0],decode [1]))&0xf);_eaad =uint8 (uint32 (LinearInterpolate (float64 (_eaad ),0,15,decode [2],decode [3]))&0xf);_fegg =uint8 (uint32 (LinearInterpolate (float64 (_fegg ),0,15,decode [4],decode [5]))&0xf);
|
|
};return _c .NRGBA {R :(_gadc <<4)|(_gadc &0xf),G :(_eaad <<4)|(_eaad &0xf),B :(_fegg <<4)|(_fegg &0xf),A :_accg },nil ;};func (_ddac *NRGBA32 )Copy ()Image {return &NRGBA32 {ImageBase :_ddac .copy ()}};func (_aafcb *RGBA32 )Copy ()Image {return &RGBA32 {ImageBase :_aafcb .copy ()}};
|
|
func _cefa (_fcce _fc .Image ,_abgbe Image ,_faada _fc .Rectangle ){if _aede ,_edcg :=_fcce .(SMasker );_edcg &&_aede .HasAlpha (){_abgbe .(SMasker ).MakeAlpha ();};switch _ecef :=_fcce .(type ){case Gray :_dadg (_ecef ,_abgbe .(NRGBA ),_faada );case NRGBA :_fcgf (_ecef ,_abgbe .(NRGBA ),_faada );
|
|
case *_fc .NYCbCrA :_fcab (_ecef ,_abgbe .(NRGBA ),_faada );case CMYK :_ccgb (_ecef ,_abgbe .(NRGBA ),_faada );case RGBA :_befd (_ecef ,_abgbe .(NRGBA ),_faada );case nrgba64 :_fggc (_ecef ,_abgbe .(NRGBA ),_faada );default:_adc (_fcce ,_abgbe ,_faada );
|
|
};};func (_afec *Monochrome )getBit (_gac ,_ebga int )uint8 {return _afec .Data [_gac +(_ebga >>3)]>>uint (7-(_ebga &7))&1;};var _ Gray =&Gray8 {};type Monochrome struct{ImageBase ;ModelThreshold uint8 ;};func ColorAtNRGBA (x ,y ,width ,bytesPerLine ,bitsPerColor int ,data ,alpha []byte ,decode []float64 )(_c .Color ,error ){switch bitsPerColor {case 4:return ColorAtNRGBA16 (x ,y ,width ,bytesPerLine ,data ,alpha ,decode );
|
|
case 8:return ColorAtNRGBA32 (x ,y ,width ,data ,alpha ,decode );case 16:return ColorAtNRGBA64 (x ,y ,width ,data ,alpha ,decode );default:return nil ,_e .Errorf ("\u0075\u006e\u0073\u0075\u0070\u0070\u006fr\u0074\u0065\u0064 \u0072\u0067\u0062\u0020b\u0069\u0074\u0073\u0020\u0070\u0065\u0072\u0020\u0063\u006f\u006c\u006f\u0072\u0020\u0061\u006d\u006f\u0075\u006e\u0074\u003a\u0020\u0027\u0025\u0064\u0027",bitsPerColor );
|
|
};};func (_gggg *NRGBA16 )Validate ()error {if len (_gggg .Data )!=3*_gggg .Width *_gggg .Height /2{return _f .New ("i\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0069\u006da\u0067\u0065\u0020\u0064\u0061\u0074\u0061 s\u0069\u007a\u0065\u0020f\u006f\u0072\u0020\u0070\u0072\u006f\u0076\u0069\u0064ed\u0020\u0064i\u006d\u0065\u006e\u0073\u0069\u006f\u006e\u0073");
|
|
};return nil ;};func GetConverter (bitsPerComponent ,colorComponents int )(ColorConverter ,error ){switch colorComponents {case 1:switch bitsPerComponent {case 1:return MonochromeConverter ,nil ;case 2:return Gray2Converter ,nil ;case 4:return Gray4Converter ,nil ;
|
|
case 8:return GrayConverter ,nil ;case 16:return Gray16Converter ,nil ;};case 3:switch bitsPerComponent {case 4:return NRGBA16Converter ,nil ;case 8:return NRGBAConverter ,nil ;case 16:return NRGBA64Converter ,nil ;};case 4:return CMYKConverter ,nil ;};
|
|
return nil ,_e .Errorf ("\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0069\u006e\u0076\u0061l\u0069\u0064\u0020\u0063\u006f\u006c\u006f\u0072\u0043o\u006e\u0076\u0065\u0072\u0074\u0065\u0072\u0020\u0070\u0061\u0072\u0061\u006d\u0065t\u0065\u0072\u0073\u002e\u0020\u0042\u0069\u0074\u0073\u0050\u0065\u0072\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u003a\u0020\u0025\u0064\u002c\u0020\u0043\u006f\u006co\u0072\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006et\u0073\u003a \u0025\u0064",bitsPerComponent ,colorComponents );
|
|
};func _ccbae (_dbbb *Monochrome ,_ceca ,_cfbc int ,_cgdb ,_ffgdf int ,_eacfc RasterOperator ){var (_ccgc int ;_dcgg byte ;_fbdb ,_ffdc int ;_adagf int ;);_ceadc :=_cgdb >>3;_babc :=_cgdb &7;if _babc > 0{_dcgg =_dffc [_babc ];};_ccgc =_dbbb .BytesPerLine *_cfbc +(_ceca >>3);
|
|
switch _eacfc {case PixClr :for _fbdb =0;_fbdb < _ffgdf ;_fbdb ++{_adagf =_ccgc +_fbdb *_dbbb .BytesPerLine ;for _ffdc =0;_ffdc < _ceadc ;_ffdc ++{_dbbb .Data [_adagf ]=0x0;_adagf ++;};if _babc > 0{_dbbb .Data [_adagf ]=_fgaf (_dbbb .Data [_adagf ],0x0,_dcgg );
|
|
};};case PixSet :for _fbdb =0;_fbdb < _ffgdf ;_fbdb ++{_adagf =_ccgc +_fbdb *_dbbb .BytesPerLine ;for _ffdc =0;_ffdc < _ceadc ;_ffdc ++{_dbbb .Data [_adagf ]=0xff;_adagf ++;};if _babc > 0{_dbbb .Data [_adagf ]=_fgaf (_dbbb .Data [_adagf ],0xff,_dcgg );
|
|
};};case PixNotDst :for _fbdb =0;_fbdb < _ffgdf ;_fbdb ++{_adagf =_ccgc +_fbdb *_dbbb .BytesPerLine ;for _ffdc =0;_ffdc < _ceadc ;_ffdc ++{_dbbb .Data [_adagf ]=^_dbbb .Data [_adagf ];_adagf ++;};if _babc > 0{_dbbb .Data [_adagf ]=_fgaf (_dbbb .Data [_adagf ],^_dbbb .Data [_adagf ],_dcgg );
|
|
};};};};func _aff ()(_cdd []byte ){_cdd =make ([]byte ,256);for _agc :=0;_agc < 256;_agc ++{_cbbc :=byte (_agc );_cdd [_cbbc ]=(_cbbc &0x01)|((_cbbc &0x04)>>1)|((_cbbc &0x10)>>2)|((_cbbc &0x40)>>3)|((_cbbc &0x02)<<3)|((_cbbc &0x08)<<2)|((_cbbc &0x20)<<1)|(_cbbc &0x80);
|
|
};return _cdd ;};func _efgd (_aaadc *_fc .Gray16 ,_abdba uint8 )*_fc .Gray {_ccec :=_aaadc .Bounds ();_cbff :=_fc .NewGray (_ccec );for _bcdg :=0;_bcdg < _ccec .Dx ();_bcdg ++{for _bbac :=0;_bbac < _ccec .Dy ();_bbac ++{_cgca :=_aaadc .Gray16At (_bcdg ,_bbac );
|
|
_cbff .SetGray (_bcdg ,_bbac ,_c .Gray {Y :_bgcc (uint8 (_cgca .Y /256),_abdba )});};};return _cbff ;};func NewImage (width ,height ,bitsPerComponent ,colorComponents int ,data ,alpha []byte ,decode []float64 )(Image ,error ){_cgb :=NewImageBase (width ,height ,bitsPerComponent ,colorComponents ,data ,alpha ,decode );
|
|
var _gdaf Image ;switch colorComponents {case 1:switch bitsPerComponent {case 1:_gdaf =&Monochrome {ImageBase :_cgb ,ModelThreshold :0x0f};case 2:_gdaf =&Gray2 {ImageBase :_cgb };case 4:_gdaf =&Gray4 {ImageBase :_cgb };case 8:_gdaf =&Gray8 {ImageBase :_cgb };
|
|
case 16:_gdaf =&Gray16 {ImageBase :_cgb };};case 3:switch bitsPerComponent {case 4:_gdaf =&NRGBA16 {ImageBase :_cgb };case 8:_gdaf =&NRGBA32 {ImageBase :_cgb };case 16:_gdaf =&NRGBA64 {ImageBase :_cgb };};case 4:_gdaf =&CMYK32 {ImageBase :_cgb };};if _gdaf ==nil {return nil ,ErrInvalidImage ;
|
|
};return _gdaf ,nil ;};func (_beac *NRGBA16 )Bounds ()_fc .Rectangle {return _fc .Rectangle {Max :_fc .Point {X :_beac .Width ,Y :_beac .Height }};};var _ _fc .Image =&NRGBA16 {};type Image interface{_df .Image ;Base ()*ImageBase ;Copy ()Image ;Pix ()[]byte ;
|
|
ColorAt (_cddg ,_dbbg int )(_c .Color ,error );Validate ()error ;};func (_bgaf *Gray8 )Validate ()error {if len (_bgaf .Data )!=_bgaf .Height *_bgaf .BytesPerLine {return ErrInvalidImage ;};return nil ;};func _gefd (_baaf _fc .Image )(Image ,error ){if _egf ,_agbe :=_baaf .(*Gray8 );
|
|
_agbe {return _egf .Copy (),nil ;};_edcc :=_baaf .Bounds ();_gbae ,_fdcd :=NewImage (_edcc .Max .X ,_edcc .Max .Y ,8,1,nil ,nil ,nil );if _fdcd !=nil {return nil ,_fdcd ;};_dgdf (_baaf ,_gbae ,_edcc );return _gbae ,nil ;};func (_baddf *NRGBA32 )setRGBA (_fbdde int ,_agda _c .NRGBA ){_eagg :=3*_fbdde ;
|
|
_baddf .Data [_eagg ]=_agda .R ;_baddf .Data [_eagg +1]=_agda .G ;_baddf .Data [_eagg +2]=_agda .B ;if _fbdde < len (_baddf .Alpha ){_baddf .Alpha [_fbdde ]=_agda .A ;};};func _fggc (_fge nrgba64 ,_cbfg NRGBA ,_beca _fc .Rectangle ){for _cgggg :=0;_cgggg < _beca .Max .X ;
|
|
_cgggg ++{for _bgag :=0;_bgag < _beca .Max .Y ;_bgag ++{_cgdba :=_fge .NRGBA64At (_cgggg ,_bgag );_cbfg .SetNRGBA (_cgggg ,_bgag ,_cecg (_cgdba ));};};};func (_gccg *Monochrome )copy ()*Monochrome {_fdac :=_eeb (_gccg .Width ,_gccg .Height );_fdac .ModelThreshold =_gccg .ModelThreshold ;
|
|
_fdac .Data =make ([]byte ,len (_gccg .Data ));copy (_fdac .Data ,_gccg .Data );if len (_gccg .Decode )!=0{_fdac .Decode =make ([]float64 ,len (_gccg .Decode ));copy (_fdac .Decode ,_gccg .Decode );};if len (_gccg .Alpha )!=0{_fdac .Alpha =make ([]byte ,len (_gccg .Alpha ));
|
|
copy (_fdac .Alpha ,_gccg .Alpha );};return _fdac ;};func _gege (_gbfa ,_cea *Monochrome ,_fadd []byte ,_cfc int )(_ef error ){var (_cbb ,_agad ,_bfb ,_ffga ,_fea ,_edd ,_bdb ,_gfb int ;_ddg ,_efb ,_gbb ,_fegf uint32 ;_aaad ,_fada byte ;_cff uint16 ;);
|
|
_cee :=make ([]byte ,4);_ceb :=make ([]byte ,4);for _bfb =0;_bfb < _gbfa .Height -1;_bfb ,_ffga =_bfb +2,_ffga +1{_cbb =_bfb *_gbfa .BytesPerLine ;_agad =_ffga *_cea .BytesPerLine ;for _fea ,_edd =0,0;_fea < _cfc ;_fea ,_edd =_fea +4,_edd +1{for _bdb =0;
|
|
_bdb < 4;_bdb ++{_gfb =_cbb +_fea +_bdb ;if _gfb <=len (_gbfa .Data )-1&&_gfb < _cbb +_gbfa .BytesPerLine {_cee [_bdb ]=_gbfa .Data [_gfb ];}else {_cee [_bdb ]=0x00;};_gfb =_cbb +_gbfa .BytesPerLine +_fea +_bdb ;if _gfb <=len (_gbfa .Data )-1&&_gfb < _cbb +(2*_gbfa .BytesPerLine ){_ceb [_bdb ]=_gbfa .Data [_gfb ];
|
|
}else {_ceb [_bdb ]=0x00;};};_ddg =_ce .BigEndian .Uint32 (_cee );_efb =_ce .BigEndian .Uint32 (_ceb );_gbb =_ddg &_efb ;_gbb |=_gbb <<1;_fegf =_ddg |_efb ;_fegf &=_fegf <<1;_efb =_gbb &_fegf ;_efb &=0xaaaaaaaa;_ddg =_efb |(_efb <<7);_aaad =byte (_ddg >>24);
|
|
_fada =byte ((_ddg >>8)&0xff);_gfb =_agad +_edd ;if _gfb +1==len (_cea .Data )-1||_gfb +1>=_agad +_cea .BytesPerLine {if _ef =_cea .setByte (_gfb ,_fadd [_aaad ]);_ef !=nil {return _e .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_gfb );};}else {_cff =(uint16 (_fadd [_aaad ])<<8)|uint16 (_fadd [_fada ]);
|
|
if _ef =_cea .setTwoBytes (_gfb ,_cff );_ef !=nil {return _e .Errorf ("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",_gfb );
|
|
};_edd ++;};};};return nil ;};func ColorAtGray4BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_c .Gray ,error ){_agef :=y *bytesPerLine +x >>1;if _agef >=len (data ){return _c .Gray {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
};_badc :=data [_agef ]>>uint (4-(x &1)*4)&0xf;if len (decode )==2{_badc =uint8 (uint32 (LinearInterpolate (float64 (_badc ),0,15,decode [0],decode [1]))&0xf);};return _c .Gray {Y :_badc *17&0xff},nil ;};func (_geged *NRGBA16 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtNRGBA16 (x ,y ,_geged .Width ,_geged .BytesPerLine ,_geged .Data ,_geged .Alpha ,_geged .Decode );
|
|
};type ImageBase struct{Width ,Height int ;BitsPerComponent ,ColorComponents int ;Data ,Alpha []byte ;Decode []float64 ;BytesPerLine int ;};func (_efec *Monochrome )Base ()*ImageBase {return &_efec .ImageBase };func ImgToBinary (i _fc .Image ,threshold uint8 )*_fc .Gray {switch _bcaa :=i .(type ){case *_fc .Gray :if _ffbf (_bcaa ){return _bcaa ;
|
|
};return _cfaed (_bcaa ,threshold );case *_fc .Gray16 :return _efgd (_bcaa ,threshold );default:return _fcgfc (_bcaa ,threshold );};};func (_beff *NRGBA64 )ColorModel ()_c .Model {return _c .NRGBA64Model };func _ddca (_ebcae Gray ,_feeda RGBA ,_cded _fc .Rectangle ){for _adggb :=0;
|
|
_adggb < _cded .Max .X ;_adggb ++{for _cdfb :=0;_cdfb < _cded .Max .Y ;_cdfb ++{_acce :=_ebcae .GrayAt (_adggb ,_cdfb );_feeda .SetRGBA (_adggb ,_cdfb ,_dfc (_acce ));};};};type Gray2 struct{ImageBase };func (_cgee *NRGBA64 )Bounds ()_fc .Rectangle {return _fc .Rectangle {Max :_fc .Point {X :_cgee .Width ,Y :_cgee .Height }};
|
|
};var (_bagb =_fgd ();_ffg =_cbee ();_gcgc =_bda (););func _befdf (_ffda uint8 )bool {if _ffda ==0||_ffda ==255{return true ;};return false ;};func ColorAtCMYK (x ,y ,width int ,data []byte ,decode []float64 )(_c .CMYK ,error ){_ade :=4*(y *width +x );
|
|
if _ade +3>=len (data ){return _c .CMYK {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
};C :=data [_ade ]&0xff;M :=data [_ade +1]&0xff;Y :=data [_ade +2]&0xff;K :=data [_ade +3]&0xff;if len (decode )==8{C =uint8 (uint32 (LinearInterpolate (float64 (C ),0,255,decode [0],decode [1]))&0xff);M =uint8 (uint32 (LinearInterpolate (float64 (M ),0,255,decode [2],decode [3]))&0xff);
|
|
Y =uint8 (uint32 (LinearInterpolate (float64 (Y ),0,255,decode [4],decode [5]))&0xff);K =uint8 (uint32 (LinearInterpolate (float64 (K ),0,255,decode [6],decode [7]))&0xff);};return _c .CMYK {C :C ,M :M ,Y :Y ,K :K },nil ;};func (_geadf *NRGBA32 )Bounds ()_fc .Rectangle {return _fc .Rectangle {Max :_fc .Point {X :_geadf .Width ,Y :_geadf .Height }};
|
|
};func _ccbg (_eba _c .Gray )_c .CMYK {return _c .CMYK {K :0xff-_eba .Y }};func (_gbd *CMYK32 )Base ()*ImageBase {return &_gbd .ImageBase };func (_aefae *Gray16 )SetGray (x ,y int ,g _c .Gray ){_eeag :=(y *_aefae .BytesPerLine /2+x )*2;if _eeag +1>=len (_aefae .Data ){return ;
|
|
};_aefae .Data [_eeag ]=g .Y ;_aefae .Data [_eeag +1]=g .Y ;};func (_fdbdc *ImageBase )HasAlpha ()bool {if _fdbdc .Alpha ==nil {return false ;};for _bgcbf :=range _fdbdc .Alpha {if _fdbdc .Alpha [_bgcbf ]!=0xff{return true ;};};return false ;};func (_gcaaef *ImageBase )getByte (_dab int )(byte ,error ){if _dab > len (_gcaaef .Data )-1||_dab < 0{return 0,_e .Errorf ("\u0069\u006e\u0064\u0065x:\u0020\u0025\u0064\u0020\u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006eg\u0065",_dab );
|
|
};return _gcaaef .Data [_dab ],nil ;};var _ _fc .Image =&Monochrome {};func _eddg (_gbbb _c .CMYK )_c .NRGBA {_bgec ,_ffa ,_efd :=_c .CMYKToRGB (_gbbb .C ,_gbbb .M ,_gbbb .Y ,_gbbb .K );return _c .NRGBA {R :_bgec ,G :_ffa ,B :_efd ,A :0xff};};var _ _fc .Image =&Gray2 {};
|
|
func (_ccba *CMYK32 )Copy ()Image {return &CMYK32 {ImageBase :_ccba .copy ()}};func _bda ()(_dba [256]uint64 ){for _fbg :=0;_fbg < 256;_fbg ++{if _fbg &0x01!=0{_dba [_fbg ]|=0xff;};if _fbg &0x02!=0{_dba [_fbg ]|=0xff00;};if _fbg &0x04!=0{_dba [_fbg ]|=0xff0000;
|
|
};if _fbg &0x08!=0{_dba [_fbg ]|=0xff000000;};if _fbg &0x10!=0{_dba [_fbg ]|=0xff00000000;};if _fbg &0x20!=0{_dba [_fbg ]|=0xff0000000000;};if _fbg &0x40!=0{_dba [_fbg ]|=0xff000000000000;};if _fbg &0x80!=0{_dba [_fbg ]|=0xff00000000000000;};};return _dba ;
|
|
};func _fgd ()(_geg [256]uint16 ){for _edf :=0;_edf < 256;_edf ++{if _edf &0x01!=0{_geg [_edf ]|=0x3;};if _edf &0x02!=0{_geg [_edf ]|=0xc;};if _edf &0x04!=0{_geg [_edf ]|=0x30;};if _edf &0x08!=0{_geg [_edf ]|=0xc0;};if _edf &0x10!=0{_geg [_edf ]|=0x300;
|
|
};if _edf &0x20!=0{_geg [_edf ]|=0xc00;};if _edf &0x40!=0{_geg [_edf ]|=0x3000;};if _edf &0x80!=0{_geg [_edf ]|=0xc000;};};return _geg ;};func (_cbab *Gray4 )SetGray (x ,y int ,g _c .Gray ){if x >=_cbab .Width ||y >=_cbab .Height {return ;};g =_dgac (g );
|
|
_cbab .setGray (x ,y ,g );};func (_dcbga *Gray16 )Base ()*ImageBase {return &_dcbga .ImageBase };func _ecbe (_eefc _fc .Image ,_cgfe Image ,_bgefc _fc .Rectangle ){if _babe ,_ccadb :=_eefc .(SMasker );_ccadb &&_babe .HasAlpha (){_cgfe .(SMasker ).MakeAlpha ();
|
|
};switch _dcgec :=_eefc .(type ){case Gray :_ddca (_dcgec ,_cgfe .(RGBA ),_bgefc );case NRGBA :_bfeg (_dcgec ,_cgfe .(RGBA ),_bgefc );case *_fc .NYCbCrA :_gcdcc (_dcgec ,_cgfe .(RGBA ),_bgefc );case CMYK :_bdfe (_dcgec ,_cgfe .(RGBA ),_bgefc );case RGBA :_cbgeg (_dcgec ,_cgfe .(RGBA ),_bgefc );
|
|
case nrgba64 :_cbca (_dcgec ,_cgfe .(RGBA ),_bgefc );default:_adc (_eefc ,_cgfe ,_bgefc );};};func _ebb (_fcbc _c .Gray )_c .NRGBA {return _c .NRGBA {R :_fcbc .Y ,G :_fcbc .Y ,B :_fcbc .Y ,A :0xff}};func InDelta (expected ,current ,delta float64 )bool {_edge :=expected -current ;
|
|
if _edge <=-delta ||_edge >=delta {return false ;};return true ;};func _cfeb (_ffb RGBA ,_ebdd CMYK ,_gba _fc .Rectangle ){for _aac :=0;_aac < _gba .Max .X ;_aac ++{for _fag :=0;_fag < _gba .Max .Y ;_fag ++{_cagd :=_ffb .RGBAAt (_aac ,_fag );_ebdd .SetCMYK (_aac ,_fag ,_gbda (_cagd ));
|
|
};};};func _dccge (_gbbe _fc .Image ,_fcbg Image ,_dafc _fc .Rectangle ){if _aecc ,_edgdd :=_gbbe .(SMasker );_edgdd &&_aecc .HasAlpha (){_fcbg .(SMasker ).MakeAlpha ();};_adc (_gbbe ,_fcbg ,_dafc );};func (_bdgf *Gray4 )GrayAt (x ,y int )_c .Gray {_ecdf ,_ :=ColorAtGray4BPC (x ,y ,_bdgf .BytesPerLine ,_bdgf .Data ,_bdgf .Decode );
|
|
return _ecdf ;};func _bgaa (_ggdb _fc .Image ,_fecfa int )(_fc .Rectangle ,bool ,[]byte ){_daca :=_ggdb .Bounds ();var (_fbfcb bool ;_bcff []byte ;);switch _befa :=_ggdb .(type ){case SMasker :_fbfcb =_befa .HasAlpha ();case NRGBA ,RGBA ,*_fc .RGBA64 ,nrgba64 ,*_fc .NYCbCrA :_bcff =make ([]byte ,_daca .Max .X *_daca .Max .Y *_fecfa );
|
|
case *_fc .Paletted :var _ddddf bool ;for _ ,_gaef :=range _befa .Palette {_gdca ,_faadf ,_gcba ,_fggd :=_gaef .RGBA ();if _gdca ==0&&_faadf ==0&&_gcba ==0&&_fggd !=0{_ddddf =true ;break ;};};if _ddddf {_bcff =make ([]byte ,_daca .Max .X *_daca .Max .Y *_fecfa );
|
|
};};return _daca ,_fbfcb ,_bcff ;};var _ Image =&NRGBA64 {};func (_eebef *Gray4 )ColorModel ()_c .Model {return Gray4Model };var (Gray2Model =_c .ModelFunc (_agee );Gray4Model =_c .ModelFunc (_fcbf );NRGBA16Model =_c .ModelFunc (_ecba ););func _fcbf (_fcfg _c .Color )_c .Color {_agbf :=_c .GrayModel .Convert (_fcfg ).(_c .Gray );
|
|
return _dgac (_agbf );};func _gcfe (_aadc _fc .Image )(Image ,error ){if _fgbfg ,_gcab :=_aadc .(*RGBA32 );_gcab {return _fgbfg .Copy (),nil ;};_ceafb ,_bfcff ,_aggc :=_bgaa (_aadc ,1);_aadg :=&RGBA32 {ImageBase :NewImageBase (_ceafb .Max .X ,_ceafb .Max .Y ,8,3,nil ,_aggc ,nil )};
|
|
_ecbe (_aadc ,_aadg ,_ceafb );if len (_aggc )!=0&&!_bfcff {if _gdeg :=_ccgce (_aggc ,_aadg );_gdeg !=nil {return nil ,_gdeg ;};};return _aadg ,nil ;};func (_eff *Monochrome )Scale (scale float64 )(*Monochrome ,error ){var _ebc bool ;_cfebb :=scale ;if scale < 1{_cfebb =1/scale ;
|
|
_ebc =true ;};_aafc :=NextPowerOf2 (uint (_cfebb ));if InDelta (float64 (_aafc ),_cfebb ,0.001){if _ebc {return _eff .ReduceBinary (_cfebb );};return _eff .ExpandBinary (int (_aafc ));};_ggcf :=int (_g .RoundToEven (float64 (_eff .Width )*scale ));_aced :=int (_g .RoundToEven (float64 (_eff .Height )*scale ));
|
|
return _eff .ScaleLow (_ggcf ,_aced );};type Gray4 struct{ImageBase };func _faad (_fadg *Monochrome ,_afed ,_feed ,_dfbf ,_eeff int ,_fbbca RasterOperator ,_ffba *Monochrome ,_egdc ,_dedb int )error {if _fadg ==nil {return _f .New ("\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");
|
|
};if _fbbca ==PixDst {return nil ;};switch _fbbca {case PixClr ,PixSet ,PixNotDst :_fcee (_fadg ,_afed ,_feed ,_dfbf ,_eeff ,_fbbca );return nil ;};if _ffba ==nil {_b .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 .New ("\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _gde :=_ddgd (_fadg ,_afed ,_feed ,_dfbf ,_eeff ,_fbbca ,_ffba ,_egdc ,_dedb );_gde !=nil {return _gde ;};return nil ;};func (_ceaf *Monochrome )ScaleLow (width ,height int )(*Monochrome ,error ){if width < 0||height < 0{return nil ,_f .New ("\u0070\u0072\u006f\u0076\u0069\u0064e\u0064\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0077\u0069\u0064t\u0068\u0020\u0061\u006e\u0064\u0020\u0068e\u0069\u0067\u0068\u0074");
|
|
};_cba :=_eeb (width ,height );_dbe :=make ([]int ,height );_deec :=make ([]int ,width );_cddc :=float64 (_ceaf .Width )/float64 (width );_dfeb :=float64 (_ceaf .Height )/float64 (height );for _bce :=0;_bce < height ;_bce ++{_dbe [_bce ]=int (_g .Min (_dfeb *float64 (_bce )+0.5,float64 (_ceaf .Height -1)));
|
|
};for _bfdc :=0;_bfdc < width ;_bfdc ++{_deec [_bfdc ]=int (_g .Min (_cddc *float64 (_bfdc )+0.5,float64 (_ceaf .Width -1)));};_eecf :=-1;_dbb :=byte (0);for _bbe :=0;_bbe < height ;_bbe ++{_ded :=_dbe [_bbe ]*_ceaf .BytesPerLine ;_ddeb :=_bbe *_cba .BytesPerLine ;
|
|
for _afbd :=0;_afbd < width ;_afbd ++{_bea :=_deec [_afbd ];if _bea !=_eecf {_dbb =_ceaf .getBit (_ded ,_bea );if _dbb !=0{_cba .setBit (_ddeb ,_afbd );};_eecf =_bea ;}else {if _dbb !=0{_cba .setBit (_ddeb ,_afbd );};};};};return _cba ,nil ;};func _adae (_gefdg ,_baab Gray ,_dgef _fc .Rectangle ){for _bdfa :=0;
|
|
_bdfa < _dgef .Max .X ;_bdfa ++{for _ecbc :=0;_ecbc < _dgef .Max .Y ;_ecbc ++{_baab .SetGray (_bdfa ,_ecbc ,_gefdg .GrayAt (_bdfa ,_ecbc ));};};};func _gfa (_fadaa _c .NRGBA )_c .Gray {var _cggg _c .NRGBA ;if _fadaa ==_cggg {return _c .Gray {Y :0xff};};
|
|
_cfa ,_ccbd ,_cfb ,_ :=_fadaa .RGBA ();_badb :=(19595*_cfa +38470*_ccbd +7471*_cfb +1<<15)>>24;return _c .Gray {Y :uint8 (_badb )};};func _adc (_aacb _fc .Image ,_dge Image ,_fcd _fc .Rectangle ){for _egca :=0;_egca < _fcd .Max .X ;_egca ++{for _gfbd :=0;
|
|
_gfbd < _fcd .Max .Y ;_gfbd ++{_dbad :=_aacb .At (_egca ,_gfbd );_dge .Set (_egca ,_gfbd ,_dbad );};};};func _cbgc (_fbgb _c .RGBA )_c .NRGBA {switch _fbgb .A {case 0xff:return _c .NRGBA {R :_fbgb .R ,G :_fbgb .G ,B :_fbgb .B ,A :0xff};case 0x00:return _c .NRGBA {};
|
|
default:_dgba ,_fgbf ,_adg ,_dgc :=_fbgb .RGBA ();_dgba =(_dgba *0xffff)/_dgc ;_fgbf =(_fgbf *0xffff)/_dgc ;_adg =(_adg *0xffff)/_dgc ;return _c .NRGBA {R :uint8 (_dgba >>8),G :uint8 (_fgbf >>8),B :uint8 (_adg >>8),A :uint8 (_dgc >>8)};};};func (_gcgb monochromeModel )Convert (c _c .Color )_c .Color {_dgbc :=_c .GrayModel .Convert (c ).(_c .Gray );
|
|
return _ccbac (_dgbc ,_gcgb );};func (_bdbdc *Gray16 )Bounds ()_fc .Rectangle {return _fc .Rectangle {Max :_fc .Point {X :_bdbdc .Width ,Y :_bdbdc .Height }};};type SMasker interface{HasAlpha ()bool ;GetAlpha ()[]byte ;MakeAlpha ();};var _ Image =&CMYK32 {};
|
|
func (_bcec *NRGBA64 )At (x ,y int )_c .Color {_cgcdf ,_ :=_bcec .ColorAt (x ,y );return _cgcdf };func (_gcdb *Monochrome )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtGray1BPC (x ,y ,_gcdb .BytesPerLine ,_gcdb .Data ,_gcdb .Decode );};func (_eeca *ImageBase )copy ()ImageBase {_bcgb :=*_eeca ;
|
|
_bcgb .Data =make ([]byte ,len (_eeca .Data ));copy (_bcgb .Data ,_eeca .Data );return _bcgb ;};func _adce (_gbaa CMYK ,_fbaf Gray ,_fdef _fc .Rectangle ){for _abgd :=0;_abgd < _fdef .Max .X ;_abgd ++{for _aacf :=0;_aacf < _fdef .Max .Y ;_aacf ++{_ffdg :=_efbb (_gbaa .CMYKAt (_abgd ,_aacf ));
|
|
_fbaf .SetGray (_abgd ,_aacf ,_ffdg );};};};func (_dgec *NRGBA16 )Copy ()Image {return &NRGBA16 {ImageBase :_dgec .copy ()}};func (_adde *NRGBA32 )NRGBAAt (x ,y int )_c .NRGBA {_abde ,_ :=ColorAtNRGBA32 (x ,y ,_adde .Width ,_adde .Data ,_adde .Alpha ,_adde .Decode );
|
|
return _abde ;};func (_fede *Gray16 )Set (x ,y int ,c _c .Color ){_abg :=(y *_fede .BytesPerLine /2+x )*2;if _abg +1>=len (_fede .Data ){return ;};_aaaf :=_c .Gray16Model .Convert (c ).(_c .Gray16 );_fede .Data [_abg ],_fede .Data [_abg +1]=uint8 (_aaaf .Y >>8),uint8 (_aaaf .Y &0xff);
|
|
};func _ad (_fb ,_ae *Monochrome )(_beb error ){_eg :=_ae .BytesPerLine ;_fbc :=_fb .BytesPerLine ;_ee :=_ae .BytesPerLine *4-_fb .BytesPerLine ;var (_gg ,_fe byte ;_agb uint32 ;_cg ,_bd ,_fce ,_cbe ,_edg ,_bff ,_cef int ;);for _fce =0;_fce < _ae .Height ;
|
|
_fce ++{_cg =_fce *_eg ;_bd =4*_fce *_fbc ;for _cbe =0;_cbe < _eg ;_cbe ++{_gg =_ae .Data [_cg +_cbe ];_agb =_ffg [_gg ];_bff =_bd +_cbe *4;if _ee !=0&&(_cbe +1)*4> _fb .BytesPerLine {for _edg =_ee ;_edg > 0;_edg --{_fe =byte ((_agb >>uint (_edg *8))&0xff);
|
|
_cef =_bff +(_ee -_edg );if _beb =_fb .setByte (_cef ,_fe );_beb !=nil {return _beb ;};};}else if _beb =_fb .setFourBytes (_bff ,_agb );_beb !=nil {return _beb ;};if _beb =_fb .setFourBytes (_bd +_cbe *4,_ffg [_ae .Data [_cg +_cbe ]]);_beb !=nil {return _beb ;
|
|
};};for _edg =1;_edg < 4;_edg ++{for _cbe =0;_cbe < _fbc ;_cbe ++{if _beb =_fb .setByte (_bd +_edg *_fbc +_cbe ,_fb .Data [_bd +_cbe ]);_beb !=nil {return _beb ;};};};};return nil ;};func _gcc (_bae *Monochrome ,_ca ...int )(_aec *Monochrome ,_abfe error ){if _bae ==nil {return nil ,_f .New ("\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if len (_ca )==0{return nil ,_f .New ("\u0074h\u0065\u0072e\u0020\u006d\u0075s\u0074\u0020\u0062\u0065\u0020\u0061\u0074 \u006c\u0065\u0061\u0073\u0074\u0020o\u006e\u0065\u0020\u006c\u0065\u0076\u0065\u006c\u0020\u006f\u0066 \u0072\u0065\u0064\u0075\u0063\u0074\u0069\u006f\u006e");
|
|
};_gdb :=_aff ();_aec =_bae ;for _ ,_age :=range _ca {if _age <=0{break ;};_aec ,_abfe =_aab (_aec ,_age ,_gdb );if _abfe !=nil {return nil ,_abfe ;};};return _aec ,nil ;};type ColorConverter interface{Convert (_eded _fc .Image )(Image ,error );};func (_bcaf *Gray16 )Histogram ()(_bfea [256]int ){for _fcdce :=0;
|
|
_fcdce < _bcaf .Width ;_fcdce ++{for _bcc :=0;_bcc < _bcaf .Height ;_bcc ++{_bfea [_bcaf .GrayAt (_fcdce ,_bcc ).Y ]++;};};return _bfea ;};func (_fggf *RGBA32 )At (x ,y int )_c .Color {_gfff ,_ :=_fggf .ColorAt (x ,y );return _gfff };func AutoThresholdTriangle (histogram [256]int )uint8 {var _adcee ,_afgg ,_eaac ,_bffg int ;
|
|
for _degg :=0;_degg < len (histogram );_degg ++{if histogram [_degg ]> 0{_adcee =_degg ;break ;};};if _adcee > 0{_adcee --;};for _edafe :=255;_edafe > 0;_edafe --{if histogram [_edafe ]> 0{_bffg =_edafe ;break ;};};if _bffg < 255{_bffg ++;};for _gbfbc :=0;
|
|
_gbfbc < 256;_gbfbc ++{if histogram [_gbfbc ]> _afgg {_eaac =_gbfbc ;_afgg =histogram [_gbfbc ];};};var _gccf bool ;if (_eaac -_adcee )< (_bffg -_eaac ){_gccf =true ;var _degeg int ;_bebc :=255;for _degeg < _bebc {_bbf :=histogram [_degeg ];histogram [_degeg ]=histogram [_bebc ];
|
|
histogram [_bebc ]=_bbf ;_degeg ++;_bebc --;};_adcee =255-_bffg ;_eaac =255-_eaac ;};if _adcee ==_eaac {return uint8 (_adcee );};_dccgd :=float64 (histogram [_eaac ]);_dbccb :=float64 (_adcee -_eaac );_aedb :=_g .Sqrt (_dccgd *_dccgd +_dbccb *_dbccb );
|
|
_dccgd /=_aedb ;_dbccb /=_aedb ;_aedb =_dccgd *float64 (_adcee )+_dbccb *float64 (histogram [_adcee ]);_dggg :=_adcee ;var _fcea float64 ;for _cagf :=_adcee +1;_cagf <=_eaac ;_cagf ++{_abda :=_dccgd *float64 (_cagf )+_dbccb *float64 (histogram [_cagf ])-_aedb ;
|
|
if _abda > _fcea {_dggg =_cagf ;_fcea =_abda ;};};_dggg --;if _gccf {var _gddf int ;_dfdg :=255;for _gddf < _dfdg {_bcea :=histogram [_gddf ];histogram [_gddf ]=histogram [_dfdg ];histogram [_dfdg ]=_bcea ;_gddf ++;_dfdg --;};return uint8 (255-_dggg );
|
|
};return uint8 (_dggg );};func _bdfe (_gfgb CMYK ,_dged RGBA ,_dfg _fc .Rectangle ){for _adab :=0;_adab < _dfg .Max .X ;_adab ++{for _dfae :=0;_dfae < _dfg .Max .Y ;_dfae ++{_fdda :=_gfgb .CMYKAt (_adab ,_dfae );_dged .SetRGBA (_adab ,_dfae ,_gefg (_fdda ));
|
|
};};};func (_ccaa *Gray2 )Bounds ()_fc .Rectangle {return _fc .Rectangle {Max :_fc .Point {X :_ccaa .Width ,Y :_ccaa .Height }};};func (_fgff *RGBA32 )ColorModel ()_c .Model {return _c .NRGBAModel };var _ Image =&NRGBA16 {};func _bgcc (_fdcg ,_gbce uint8 )uint8 {if _fdcg < _gbce {return 255;
|
|
};return 0;};func (_edeb *Gray2 )Validate ()error {if len (_edeb .Data )!=_edeb .Height *_edeb .BytesPerLine {return ErrInvalidImage ;};return nil ;};func (_cbdd *Gray4 )At (x ,y int )_c .Color {_bgc ,_ :=_cbdd .ColorAt (x ,y );return _bgc };var _ NRGBA =&NRGBA16 {};
|
|
func (_eggf *Gray16 )At (x ,y int )_c .Color {_ggdf ,_ :=_eggf .ColorAt (x ,y );return _ggdf };func (_fcae *Gray8 )Bounds ()_fc .Rectangle {return _fc .Rectangle {Max :_fc .Point {X :_fcae .Width ,Y :_fcae .Height }};};func ScaleAlphaToMonochrome (data []byte ,width ,height int )([]byte ,error ){_bf :=BytesPerLine (width ,8,1);
|
|
if len (data )< _bf *height {return nil ,nil ;};_a :=&Gray8 {NewImageBase (width ,height ,8,1,data ,nil ,nil )};_ge ,_de :=MonochromeConverter .Convert (_a );if _de !=nil {return nil ,_de ;};return _ge .Base ().Data ,nil ;};func _feeg (_gag _c .NRGBA64 )_c .RGBA {_cbf ,_abef ,_caag ,_adcf :=_gag .RGBA ();
|
|
return _c .RGBA {R :uint8 (_cbf >>8),G :uint8 (_abef >>8),B :uint8 (_caag >>8),A :uint8 (_adcf >>8)};};func _ffbf (_ggced *_fc .Gray )bool {for _cadc :=0;_cadc < len (_ggced .Pix );_cadc ++{if !_befdf (_ggced .Pix [_cadc ]){return false ;};};return true ;
|
|
};func (_fbed *RGBA32 )Bounds ()_fc .Rectangle {return _fc .Rectangle {Max :_fc .Point {X :_fbed .Width ,Y :_fbed .Height }};};func (_dadcc *NRGBA64 )setNRGBA64 (_gddg int ,_gbc _c .NRGBA64 ,_dbcc int ){_dadcc .Data [_gddg ]=uint8 (_gbc .R >>8);_dadcc .Data [_gddg +1]=uint8 (_gbc .R &0xff);
|
|
_dadcc .Data [_gddg +2]=uint8 (_gbc .G >>8);_dadcc .Data [_gddg +3]=uint8 (_gbc .G &0xff);_dadcc .Data [_gddg +4]=uint8 (_gbc .B >>8);_dadcc .Data [_gddg +5]=uint8 (_gbc .B &0xff);if _dbcc +1< len (_dadcc .Alpha ){_dadcc .Alpha [_dbcc ]=uint8 (_gbc .A >>8);
|
|
_dadcc .Alpha [_dbcc +1]=uint8 (_gbc .A &0xff);};};type RGBA interface{RGBAAt (_dbfg ,_egbb int )_c .RGBA ;SetRGBA (_caage ,_cfeg int ,_egcff _c .RGBA );};func (_cag *CMYK32 )Validate ()error {if len (_cag .Data )!=4*_cag .Width *_cag .Height {return _f .New ("i\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0069\u006da\u0067\u0065\u0020\u0064\u0061\u0074\u0061 s\u0069\u007a\u0065\u0020f\u006f\u0072\u0020\u0070\u0072\u006f\u0076\u0069\u0064ed\u0020\u0064i\u006d\u0065\u006e\u0073\u0069\u006f\u006e\u0073");
|
|
};return nil ;};func (_dcce *Gray16 )Validate ()error {if len (_dcce .Data )!=_dcce .Height *_dcce .BytesPerLine {return ErrInvalidImage ;};return nil ;};func _cbgeg (_eeef ,_ecca RGBA ,_bada _fc .Rectangle ){for _aceg :=0;_aceg < _bada .Max .X ;_aceg ++{for _dbee :=0;
|
|
_dbee < _bada .Max .Y ;_dbee ++{_ecca .SetRGBA (_aceg ,_dbee ,_eeef .RGBAAt (_aceg ,_dbee ));};};};func _ada (_dgg ,_feg *Monochrome )(_eb error ){_bed :=_feg .BytesPerLine ;_ccb :=_dgg .BytesPerLine ;var _fgf ,_egb ,_bfc ,_eec ,_dae int ;for _bfc =0;_bfc < _feg .Height ;
|
|
_bfc ++{_fgf =_bfc *_bed ;_egb =8*_bfc *_ccb ;for _eec =0;_eec < _bed ;_eec ++{if _eb =_dgg .setEightBytes (_egb +_eec *8,_gcgc [_feg .Data [_fgf +_eec ]]);_eb !=nil {return _eb ;};};for _dae =1;_dae < 8;_dae ++{for _eec =0;_eec < _ccb ;_eec ++{if _eb =_dgg .setByte (_egb +_dae *_ccb +_eec ,_dgg .Data [_egb +_eec ]);
|
|
_eb !=nil {return _eb ;};};};};return nil ;};func (_bceg *Gray8 )GrayAt (x ,y int )_c .Gray {_fbea ,_ :=ColorAtGray8BPC (x ,y ,_bceg .BytesPerLine ,_bceg .Data ,_bceg .Decode );return _fbea ;};var _ Gray =&Gray2 {};func _fbbb (_badbf _c .NYCbCrA )_c .RGBA {_fda ,_gbg ,_aaf ,_fgbc :=_bgfbf (_badbf ).RGBA ();
|
|
return _c .RGBA {R :uint8 (_fda >>8),G :uint8 (_gbg >>8),B :uint8 (_aaf >>8),A :uint8 (_fgbc >>8)};}; |