mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-29 13:48:54 +08:00
398 lines
114 KiB
Go
398 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 (_db "encoding/binary";_d "errors";_dbe "fmt";_ca "github.com/unidoc/unipdf/v3/common";_a "github.com/unidoc/unipdf/v3/internal/bitwise";_g "image";_c "image/color";_fb "image/draw";_fd "math";);func BytesPerLine (width ,bitsPerComponent ,colorComponents int )int {return ((width *bitsPerComponent )*colorComponents +7)>>3;
|
|
};func (_dgge *Gray4 )setGray (_egd int ,_cde int ,_daef _c .Gray ){_ccg :=_cde *_dgge .BytesPerLine ;_gdbb :=_ccg +(_egd >>1);if _gdbb >=len (_dgge .Data ){return ;};_abab :=_daef .Y >>4;_dgge .Data [_gdbb ]=(_dgge .Data [_gdbb ]&(^(0xf0>>uint (4*(_egd &1)))))|(_abab <<uint (4-4*(_egd &1)));
|
|
};func (_daf *Monochrome )clearBit (_gfff ,_gggb int ){_daf .Data [_gfff ]&=^(0x80>>uint (_gggb &7))};func _ffda (_aedbc ,_ebee *Monochrome ,_aac []byte ,_dac int )(_bgg error ){var (_cbf ,_efg ,_abd ,_aeb ,_agf ,_bfee ,_cfg ,_add int ;_bga ,_eagd uint32 ;
|
|
_gdef ,_cagb byte ;_ce uint16 ;);_gea :=make ([]byte ,4);_aege :=make ([]byte ,4);for _abd =0;_abd < _aedbc .Height -1;_abd ,_aeb =_abd +2,_aeb +1{_cbf =_abd *_aedbc .BytesPerLine ;_efg =_aeb *_ebee .BytesPerLine ;for _agf ,_bfee =0,0;_agf < _dac ;_agf ,_bfee =_agf +4,_bfee +1{for _cfg =0;
|
|
_cfg < 4;_cfg ++{_add =_cbf +_agf +_cfg ;if _add <=len (_aedbc .Data )-1&&_add < _cbf +_aedbc .BytesPerLine {_gea [_cfg ]=_aedbc .Data [_add ];}else {_gea [_cfg ]=0x00;};_add =_cbf +_aedbc .BytesPerLine +_agf +_cfg ;if _add <=len (_aedbc .Data )-1&&_add < _cbf +(2*_aedbc .BytesPerLine ){_aege [_cfg ]=_aedbc .Data [_add ];
|
|
}else {_aege [_cfg ]=0x00;};};_bga =_db .BigEndian .Uint32 (_gea );_eagd =_db .BigEndian .Uint32 (_aege );_eagd &=_bga ;_eagd &=_eagd <<1;_eagd &=0xaaaaaaaa;_bga =_eagd |(_eagd <<7);_gdef =byte (_bga >>24);_cagb =byte ((_bga >>8)&0xff);_add =_efg +_bfee ;
|
|
if _add +1==len (_ebee .Data )-1||_add +1>=_efg +_ebee .BytesPerLine {_ebee .Data [_add ]=_aac [_gdef ];if _bgg =_ebee .setByte (_add ,_aac [_gdef ]);_bgg !=nil {return _dbe .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_add );};}else {_ce =(uint16 (_aac [_gdef ])<<8)|uint16 (_aac [_cagb ]);
|
|
if _bgg =_ebee .setTwoBytes (_add ,_ce );_bgg !=nil {return _dbe .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",_add );
|
|
};_bfee ++;};};};return nil ;};func _bee (_fgf _c .NRGBA )_c .RGBA {_bdcc ,_gceg ,_ddf ,_gdga :=_fgf .RGBA ();return _c .RGBA {R :uint8 (_bdcc >>8),G :uint8 (_gceg >>8),B :uint8 (_ddf >>8),A :uint8 (_gdga >>8)};};func (_egdb *NRGBA64 )NRGBA64At (x ,y int )_c .NRGBA64 {_cfdf ,_ :=ColorAtNRGBA64 (x ,y ,_egdb .Width ,_egdb .Data ,_egdb .Alpha ,_egdb .Decode );
|
|
return _cfdf ;};var _ _g .Image =&NRGBA16 {};func MonochromeThresholdConverter (threshold uint8 )ColorConverter {return &monochromeThresholdConverter {Threshold :threshold };};func (_dgbb *NRGBA64 )setNRGBA64 (_dbaa int ,_bgfc _c .NRGBA64 ,_bdgc int ){_dgbb .Data [_dbaa ]=uint8 (_bgfc .R >>8);
|
|
_dgbb .Data [_dbaa +1]=uint8 (_bgfc .R &0xff);_dgbb .Data [_dbaa +2]=uint8 (_bgfc .G >>8);_dgbb .Data [_dbaa +3]=uint8 (_bgfc .G &0xff);_dgbb .Data [_dbaa +4]=uint8 (_bgfc .B >>8);_dgbb .Data [_dbaa +5]=uint8 (_bgfc .B &0xff);if _bdgc +1< len (_dgbb .Alpha ){_dgbb .Alpha [_bdgc ]=uint8 (_bgfc .A >>8);
|
|
_dgbb .Alpha [_bdgc +1]=uint8 (_bgfc .A &0xff);};};func (_dga *Monochrome )AddPadding ()(_bcg error ){if _gdca :=((_dga .Width *_dga .Height )+7)>>3;len (_dga .Data )< _gdca {return _dbe .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 (_dga .Data ),_gdca );
|
|
};_bfa :=_dga .Width %8;if _bfa ==0{return nil ;};_bgad :=_dga .Width /8;_dgfb :=_a .NewReader (_dga .Data );_ecb :=make ([]byte ,_dga .Height *_dga .BytesPerLine );_eeb :=_a .NewWriterMSB (_ecb );_gcfc :=make ([]byte ,_bgad );var (_eeff int ;_afa uint64 ;
|
|
);for _eeff =0;_eeff < _dga .Height ;_eeff ++{if _ ,_bcg =_dgfb .Read (_gcfc );_bcg !=nil {return _bcg ;};if _ ,_bcg =_eeb .Write (_gcfc );_bcg !=nil {return _bcg ;};if _afa ,_bcg =_dgfb .ReadBits (byte (_bfa ));_bcg !=nil {return _bcg ;};if _bcg =_eeb .WriteByte (byte (_afa )<<uint (8-_bfa ));
|
|
_bcg !=nil {return _bcg ;};};_dga .Data =_eeb .Data ();return nil ;};func (_fgaea *ImageBase )setEightBytes (_gddgg int ,_gega uint64 )error {_cfag :=_fgaea .BytesPerLine -(_gddgg %_fgaea .BytesPerLine );if _fgaea .BytesPerLine !=_fgaea .Width >>3{_cfag --;
|
|
};if _cfag >=8{return _fgaea .setEightFullBytes (_gddgg ,_gega );};return _fgaea .setEightPartlyBytes (_gddgg ,_cfag ,_gega );};var _ _g .Image =&Monochrome {};func (_cdfe *Monochrome )getBit (_egae ,_dffa int )uint8 {return _cdfe .Data [_egae +(_dffa >>3)]>>uint (7-(_dffa &7))&1;
|
|
};func _egeg (_cfac ,_bae Gray ,_eagdc _g .Rectangle ){for _fcga :=0;_fcga < _eagdc .Max .X ;_fcga ++{for _egc :=0;_egc < _eagdc .Max .Y ;_egc ++{_bae .SetGray (_fcga ,_egc ,_cfac .GrayAt (_fcga ,_egc ));};};};func IsGrayImgBlackAndWhite (i *_g .Gray )bool {return _deba (i )};
|
|
func _dfae (_aggg _g .Image ,_ddb Image ,_bdc _g .Rectangle ){for _abg :=0;_abg < _bdc .Max .X ;_abg ++{for _ega :=0;_ega < _bdc .Max .Y ;_ega ++{_affb :=_aggg .At (_abg ,_ega );_ddb .Set (_abg ,_ega ,_affb );};};};func _fccc (_aedbb _g .Image )(Image ,error ){if _eaeg ,_fgcc :=_aedbb .(*Monochrome );
|
|
_fgcc {return _eaeg ,nil ;};_edfa :=_aedbb .Bounds ();var _gab Gray ;switch _bfcc :=_aedbb .(type ){case Gray :_gab =_bfcc ;case NRGBA :_gab =&Gray8 {ImageBase :NewImageBase (_edfa .Max .X ,_edfa .Max .Y ,8,1,nil ,nil ,nil )};_cdf (_gab ,_bfcc ,_edfa );
|
|
case nrgba64 :_gab =&Gray8 {ImageBase :NewImageBase (_edfa .Max .X ,_edfa .Max .Y ,8,1,nil ,nil ,nil )};_fgggf (_gab ,_bfcc ,_edfa );default:_dge ,_eafg :=GrayConverter .Convert (_aedbb );if _eafg !=nil {return nil ,_eafg ;};_gab =_dge .(Gray );};_cfgc ,_ede :=NewImage (_edfa .Max .X ,_edfa .Max .Y ,1,1,nil ,nil ,nil );
|
|
if _ede !=nil {return nil ,_ede ;};_edee :=_cfgc .(*Monochrome );_cgba :=AutoThresholdTriangle (GrayHistogram (_gab ));for _abdf :=0;_abdf < _edfa .Max .X ;_abdf ++{for _abcc :=0;_abcc < _edfa .Max .Y ;_abcc ++{_adfd :=_ced (_gab .GrayAt (_abdf ,_abcc ),monochromeModel (_cgba ));
|
|
_edee .SetGray (_abdf ,_abcc ,_adfd );};};return _cfgc ,nil ;};func _ecbg (_aaag ,_dadda NRGBA ,_ffcg _g .Rectangle ){for _ddac :=0;_ddac < _ffcg .Max .X ;_ddac ++{for _fdbc :=0;_fdbc < _ffcg .Max .Y ;_fdbc ++{_dadda .SetNRGBA (_ddac ,_fdbc ,_aaag .NRGBAAt (_ddac ,_fdbc ));
|
|
};};};type RGBA interface{RGBAAt (_ceeg ,_fffa int )_c .RGBA ;SetRGBA (_bcfb ,_bce int ,_ecfb _c .RGBA );};func (_dbcg *NRGBA16 )Validate ()error {if len (_dbcg .Data )!=3*_dbcg .Width *_dbcg .Height /2{return _d .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 (_bggcc *ImageBase )setTwoBytes (_decf int ,_efbb uint16 )error {if _decf +1> len (_bggcc .Data )-1{return _d .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");};_bggcc .Data [_decf ]=byte ((_efbb &0xff00)>>8);
|
|
_bggcc .Data [_decf +1]=byte (_efbb &0xff);return nil ;};type Gray interface{GrayAt (_agff ,_bbda int )_c .Gray ;SetGray (_fadbb ,_cega int ,_caf _c .Gray );};func (_bdfc *CMYK32 )Set (x ,y int ,c _c .Color ){_cfb :=4*(y *_bdfc .Width +x );if _cfb +3>=len (_bdfc .Data ){return ;
|
|
};_eace :=_c .CMYKModel .Convert (c ).(_c .CMYK );_bdfc .Data [_cfb ]=_eace .C ;_bdfc .Data [_cfb +1]=_eace .M ;_bdfc .Data [_cfb +2]=_eace .Y ;_bdfc .Data [_cfb +3]=_eace .K ;};func ImgToBinary (i _g .Image ,threshold uint8 )*_g .Gray {switch _cccc :=i .(type ){case *_g .Gray :if _deba (_cccc ){return _cccc ;
|
|
};return _cbaag (_cccc ,threshold );case *_g .Gray16 :return _ccgga (_cccc ,threshold );default:return _cceb (_cccc ,threshold );};};var _ Image =&CMYK32 {};func _fgda (_aae _g .Image ,_dbef Image ,_gfab _g .Rectangle ){if _egec ,_fddc :=_aae .(SMasker );
|
|
_fddc &&_egec .HasAlpha (){_dbef .(SMasker ).MakeAlpha ();};_dfae (_aae ,_dbef ,_gfab );};func _fbae (_gggg NRGBA ,_deff Gray ,_cdc _g .Rectangle ){for _abfe :=0;_abfe < _cdc .Max .X ;_abfe ++{for _gdaa :=0;_gdaa < _cdc .Max .Y ;_gdaa ++{_gcdb :=_eab (_gggg .NRGBAAt (_abfe ,_gdaa ));
|
|
_deff .SetGray (_abfe ,_gdaa ,_gcdb );};};};func (_facg *Gray4 )Histogram ()(_eede [256]int ){for _ecce :=0;_ecce < _facg .Width ;_ecce ++{for _adgg :=0;_adgg < _facg .Height ;_adgg ++{_eede [_facg .GrayAt (_ecce ,_adgg ).Y ]++;};};return _eede ;};func _eeca (_adaf NRGBA ,_babb RGBA ,_bgfe _g .Rectangle ){for _fgcgg :=0;
|
|
_fgcgg < _bgfe .Max .X ;_fgcgg ++{for _dgcf :=0;_dgcf < _bgfe .Max .Y ;_dgcf ++{_aadf :=_adaf .NRGBAAt (_fgcgg ,_dgcf );_babb .SetRGBA (_fgcgg ,_dgcf ,_bee (_aadf ));};};};func (_gfgd *Gray16 )Set (x ,y int ,c _c .Color ){_cdd :=(y *_gfgd .BytesPerLine /2+x )*2;
|
|
if _cdd +1>=len (_gfgd .Data ){return ;};_dfga :=_c .Gray16Model .Convert (c ).(_c .Gray16 );_gfgd .Data [_cdd ],_gfgd .Data [_cdd +1]=uint8 (_dfga .Y >>8),uint8 (_dfga .Y &0xff);};func (_cfgca *Gray2 )Base ()*ImageBase {return &_cfgca .ImageBase };var _ _g .Image =&Gray8 {};
|
|
var _ Image =&Gray8 {};func (_gdgb *RGBA32 )Base ()*ImageBase {return &_gdgb .ImageBase };func (_cgaeb *NRGBA64 )Bounds ()_g .Rectangle {return _g .Rectangle {Max :_g .Point {X :_cgaeb .Width ,Y :_cgaeb .Height }};};func (_dfd *Gray16 )Copy ()Image {return &Gray16 {ImageBase :_dfd .copy ()}};
|
|
func (_adeea *Gray16 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtGray16BPC (x ,y ,_adeea .BytesPerLine ,_adeea .Data ,_adeea .Decode );};func ColorAtNRGBA32 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_c .NRGBA ,error ){_cbgdg :=y *width +x ;
|
|
_gefb :=3*_cbgdg ;if _gefb +2>=len (data ){return _c .NRGBA {},_dbe .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 );
|
|
};_ecdg :=uint8 (0xff);if alpha !=nil &&len (alpha )> _cbgdg {_ecdg =alpha [_cbgdg ];};_dgfbe ,_eddg ,_bgba :=data [_gefb ],data [_gefb +1],data [_gefb +2];if len (decode )==6{_dgfbe =uint8 (uint32 (LinearInterpolate (float64 (_dgfbe ),0,255,decode [0],decode [1]))&0xff);
|
|
_eddg =uint8 (uint32 (LinearInterpolate (float64 (_eddg ),0,255,decode [2],decode [3]))&0xff);_bgba =uint8 (uint32 (LinearInterpolate (float64 (_bgba ),0,255,decode [4],decode [5]))&0xff);};return _c .NRGBA {R :_dgfbe ,G :_eddg ,B :_bgba ,A :_ecdg },nil ;
|
|
};func _dacd (_febc CMYK ,_efaga Gray ,_afcd _g .Rectangle ){for _edfd :=0;_edfd < _afcd .Max .X ;_edfd ++{for _gdba :=0;_gdba < _afcd .Max .Y ;_gdba ++{_edgb :=_adfg (_febc .CMYKAt (_edfd ,_gdba ));_efaga .SetGray (_edfd ,_gdba ,_edgb );};};};func _aaaa (_fafg Gray ,_fcdde NRGBA ,_ggffc _g .Rectangle ){for _dcacg :=0;
|
|
_dcacg < _ggffc .Max .X ;_dcacg ++{for _adfce :=0;_adfce < _ggffc .Max .Y ;_adfce ++{_cdfdf :=_fafg .GrayAt (_dcacg ,_adfce );_fcdde .SetNRGBA (_dcacg ,_adfce ,_cbe (_cdfdf ));};};};func ColorAtGray1BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_c .Gray ,error ){_fcdc :=y *bytesPerLine +x >>3;
|
|
if _fcdc >=len (data ){return _c .Gray {},_dbe .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 );
|
|
};_afga :=data [_fcdc ]>>uint (7-(x &7))&1;if len (decode )==2{_afga =uint8 (LinearInterpolate (float64 (_afga ),0.0,1.0,decode [0],decode [1]))&1;};return _c .Gray {Y :_afga *255},nil ;};func _ecad (_ece ,_bfcf ,_aade byte )byte {return (_ece &^(_aade ))|(_bfcf &_aade )};
|
|
func (_dgfag *NRGBA32 )Bounds ()_g .Rectangle {return _g .Rectangle {Max :_g .Point {X :_dgfag .Width ,Y :_dgfag .Height }};};func (_dfac *NRGBA64 )ColorModel ()_c .Model {return _c .NRGBA64Model };func _faag (_egdd RGBA ,_ged NRGBA ,_bffb _g .Rectangle ){for _cdag :=0;
|
|
_cdag < _bffb .Max .X ;_cdag ++{for _adfgc :=0;_adfgc < _bffb .Max .Y ;_adfgc ++{_eddf :=_egdd .RGBAAt (_cdag ,_adfgc );_ged .SetNRGBA (_cdag ,_adfgc ,_cabe (_eddf ));};};};func (_cddb *NRGBA32 )Set (x ,y int ,c _c .Color ){_dgac :=y *_cddb .Width +x ;
|
|
_agfgec :=3*_dgac ;if _agfgec +2>=len (_cddb .Data ){return ;};_dcg :=_c .NRGBAModel .Convert (c ).(_c .NRGBA );_cddb .setRGBA (_dgac ,_dcg );};func (_gdddb *RGBA32 )Validate ()error {if len (_gdddb .Data )!=3*_gdddb .Width *_gdddb .Height {return _d .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 (_fggd *Gray4 )Base ()*ImageBase {return &_fggd .ImageBase };func (_bgdf *Monochrome )ReduceBinary (factor float64 )(*Monochrome ,error ){_gaba :=_ffcf (uint (factor ));if !IsPowerOf2 (uint (factor )){_gaba ++;};_abca :=make ([]int ,_gaba );
|
|
for _cef :=range _abca {_abca [_cef ]=4;};_fda ,_dbg :=_bde (_bgdf ,_abca ...);if _dbg !=nil {return nil ,_dbg ;};return _fda ,nil ;};func _cdb (_ffe _c .Gray )_c .RGBA {return _c .RGBA {R :_ffe .Y ,G :_ffe .Y ,B :_ffe .Y ,A :0xff}};func (_cdbg *Gray16 )ColorModel ()_c .Model {return _c .Gray16Model };
|
|
func (_deee *NRGBA64 )Set (x ,y int ,c _c .Color ){_fdff :=(y *_deee .Width +x )*2;_aegd :=_fdff *3;if _aegd +5>=len (_deee .Data ){return ;};_fdafg :=_c .NRGBA64Model .Convert (c ).(_c .NRGBA64 );_deee .setNRGBA64 (_aegd ,_fdafg ,_fdff );};var _ Image =&NRGBA64 {};
|
|
func (_fcac *NRGBA32 )ColorModel ()_c .Model {return _c .NRGBAModel };func _bde (_edf *Monochrome ,_gbd ...int )(_dfb *Monochrome ,_ac error ){if _edf ==nil {return nil ,_d .New ("\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if len (_gbd )==0{return nil ,_d .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");
|
|
};_begg :=_ebega ();_dfb =_edf ;for _ ,_gaf :=range _gbd {if _gaf <=0{break ;};_dfb ,_ac =_eaf (_dfb ,_gaf ,_begg );if _ac !=nil {return nil ,_ac ;};};return _dfb ,nil ;};func (_gfbb *RGBA32 )RGBAAt (x ,y int )_c .RGBA {_fegc ,_ :=ColorAtRGBA32 (x ,y ,_gfbb .Width ,_gfbb .Data ,_gfbb .Alpha ,_gfbb .Decode );
|
|
return _fegc ;};func _bbaf (_bcc NRGBA ,_bddc CMYK ,_eeab _g .Rectangle ){for _fdg :=0;_fdg < _eeab .Max .X ;_fdg ++{for _gaec :=0;_gaec < _eeab .Max .Y ;_gaec ++{_faa :=_bcc .NRGBAAt (_fdg ,_gaec );_bddc .SetCMYK (_fdg ,_gaec ,_fadb (_faa ));};};};var _dfgg [256]uint8 ;
|
|
func (_ceg *CMYK32 )At (x ,y int )_c .Color {_fcg ,_ :=_ceg .ColorAt (x ,y );return _fcg };func (_bfbc *Gray2 )Bounds ()_g .Rectangle {return _g .Rectangle {Max :_g .Point {X :_bfbc .Width ,Y :_bfbc .Height }};};func (_bfga *NRGBA16 )setNRGBA (_caaaa ,_gaed ,_degf int ,_faee _c .NRGBA ){if _caaaa *3%2==0{_bfga .Data [_degf ]=(_faee .R >>4)<<4|(_faee .G >>4);
|
|
_bfga .Data [_degf +1]=(_faee .B >>4)<<4|(_bfga .Data [_degf +1]&0xf);}else {_bfga .Data [_degf ]=(_bfga .Data [_degf ]&0xf0)|(_faee .R >>4);_bfga .Data [_degf +1]=(_faee .G >>4)<<4|(_faee .B >>4);};if _bfga .Alpha !=nil {_efbc :=_gaed *BytesPerLine (_bfga .Width ,4,1);
|
|
if _efbc < len (_bfga .Alpha ){if _caaaa %2==0{_bfga .Alpha [_efbc ]=(_faee .A >>uint (4))<<uint (4)|(_bfga .Alpha [_degf ]&0xf);}else {_bfga .Alpha [_efbc ]=(_bfga .Alpha [_efbc ]&0xf0)|(_faee .A >>uint (4));};};};};func (_ecfga *NRGBA32 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtNRGBA32 (x ,y ,_ecfga .Width ,_ecfga .Data ,_ecfga .Alpha ,_ecfga .Decode );
|
|
};func (_dbcbg *NRGBA32 )Validate ()error {if len (_dbcbg .Data )!=3*_dbcbg .Width *_dbcbg .Height {return _d .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 colorConverter struct{_cgg func (_fcf _g .Image )(Image ,error );};func (_fac *Monochrome )Histogram ()(_cfaa [256]int ){for _ ,_afcf :=range _fac .Data {_cfaa [0xff]+=int (_dfgg [_fac .Data [_afcf ]]);};return _cfaa ;};func _bdeab (_eaedb *Monochrome ,_fcge ,_fdgdae int ,_bgee ,_abcaf int ,_gcfae RasterOperator ){var (_gdf bool ;
|
|
_ddfb bool ;_abdfd int ;_aced int ;_ffcca int ;_becdd int ;_fcaf bool ;_fgfc byte ;);_ccaaf :=8-(_fcge &7);_daba :=_agfge [_ccaaf ];_ecfg :=_eaedb .BytesPerLine *_fdgdae +(_fcge >>3);if _bgee < _ccaaf {_gdf =true ;_daba &=_fgea [8-_ccaaf +_bgee ];};if !_gdf {_abdfd =(_bgee -_ccaaf )>>3;
|
|
if _abdfd !=0{_ddfb =true ;_aced =_ecfg +1;};};_ffcca =(_fcge +_bgee )&7;if !(_gdf ||_ffcca ==0){_fcaf =true ;_fgfc =_fgea [_ffcca ];_becdd =_ecfg +1+_abdfd ;};var _baee ,_efab int ;switch _gcfae {case PixClr :for _baee =0;_baee < _abcaf ;_baee ++{_eaedb .Data [_ecfg ]=_ecad (_eaedb .Data [_ecfg ],0x0,_daba );
|
|
_ecfg +=_eaedb .BytesPerLine ;};if _ddfb {for _baee =0;_baee < _abcaf ;_baee ++{for _efab =0;_efab < _abdfd ;_efab ++{_eaedb .Data [_aced +_efab ]=0x0;};_aced +=_eaedb .BytesPerLine ;};};if _fcaf {for _baee =0;_baee < _abcaf ;_baee ++{_eaedb .Data [_becdd ]=_ecad (_eaedb .Data [_becdd ],0x0,_fgfc );
|
|
_becdd +=_eaedb .BytesPerLine ;};};case PixSet :for _baee =0;_baee < _abcaf ;_baee ++{_eaedb .Data [_ecfg ]=_ecad (_eaedb .Data [_ecfg ],0xff,_daba );_ecfg +=_eaedb .BytesPerLine ;};if _ddfb {for _baee =0;_baee < _abcaf ;_baee ++{for _efab =0;_efab < _abdfd ;
|
|
_efab ++{_eaedb .Data [_aced +_efab ]=0xff;};_aced +=_eaedb .BytesPerLine ;};};if _fcaf {for _baee =0;_baee < _abcaf ;_baee ++{_eaedb .Data [_becdd ]=_ecad (_eaedb .Data [_becdd ],0xff,_fgfc );_becdd +=_eaedb .BytesPerLine ;};};case PixNotDst :for _baee =0;
|
|
_baee < _abcaf ;_baee ++{_eaedb .Data [_ecfg ]=_ecad (_eaedb .Data [_ecfg ],^_eaedb .Data [_ecfg ],_daba );_ecfg +=_eaedb .BytesPerLine ;};if _ddfb {for _baee =0;_baee < _abcaf ;_baee ++{for _efab =0;_efab < _abdfd ;_efab ++{_eaedb .Data [_aced +_efab ]=^(_eaedb .Data [_aced +_efab ]);
|
|
};_aced +=_eaedb .BytesPerLine ;};};if _fcaf {for _baee =0;_baee < _abcaf ;_baee ++{_eaedb .Data [_becdd ]=_ecad (_eaedb .Data [_becdd ],^_eaedb .Data [_becdd ],_fgfc );_becdd +=_eaedb .BytesPerLine ;};};};};func (_afbd *Monochrome )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtGray1BPC (x ,y ,_afbd .BytesPerLine ,_afbd .Data ,_afbd .Decode );
|
|
};func ConverterFunc (converterFunc func (_cfeb _g .Image )(Image ,error ))ColorConverter {return colorConverter {_cgg :converterFunc };};func _cdf (_aaf Gray ,_begga NRGBA ,_aafc _g .Rectangle ){for _bdfg :=0;_bdfg < _aafc .Max .X ;_bdfg ++{for _bfgd :=0;
|
|
_bfgd < _aafc .Max .Y ;_bfgd ++{_aec :=_efd (_begga .NRGBAAt (_bdfg ,_bfgd ));_aaf .SetGray (_bdfg ,_bfgd ,_aec );};};};func init (){_ebc ()};func (_eaeb *Gray2 )Copy ()Image {return &Gray2 {ImageBase :_eaeb .copy ()}};func (_acad *Gray16 )Bounds ()_g .Rectangle {return _g .Rectangle {Max :_g .Point {X :_acad .Width ,Y :_acad .Height }};
|
|
};func _bccg (_dffe _c .Gray )_c .Gray {_dffe .Y >>=4;_dffe .Y |=_dffe .Y <<4;return _dffe };func ImgToGray (i _g .Image )*_g .Gray {if _fbfg ,_dbed :=i .(*_g .Gray );_dbed {return _fbfg ;};_edag :=i .Bounds ();_ddbda :=_g .NewGray (_edag );for _agggf :=0;
|
|
_agggf < _edag .Max .X ;_agggf ++{for _ccgd :=0;_ccgd < _edag .Max .Y ;_ccgd ++{_fab :=i .At (_agggf ,_ccgd );_ddbda .Set (_agggf ,_ccgd ,_fab );};};return _ddbda ;};func (_gdec *Monochrome )setBit (_cba ,_ecc int ){_gdec .Data [_cba +(_ecc >>3)]|=0x80>>uint (_ecc &7)};
|
|
func _bdba ()(_fdc [256]uint32 ){for _eag :=0;_eag < 256;_eag ++{if _eag &0x01!=0{_fdc [_eag ]|=0xf;};if _eag &0x02!=0{_fdc [_eag ]|=0xf0;};if _eag &0x04!=0{_fdc [_eag ]|=0xf00;};if _eag &0x08!=0{_fdc [_eag ]|=0xf000;};if _eag &0x10!=0{_fdc [_eag ]|=0xf0000;
|
|
};if _eag &0x20!=0{_fdc [_eag ]|=0xf00000;};if _eag &0x40!=0{_fdc [_eag ]|=0xf000000;};if _eag &0x80!=0{_fdc [_eag ]|=0xf0000000;};};return _fdc ;};func _cdgc (_geggg ,_eeacg uint8 )uint8 {if _geggg < _eeacg {return 255;};return 0;};func ColorAtRGBA32 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_c .RGBA ,error ){_debd :=y *width +x ;
|
|
_beda :=3*_debd ;if _beda +2>=len (data ){return _c .RGBA {},_dbe .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 );
|
|
};_fede :=uint8 (0xff);if alpha !=nil &&len (alpha )> _debd {_fede =alpha [_debd ];};_cbce ,_bffd ,_gabc :=data [_beda ],data [_beda +1],data [_beda +2];if len (decode )==6{_cbce =uint8 (uint32 (LinearInterpolate (float64 (_cbce ),0,255,decode [0],decode [1]))&0xff);
|
|
_bffd =uint8 (uint32 (LinearInterpolate (float64 (_bffd ),0,255,decode [2],decode [3]))&0xff);_gabc =uint8 (uint32 (LinearInterpolate (float64 (_gabc ),0,255,decode [4],decode [5]))&0xff);};return _c .RGBA {R :_cbce ,G :_bffd ,B :_gabc ,A :_fede },nil ;
|
|
};func _gg ()(_bef [256]uint16 ){for _eec :=0;_eec < 256;_eec ++{if _eec &0x01!=0{_bef [_eec ]|=0x3;};if _eec &0x02!=0{_bef [_eec ]|=0xc;};if _eec &0x04!=0{_bef [_eec ]|=0x30;};if _eec &0x08!=0{_bef [_eec ]|=0xc0;};if _eec &0x10!=0{_bef [_eec ]|=0x300;
|
|
};if _eec &0x20!=0{_bef [_eec ]|=0xc00;};if _eec &0x40!=0{_bef [_eec ]|=0x3000;};if _eec &0x80!=0{_bef [_eec ]|=0xc000;};};return _bef ;};func (_cebc *Gray4 )SetGray (x ,y int ,g _c .Gray ){if x >=_cebc .Width ||y >=_cebc .Height {return ;};g =_bccg (g );
|
|
_cebc .setGray (x ,y ,g );};func (_aeda *ImageBase )MakeAlpha (){_aeda .newAlpha ()};func _beggf (_ecd _c .NRGBA64 )_c .NRGBA {return _c .NRGBA {R :uint8 (_ecd .R >>8),G :uint8 (_ecd .G >>8),B :uint8 (_ecd .B >>8),A :uint8 (_ecd .A >>8)};};var _ Image =&Gray16 {};
|
|
func (_bgca *Gray16 )GrayAt (x ,y int )_c .Gray {_eagfa ,_ :=_bgca .ColorAt (x ,y );return _c .Gray {Y :uint8 (_eagfa .(_c .Gray16 ).Y >>8)};};var _ Image =&Gray2 {};func _dccb (_fff _c .Gray )_c .CMYK {return _c .CMYK {K :0xff-_fff .Y }};func _cbgd (_edgg _g .Image )(Image ,error ){if _bbea ,_geee :=_edgg .(*Gray8 );
|
|
_geee {return _bbea .Copy (),nil ;};_adbe :=_edgg .Bounds ();_decd ,_bcff :=NewImage (_adbe .Max .X ,_adbe .Max .Y ,8,1,nil ,nil ,nil );if _bcff !=nil {return nil ,_bcff ;};_fea (_edgg ,_decd ,_adbe );return _decd ,nil ;};const (PixSrc RasterOperator =0xc;
|
|
PixDst RasterOperator =0xa;PixNotSrc RasterOperator =0x3;PixNotDst RasterOperator =0x5;PixClr RasterOperator =0x0;PixSet RasterOperator =0xf;PixSrcOrDst RasterOperator =0xe;PixSrcAndDst RasterOperator =0x8;PixSrcXorDst RasterOperator =0x6;PixNotSrcOrDst RasterOperator =0xb;
|
|
PixNotSrcAndDst RasterOperator =0x2;PixSrcOrNotDst RasterOperator =0xd;PixSrcAndNotDst RasterOperator =0x4;PixNotPixSrcOrDst RasterOperator =0x1;PixNotPixSrcAndDst RasterOperator =0x7;PixNotPixSrcXorDst RasterOperator =0x9;PixPaint =PixSrcOrDst ;PixSubtract =PixNotSrcAndDst ;
|
|
PixMask =PixSrcAndDst ;);type CMYK interface{CMYKAt (_eaccd ,_dag int )_c .CMYK ;SetCMYK (_cca ,_dad int ,_gbdg _c .CMYK );};type NRGBA32 struct{ImageBase };func (_abdd *Gray8 )GrayAt (x ,y int )_c .Gray {_eagf ,_ :=ColorAtGray8BPC (x ,y ,_abdd .BytesPerLine ,_abdd .Data ,_abdd .Decode );
|
|
return _eagf ;};func (_fdca *NRGBA16 )NRGBAAt (x ,y int )_c .NRGBA {_abgc ,_ :=ColorAtNRGBA16 (x ,y ,_fdca .Width ,_fdca .BytesPerLine ,_fdca .Data ,_fdca .Alpha ,_fdca .Decode );return _abgc ;};func _dggbf (_gccgc CMYK ,_ebff RGBA ,_dgbf _g .Rectangle ){for _beac :=0;
|
|
_beac < _dgbf .Max .X ;_beac ++{for _baea :=0;_baea < _dgbf .Max .Y ;_baea ++{_eccdg :=_gccgc .CMYKAt (_beac ,_baea );_ebff .SetRGBA (_beac ,_baea ,_deef (_eccdg ));};};};var (_fgea =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};_agfge =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};
|
|
);var _ Gray =&Monochrome {};func (_aba monochromeModel )Convert (c _c .Color )_c .Color {_abcd :=_c .GrayModel .Convert (c ).(_c .Gray );return _ced (_abcd ,_aba );};var _ Gray =&Gray2 {};func (_bdfb *Monochrome )At (x ,y int )_c .Color {_gadb ,_ :=_bdfb .ColorAt (x ,y );
|
|
return _gadb };func _eagg (_cd ,_dg *Monochrome ,_ace []byte ,_bgd int )(_dcc error ){var (_aga ,_cac ,_bff ,_fag ,_afgf ,_bgc ,_dca ,_gff int ;_aag ,_dbf uint32 ;_ade ,_bbc byte ;_bbce uint16 ;);_fad :=make ([]byte ,4);_bdf :=make ([]byte ,4);for _bff =0;
|
|
_bff < _cd .Height -1;_bff ,_fag =_bff +2,_fag +1{_aga =_bff *_cd .BytesPerLine ;_cac =_fag *_dg .BytesPerLine ;for _afgf ,_bgc =0,0;_afgf < _bgd ;_afgf ,_bgc =_afgf +4,_bgc +1{for _dca =0;_dca < 4;_dca ++{_gff =_aga +_afgf +_dca ;if _gff <=len (_cd .Data )-1&&_gff < _aga +_cd .BytesPerLine {_fad [_dca ]=_cd .Data [_gff ];
|
|
}else {_fad [_dca ]=0x00;};_gff =_aga +_cd .BytesPerLine +_afgf +_dca ;if _gff <=len (_cd .Data )-1&&_gff < _aga +(2*_cd .BytesPerLine ){_bdf [_dca ]=_cd .Data [_gff ];}else {_bdf [_dca ]=0x00;};};_aag =_db .BigEndian .Uint32 (_fad );_dbf =_db .BigEndian .Uint32 (_bdf );
|
|
_dbf |=_aag ;_dbf |=_dbf <<1;_dbf &=0xaaaaaaaa;_aag =_dbf |(_dbf <<7);_ade =byte (_aag >>24);_bbc =byte ((_aag >>8)&0xff);_gff =_cac +_bgc ;if _gff +1==len (_dg .Data )-1||_gff +1>=_cac +_dg .BytesPerLine {_dg .Data [_gff ]=_ace [_ade ];}else {_bbce =(uint16 (_ace [_ade ])<<8)|uint16 (_ace [_bbc ]);
|
|
if _dcc =_dg .setTwoBytes (_gff ,_bbce );_dcc !=nil {return _dbe .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",_gff );
|
|
};_bgc ++;};};};return nil ;};var _ NRGBA =&NRGBA32 {};func _ced (_gafg _c .Gray ,_cfa monochromeModel )_c .Gray {if _gafg .Y > uint8 (_cfa ){return _c .Gray {Y :_fd .MaxUint8 };};return _c .Gray {};};func _dcgg (_ggccf _g .Image ,_cbgc int )(_g .Rectangle ,bool ,[]byte ){_cdde :=_ggccf .Bounds ();
|
|
var (_agad bool ;_fefb []byte ;);switch _bfeed :=_ggccf .(type ){case SMasker :_agad =_bfeed .HasAlpha ();case NRGBA ,RGBA ,*_g .RGBA64 ,nrgba64 ,*_g .NYCbCrA :_fefb =make ([]byte ,_cdde .Max .X *_cdde .Max .Y *_cbgc );case *_g .Paletted :var _fbfd bool ;
|
|
for _ ,_ggff :=range _bfeed .Palette {_bcdb ,_cfagd ,_eedg ,_deb :=_ggff .RGBA ();if _bcdb ==0&&_cfagd ==0&&_eedg ==0&&_deb !=0{_fbfd =true ;break ;};};if _fbfd {_fefb =make ([]byte ,_cdde .Max .X *_cdde .Max .Y *_cbgc );};};return _cdde ,_agad ,_fefb ;
|
|
};func _egea (_cddgg int ,_ddba int )error {return _dbe .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",_cddgg ,_ddba );
|
|
};func (_dggb *NRGBA16 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtNRGBA16 (x ,y ,_dggb .Width ,_dggb .BytesPerLine ,_dggb .Data ,_dggb .Alpha ,_dggb .Decode );};func (_bdcf *Monochrome )Scale (scale float64 )(*Monochrome ,error ){var _fbfce bool ;
|
|
_gba :=scale ;if scale < 1{_gba =1/scale ;_fbfce =true ;};_feb :=NextPowerOf2 (uint (_gba ));if InDelta (float64 (_feb ),_gba ,0.001){if _fbfce {return _bdcf .ReduceBinary (_gba );};return _bdcf .ExpandBinary (int (_feb ));};_dbb :=int (_fd .RoundToEven (float64 (_bdcf .Width )*scale ));
|
|
_dec :=int (_fd .RoundToEven (float64 (_bdcf .Height )*scale ));return _bdcf .ScaleLow (_dbb ,_dec );};func _eeae (_acc _c .NYCbCrA )_c .NRGBA {_dbfa :=int32 (_acc .Y )*0x10101;_fffc :=int32 (_acc .Cb )-128;_edbg :=int32 (_acc .Cr )-128;_gef :=_dbfa +91881*_edbg ;
|
|
if uint32 (_gef )&0xff000000==0{_gef >>=8;}else {_gef =^(_gef >>31)&0xffff;};_gaece :=_dbfa -22554*_fffc -46802*_edbg ;if uint32 (_gaece )&0xff000000==0{_gaece >>=8;}else {_gaece =^(_gaece >>31)&0xffff;};_dgc :=_dbfa +116130*_fffc ;if uint32 (_dgc )&0xff000000==0{_dgc >>=8;
|
|
}else {_dgc =^(_dgc >>31)&0xffff;};return _c .NRGBA {R :uint8 (_gef >>8),G :uint8 (_gaece >>8),B :uint8 (_dgc >>8),A :_acc .A };};func _gadd (_cbfce *Monochrome ,_gbde ,_caag ,_ggcf ,_dbcb int ,_gfbgf RasterOperator ,_agaa *Monochrome ,_fge ,_dbeab int )error {var (_fbde bool ;
|
|
_bdg bool ;_eecdf int ;_dcca int ;_aedg int ;_fbdf bool ;_dbbf byte ;_fca int ;_beea int ;_ebce int ;_affa ,_fbcf int ;);_bcded :=8-(_gbde &7);_fadg :=_agfge [_bcded ];_cfcf :=_cbfce .BytesPerLine *_caag +(_gbde >>3);_gagf :=_agaa .BytesPerLine *_dbeab +(_fge >>3);
|
|
if _ggcf < _bcded {_fbde =true ;_fadg &=_fgea [8-_bcded +_ggcf ];};if !_fbde {_eecdf =(_ggcf -_bcded )>>3;if _eecdf > 0{_bdg =true ;_dcca =_cfcf +1;_aedg =_gagf +1;};};_fca =(_gbde +_ggcf )&7;if !(_fbde ||_fca ==0){_fbdf =true ;_dbbf =_fgea [_fca ];_beea =_cfcf +1+_eecdf ;
|
|
_ebce =_gagf +1+_eecdf ;};switch _gfbgf {case PixSrc :for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],_agaa .Data [_gagf ],_fadg );_cfcf +=_cbfce .BytesPerLine ;_gagf +=_agaa .BytesPerLine ;};if _bdg {for _affa =0;
|
|
_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;_fbcf ++{_cbfce .Data [_dcca +_fbcf ]=_agaa .Data [_aedg +_fbcf ];};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;};};if _fbdf {for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],_agaa .Data [_ebce ],_dbbf );
|
|
_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};case PixNotSrc :for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],^_agaa .Data [_gagf ],_fadg );_cfcf +=_cbfce .BytesPerLine ;_gagf +=_agaa .BytesPerLine ;
|
|
};if _bdg {for _affa =0;_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;_fbcf ++{_cbfce .Data [_dcca +_fbcf ]=^_agaa .Data [_aedg +_fbcf ];};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;};};if _fbdf {for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],^_agaa .Data [_ebce ],_dbbf );
|
|
_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};case PixSrcOrDst :for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],_agaa .Data [_gagf ]|_cbfce .Data [_cfcf ],_fadg );_cfcf +=_cbfce .BytesPerLine ;_gagf +=_agaa .BytesPerLine ;
|
|
};if _bdg {for _affa =0;_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;_fbcf ++{_cbfce .Data [_dcca +_fbcf ]|=_agaa .Data [_aedg +_fbcf ];};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;};};if _fbdf {for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],_agaa .Data [_ebce ]|_cbfce .Data [_beea ],_dbbf );
|
|
_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};case PixSrcAndDst :for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],_agaa .Data [_gagf ]&_cbfce .Data [_cfcf ],_fadg );_cfcf +=_cbfce .BytesPerLine ;_gagf +=_agaa .BytesPerLine ;
|
|
};if _bdg {for _affa =0;_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;_fbcf ++{_cbfce .Data [_dcca +_fbcf ]&=_agaa .Data [_aedg +_fbcf ];};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;};};if _fbdf {for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],_agaa .Data [_ebce ]&_cbfce .Data [_beea ],_dbbf );
|
|
_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};case PixSrcXorDst :for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],_agaa .Data [_gagf ]^_cbfce .Data [_cfcf ],_fadg );_cfcf +=_cbfce .BytesPerLine ;_gagf +=_agaa .BytesPerLine ;
|
|
};if _bdg {for _affa =0;_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;_fbcf ++{_cbfce .Data [_dcca +_fbcf ]^=_agaa .Data [_aedg +_fbcf ];};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;};};if _fbdf {for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],_agaa .Data [_ebce ]^_cbfce .Data [_beea ],_dbbf );
|
|
_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};case PixNotSrcOrDst :for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],^(_agaa .Data [_gagf ])|_cbfce .Data [_cfcf ],_fadg );_cfcf +=_cbfce .BytesPerLine ;
|
|
_gagf +=_agaa .BytesPerLine ;};if _bdg {for _affa =0;_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;_fbcf ++{_cbfce .Data [_dcca +_fbcf ]|=^(_agaa .Data [_aedg +_fbcf ]);};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;};};if _fbdf {for _affa =0;
|
|
_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],^(_agaa .Data [_ebce ])|_cbfce .Data [_beea ],_dbbf );_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};case PixNotSrcAndDst :for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],^(_agaa .Data [_gagf ])&_cbfce .Data [_cfcf ],_fadg );
|
|
_cfcf +=_cbfce .BytesPerLine ;_gagf +=_agaa .BytesPerLine ;};if _bdg {for _affa =0;_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;_fbcf ++{_cbfce .Data [_dcca +_fbcf ]&=^_agaa .Data [_aedg +_fbcf ];};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;
|
|
};};if _fbdf {for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],^(_agaa .Data [_ebce ])&_cbfce .Data [_beea ],_dbbf );_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};case PixSrcOrNotDst :for _affa =0;
|
|
_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],_agaa .Data [_gagf ]|^(_cbfce .Data [_cfcf ]),_fadg );_cfcf +=_cbfce .BytesPerLine ;_gagf +=_agaa .BytesPerLine ;};if _bdg {for _affa =0;_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;
|
|
_fbcf ++{_cbfce .Data [_dcca +_fbcf ]=_agaa .Data [_aedg +_fbcf ]|^(_cbfce .Data [_dcca +_fbcf ]);};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;};};if _fbdf {for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],_agaa .Data [_ebce ]|^(_cbfce .Data [_beea ]),_dbbf );
|
|
_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};case PixSrcAndNotDst :for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],_agaa .Data [_gagf ]&^(_cbfce .Data [_cfcf ]),_fadg );_cfcf +=_cbfce .BytesPerLine ;
|
|
_gagf +=_agaa .BytesPerLine ;};if _bdg {for _affa =0;_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;_fbcf ++{_cbfce .Data [_dcca +_fbcf ]=_agaa .Data [_aedg +_fbcf ]&^(_cbfce .Data [_dcca +_fbcf ]);};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;
|
|
};};if _fbdf {for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],_agaa .Data [_ebce ]&^(_cbfce .Data [_beea ]),_dbbf );_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};case PixNotPixSrcOrDst :for _affa =0;
|
|
_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],^(_agaa .Data [_gagf ]|_cbfce .Data [_cfcf ]),_fadg );_cfcf +=_cbfce .BytesPerLine ;_gagf +=_agaa .BytesPerLine ;};if _bdg {for _affa =0;_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;
|
|
_fbcf ++{_cbfce .Data [_dcca +_fbcf ]=^(_agaa .Data [_aedg +_fbcf ]|_cbfce .Data [_dcca +_fbcf ]);};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;};};if _fbdf {for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],^(_agaa .Data [_ebce ]|_cbfce .Data [_beea ]),_dbbf );
|
|
_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};case PixNotPixSrcAndDst :for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],^(_agaa .Data [_gagf ]&_cbfce .Data [_cfcf ]),_fadg );_cfcf +=_cbfce .BytesPerLine ;
|
|
_gagf +=_agaa .BytesPerLine ;};if _bdg {for _affa =0;_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;_fbcf ++{_cbfce .Data [_dcca +_fbcf ]=^(_agaa .Data [_aedg +_fbcf ]&_cbfce .Data [_dcca +_fbcf ]);};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;
|
|
};};if _fbdf {for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],^(_agaa .Data [_ebce ]&_cbfce .Data [_beea ]),_dbbf );_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};case PixNotPixSrcXorDst :for _affa =0;
|
|
_affa < _dbcb ;_affa ++{_cbfce .Data [_cfcf ]=_ecad (_cbfce .Data [_cfcf ],^(_agaa .Data [_gagf ]^_cbfce .Data [_cfcf ]),_fadg );_cfcf +=_cbfce .BytesPerLine ;_gagf +=_agaa .BytesPerLine ;};if _bdg {for _affa =0;_affa < _dbcb ;_affa ++{for _fbcf =0;_fbcf < _eecdf ;
|
|
_fbcf ++{_cbfce .Data [_dcca +_fbcf ]=^(_agaa .Data [_aedg +_fbcf ]^_cbfce .Data [_dcca +_fbcf ]);};_dcca +=_cbfce .BytesPerLine ;_aedg +=_agaa .BytesPerLine ;};};if _fbdf {for _affa =0;_affa < _dbcb ;_affa ++{_cbfce .Data [_beea ]=_ecad (_cbfce .Data [_beea ],^(_agaa .Data [_ebce ]^_cbfce .Data [_beea ]),_dbbf );
|
|
_beea +=_cbfce .BytesPerLine ;_ebce +=_agaa .BytesPerLine ;};};default:_ca .Log .Debug ("I\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070e\u0072\u0061\u0074o\u0072:\u0020\u0025\u0064",_gfbgf );return _d .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 ScaleAlphaToMonochrome (data []byte ,width ,height int )([]byte ,error ){_ad :=BytesPerLine (width ,8,1);if len (data )< _ad *height {return nil ,nil ;};_fdd :=&Gray8 {NewImageBase (width ,height ,8,1,data ,nil ,nil )};_e ,_ff :=MonochromeConverter .Convert (_fdd );
|
|
if _ff !=nil {return nil ,_ff ;};return _e .Base ().Data ,nil ;};func (_efb *Gray8 )Bounds ()_g .Rectangle {return _g .Rectangle {Max :_g .Point {X :_efb .Width ,Y :_efb .Height }};};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 ,_dbe .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 AddDataPadding (width ,height ,bitsPerComponent ,colorComponents int ,data []byte )([]byte ,error ){_eegd :=BytesPerLine (width ,bitsPerComponent ,colorComponents );if _eegd ==width *colorComponents *bitsPerComponent /8{return data ,nil ;};_bcfg :=width *colorComponents *bitsPerComponent ;
|
|
_gbag :=_eegd *8;_eecf :=8-(_gbag -_bcfg );_bed :=_a .NewReader (data );_efbf :=_eegd -1;_gcgg :=make ([]byte ,_efbf );_fddge :=make ([]byte ,height *_eegd );_eegb :=_a .NewWriterMSB (_fddge );var _aabc uint64 ;var _aecc error ;for _dbga :=0;_dbga < height ;
|
|
_dbga ++{_ ,_aecc =_bed .Read (_gcgg );if _aecc !=nil {return nil ,_aecc ;};_ ,_aecc =_eegb .Write (_gcgg );if _aecc !=nil {return nil ,_aecc ;};_aabc ,_aecc =_bed .ReadBits (byte (_eecf ));if _aecc !=nil {return nil ,_aecc ;};_ ,_aecc =_eegb .WriteBits (_aabc ,_eecf );
|
|
if _aecc !=nil {return nil ,_aecc ;};_eegb .FinishByte ();};return _fddge ,nil ;};func (_ceee *RGBA32 )At (x ,y int )_c .Color {_edbee ,_ :=_ceee .ColorAt (x ,y );return _edbee };type CMYK32 struct{ImageBase };func (_egfb *Gray4 )At (x ,y int )_c .Color {_aefb ,_ :=_egfb .ColorAt (x ,y );
|
|
return _aefb };func (_ggfb *NRGBA64 )Base ()*ImageBase {return &_ggfb .ImageBase };func _ggcg (_gcg _c .Gray )_c .Gray {_ffec :=_gcg .Y >>6;_ffec |=_ffec <<2;_gcg .Y =_ffec |_ffec <<4;return _gcg ;};func (_cga *Monochrome )Bounds ()_g .Rectangle {return _g .Rectangle {Max :_g .Point {X :_cga .Width ,Y :_cga .Height }};
|
|
};func _cfgd (_afgc Gray ,_geb CMYK ,_ffg _g .Rectangle ){for _cbd :=0;_cbd < _ffg .Max .X ;_cbd ++{for _fgce :=0;_fgce < _ffg .Max .Y ;_fgce ++{_bdec :=_afgc .GrayAt (_cbd ,_fgce );_geb .SetCMYK (_cbd ,_fgce ,_dccb (_bdec ));};};};func (_egfd *NRGBA64 )Validate ()error {if len (_egfd .Data )!=3*2*_egfd .Width *_egfd .Height {return _d .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 _fgggf (_cfff Gray ,_cegf nrgba64 ,_bab _g .Rectangle ){for _cee :=0;_cee < _bab .Max .X ;_cee ++{for _daaf :=0;_daaf < _bab .Max .Y ;_daaf ++{_adee :=_fgcg (_cegf .NRGBA64At (_cee ,_daaf ));_cfff .SetGray (_cee ,_daaf ,_adee );};};
|
|
};func (_abee *Gray16 )Base ()*ImageBase {return &_abee .ImageBase };func ColorAtGray2BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_c .Gray ,error ){_faad :=y *bytesPerLine +x >>2;if _faad >=len (data ){return _c .Gray {},_dbe .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 );
|
|
};_gegg :=data [_faad ]>>uint (6-(x &3)*2)&3;if len (decode )==2{_gegg =uint8 (uint32 (LinearInterpolate (float64 (_gegg ),0,3.0,decode [0],decode [1]))&3);};return _c .Gray {Y :_gegg *85},nil ;};func InDelta (expected ,current ,delta float64 )bool {_deega :=expected -current ;
|
|
if _deega <=-delta ||_deega >=delta {return false ;};return true ;};func (_gdce *NRGBA16 )SetNRGBA (x ,y int ,c _c .NRGBA ){_agbd :=y *_gdce .BytesPerLine +x *3/2;if _agbd +1>=len (_gdce .Data ){return ;};c =_bbbf (c );_gdce .setNRGBA (x ,y ,_agbd ,c );
|
|
};func _eff (_fgg int )[]uint {var _fa []uint ;_eba :=_fgg ;_egfa :=_eba /8;if _egfa !=0{for _afg :=0;_afg < _egfa ;_afg ++{_fa =append (_fa ,8);};_cgc :=_eba %8;_eba =0;if _cgc !=0{_eba =_cgc ;};};_bbd :=_eba /4;if _bbd !=0{for _ebe :=0;_ebe < _bbd ;_ebe ++{_fa =append (_fa ,4);
|
|
};_dff :=_eba %4;_eba =0;if _dff !=0{_eba =_dff ;};};_edb :=_eba /2;if _edb !=0{for _beg :=0;_beg < _edb ;_beg ++{_fa =append (_fa ,2);};};return _fa ;};func _dbcbf (_dcab nrgba64 ,_gbfd RGBA ,_dbgf _g .Rectangle ){for _adefb :=0;_adefb < _dbgf .Max .X ;
|
|
_adefb ++{for _aedcc :=0;_aedcc < _dbgf .Max .Y ;_aedcc ++{_dgabe :=_dcab .NRGBA64At (_adefb ,_aedcc );_gbfd .SetRGBA (_adefb ,_aedcc ,_fggg (_dgabe ));};};};func IsPowerOf2 (n uint )bool {return n > 0&&(n &(n -1))==0};func (_acde *ImageBase )setByte (_agfa int ,_bbaa byte )error {if _agfa > len (_acde .Data )-1{return _d .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
};_acde .Data [_agfa ]=_bbaa ;return nil ;};func _cefff (_facc Gray ,_dddg RGBA ,_gfga _g .Rectangle ){for _fcce :=0;_fcce < _gfga .Max .X ;_fcce ++{for _afcfb :=0;_afcfb < _gfga .Max .Y ;_afcfb ++{_dacde :=_facc .GrayAt (_fcce ,_afcfb );_dddg .SetRGBA (_fcce ,_afcfb ,_cdb (_dacde ));
|
|
};};};func (_faaa *ImageBase )GetAlpha ()[]byte {return _faaa .Alpha };func (_defc *ImageBase )copy ()ImageBase {_dcd :=*_defc ;_dcd .Data =make ([]byte ,len (_defc .Data ));copy (_dcd .Data ,_defc .Data );return _dcd ;};func (_cbef *Gray8 )Histogram ()(_cdg [256]int ){for _bge :=0;
|
|
_bge < len (_cbef .Data );_bge ++{_cdg [_cbef .Data [_bge ]]++;};return _cdg ;};type Gray16 struct{ImageBase };func (_bbb *ImageBase )setEightPartlyBytes (_fdag ,_ebb int ,_bccfc uint64 )(_dcdd error ){var (_egdg byte ;_daafd int ;);for _aefe :=1;_aefe <=_ebb ;
|
|
_aefe ++{_daafd =64-_aefe *8;_egdg =byte (_bccfc >>uint (_daafd )&0xff);if _dcdd =_bbb .setByte (_fdag +_aefe -1,_egdg );_dcdd !=nil {return _dcdd ;};};_ffeb :=_bbb .BytesPerLine *8-_bbb .Width ;if _ffeb ==0{return nil ;};_daafd -=8;_egdg =byte (_bccfc >>uint (_daafd )&0xff)<<uint (_ffeb );
|
|
if _dcdd =_bbb .setByte (_fdag +_ebb ,_egdg );_dcdd !=nil {return _dcdd ;};return nil ;};type NRGBA interface{NRGBAAt (_ggcgd ,_dbdd int )_c .NRGBA ;SetNRGBA (_ccgf ,_edgc int ,_cdfd _c .NRGBA );};func _faggd (_dbfb _c .NYCbCrA )_c .RGBA {_afcc ,_def ,_cgd ,_bgb :=_eeae (_dbfb ).RGBA ();
|
|
return _c .RGBA {R :uint8 (_afcc >>8),G :uint8 (_def >>8),B :uint8 (_cgd >>8),A :uint8 (_bgb >>8)};};func _dgec (_fgad RGBA ,_cggg Gray ,_dfbf _g .Rectangle ){for _dbea :=0;_dbea < _dfbf .Max .X ;_dbea ++{for _ggcb :=0;_ggcb < _dfbf .Max .Y ;_ggcb ++{_cfbg :=_dgfg (_fgad .RGBAAt (_dbea ,_ggcb ));
|
|
_cggg .SetGray (_dbea ,_ggcb ,_cfbg );};};};func _ebega ()(_eaccc []byte ){_eaccc =make ([]byte ,256);for _bdd :=0;_bdd < 256;_bdd ++{_eef :=byte (_bdd );_eaccc [_eef ]=(_eef &0x01)|((_eef &0x04)>>1)|((_eef &0x10)>>2)|((_eef &0x40)>>3)|((_eef &0x02)<<3)|((_eef &0x08)<<2)|((_eef &0x20)<<1)|(_eef &0x80);
|
|
};return _eaccc ;};type monochromeModel uint8 ;func (_aeeb *Monochrome )ScaleLow (width ,height int )(*Monochrome ,error ){if width < 0||height < 0{return nil ,_d .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");
|
|
};_agbe :=_gdc (width ,height );_dgfbd :=make ([]int ,height );_gcca :=make ([]int ,width );_gad :=float64 (_aeeb .Width )/float64 (width );_bbe :=float64 (_aeeb .Height )/float64 (height );for _faf :=0;_faf < height ;_faf ++{_dgfbd [_faf ]=int (_fd .Min (_bbe *float64 (_faf )+0.5,float64 (_aeeb .Height -1)));
|
|
};for _cad :=0;_cad < width ;_cad ++{_gcca [_cad ]=int (_fd .Min (_gad *float64 (_cad )+0.5,float64 (_aeeb .Width -1)));};_bea :=-1;_gee :=byte (0);for _fffcd :=0;_fffcd < height ;_fffcd ++{_bcde :=_dgfbd [_fffcd ]*_aeeb .BytesPerLine ;_aebg :=_fffcd *_agbe .BytesPerLine ;
|
|
for _adcc :=0;_adcc < width ;_adcc ++{_gfbg :=_gcca [_adcc ];if _gfbg !=_bea {_gee =_aeeb .getBit (_bcde ,_gfbg );if _gee !=0{_agbe .setBit (_aebg ,_adcc );};_bea =_gfbg ;}else {if _gee !=0{_agbe .setBit (_aebg ,_adcc );};};};};return _agbe ,nil ;};func (_bacg *NRGBA16 )Base ()*ImageBase {return &_bacg .ImageBase };
|
|
var _ Image =&Gray4 {};func _cbe (_bggf _c .Gray )_c .NRGBA {return _c .NRGBA {R :_bggf .Y ,G :_bggf .Y ,B :_bggf .Y ,A :0xff}};func NextPowerOf2 (n uint )uint {if IsPowerOf2 (n ){return n ;};return 1<<(_ffcf (n )+1);};type Gray2 struct{ImageBase };func _efd (_afc _c .NRGBA )_c .Gray {var _bcd _c .NRGBA ;
|
|
if _afc ==_bcd {return _c .Gray {Y :0xff};};_dgg ,_bddag ,_abfd ,_ :=_afc .RGBA ();_aea :=(19595*_dgg +38470*_bddag +7471*_abfd +1<<15)>>24;return _c .Gray {Y :uint8 (_aea )};};func (_cfd *CMYK32 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtCMYK (x ,y ,_cfd .Width ,_cfd .Data ,_cfd .Decode );
|
|
};func _deba (_dccg *_g .Gray )bool {for _cdge :=0;_cdge < len (_dccg .Pix );_cdge ++{if !_cfdcb (_dccg .Pix [_cdge ]){return false ;};};return true ;};func (_eaebc *NRGBA32 )Copy ()Image {return &NRGBA32 {ImageBase :_eaebc .copy ()}};func (_agg *CMYK32 )Copy ()Image {return &CMYK32 {ImageBase :_agg .copy ()}};
|
|
func (_edea *Gray8 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtGray8BPC (x ,y ,_edea .BytesPerLine ,_edea .Data ,_edea .Decode );};func (_fce *RGBA32 )SetRGBA (x ,y int ,c _c .RGBA ){_fdbe :=y *_fce .Width +x ;_gceb :=3*_fdbe ;if _gceb +2>=len (_fce .Data ){return ;
|
|
};_fce .setRGBA (_fdbe ,c );};func (_edbgg *Gray4 )Set (x ,y int ,c _c .Color ){if x >=_edbgg .Width ||y >=_edbgg .Height {return ;};_bbgc :=Gray4Model .Convert (c ).(_c .Gray );_edbgg .setGray (x ,y ,_bbgc );};func NewImage (width ,height ,bitsPerComponent ,colorComponents int ,data ,alpha []byte ,decode []float64 )(Image ,error ){_ecdad :=NewImageBase (width ,height ,bitsPerComponent ,colorComponents ,data ,alpha ,decode );
|
|
var _cda Image ;switch colorComponents {case 1:switch bitsPerComponent {case 1:_cda =&Monochrome {ImageBase :_ecdad ,ModelThreshold :0x0f};case 2:_cda =&Gray2 {ImageBase :_ecdad };case 4:_cda =&Gray4 {ImageBase :_ecdad };case 8:_cda =&Gray8 {ImageBase :_ecdad };
|
|
case 16:_cda =&Gray16 {ImageBase :_ecdad };};case 3:switch bitsPerComponent {case 4:_cda =&NRGBA16 {ImageBase :_ecdad };case 8:_cda =&NRGBA32 {ImageBase :_ecdad };case 16:_cda =&NRGBA64 {ImageBase :_ecdad };};case 4:_cda =&CMYK32 {ImageBase :_ecdad };};
|
|
if _cda ==nil {return nil ,ErrInvalidImage ;};return _cda ,nil ;};func _geae (_fbc _c .CMYK )_c .NRGBA {_cff ,_dabg ,_fdf :=_c .CMYKToRGB (_fbc .C ,_fbc .M ,_fbc .Y ,_fbc .K );return _c .NRGBA {R :_cff ,G :_dabg ,B :_fdf ,A :0xff};};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 ,_dbe .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 (_cfdc *CMYK32 )CMYKAt (x ,y int )_c .CMYK {_cgb ,_ :=ColorAtCMYK (x ,y ,_cfdc .Width ,_cfdc .Data ,_cfdc .Decode );return _cgb ;};func (_gbaa *Gray2 )ColorModel ()_c .Model {return Gray2Model };func _ddbf (_ebd _g .Image )(Image ,error ){if _cfea ,_eccef :=_ebd .(*Gray4 );
|
|
_eccef {return _cfea .Copy (),nil ;};_gga :=_ebd .Bounds ();_bgbgc ,_cgae :=NewImage (_gga .Max .X ,_gga .Max .Y ,4,1,nil ,nil ,nil );if _cgae !=nil {return nil ,_cgae ;};_fea (_ebd ,_bgbgc ,_gga );return _bgbgc ,nil ;};func (_eeaec *Gray4 )GrayAt (x ,y int )_c .Gray {_bccf ,_ :=ColorAtGray4BPC (x ,y ,_eeaec .BytesPerLine ,_eeaec .Data ,_eeaec .Decode );
|
|
return _bccf ;};func (_fagb *Gray16 )Histogram ()(_geaa [256]int ){for _ecfc :=0;_ecfc < _fagb .Width ;_ecfc ++{for _egfg :=0;_egfg < _fagb .Height ;_egfg ++{_geaa [_fagb .GrayAt (_ecfc ,_egfg ).Y ]++;};};return _geaa ;};func _dgfg (_adgb _c .RGBA )_c .Gray {_afcb :=(19595*uint32 (_adgb .R )+38470*uint32 (_adgb .G )+7471*uint32 (_adgb .B )+1<<7)>>16;
|
|
return _c .Gray {Y :uint8 (_afcb )};};func (_bddd *Gray16 )SetGray (x ,y int ,g _c .Gray ){_gbfe :=(y *_bddd .BytesPerLine /2+x )*2;if _gbfe +1>=len (_bddd .Data ){return ;};_bddd .Data [_gbfe ]=g .Y ;_bddd .Data [_gbfe +1]=g .Y ;};func (_gfa *Monochrome )Base ()*ImageBase {return &_gfa .ImageBase };
|
|
func (_cfbb *Gray8 )ColorModel ()_c .Model {return _c .GrayModel };func (_ecg *Gray2 )Validate ()error {if len (_ecg .Data )!=_ecg .Height *_ecg .BytesPerLine {return ErrInvalidImage ;};return nil ;};func (_gffc *Monochrome )setIndexedBit (_eebc int ){_gffc .Data [(_eebc >>3)]|=0x80>>uint (_eebc &7)};
|
|
var _ Image =&Monochrome {};func _eca ()(_eecd [256]uint64 ){for _adf :=0;_adf < 256;_adf ++{if _adf &0x01!=0{_eecd [_adf ]|=0xff;};if _adf &0x02!=0{_eecd [_adf ]|=0xff00;};if _adf &0x04!=0{_eecd [_adf ]|=0xff0000;};if _adf &0x08!=0{_eecd [_adf ]|=0xff000000;
|
|
};if _adf &0x10!=0{_eecd [_adf ]|=0xff00000000;};if _adf &0x20!=0{_eecd [_adf ]|=0xff0000000000;};if _adf &0x40!=0{_eecd [_adf ]|=0xff000000000000;};if _adf &0x80!=0{_eecd [_adf ]|=0xff00000000000000;};};return _eecd ;};func _bac (_bbf _g .Image )(Image ,error ){if _eaa ,_dega :=_bbf .(*Gray16 );
|
|
_dega {return _eaa .Copy (),nil ;};_fgcb :=_bbf .Bounds ();_bebf ,_bcdg :=NewImage (_fgcb .Max .X ,_fgcb .Max .Y ,16,1,nil ,nil ,nil );if _bcdg !=nil {return nil ,_bcdg ;};_fea (_bbf ,_bebf ,_fgcb );return _bebf ,nil ;};func _abce (_gggc _c .Color )_c .Color {_acb :=_c .NRGBAModel .Convert (_gggc ).(_c .NRGBA );
|
|
return _bbbf (_acb );};func _bafc (_ebdb *Monochrome ,_ebeb ,_ebbe ,_fcfc ,_gccc int ,_fdbd RasterOperator ,_cacb *Monochrome ,_efec ,_fbad int )error {var (_eeaef byte ;_eeac int ;_bafe int ;_degg ,_bcfd int ;_dcae ,_ffdg int ;);_cggb :=_fcfc >>3;_edeea :=_fcfc &7;
|
|
if _edeea > 0{_eeaef =_fgea [_edeea ];};_eeac =_cacb .BytesPerLine *_fbad +(_efec >>3);_bafe =_ebdb .BytesPerLine *_ebbe +(_ebeb >>3);switch _fdbd {case PixSrc :for _dcae =0;_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;
|
|
for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]=_cacb .Data [_degg ];_bcfd ++;_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],_cacb .Data [_degg ],_eeaef );};};case PixNotSrc :for _dcae =0;_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;
|
|
_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]=^(_cacb .Data [_degg ]);_bcfd ++;_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],^_cacb .Data [_degg ],_eeaef );};};case PixSrcOrDst :for _dcae =0;
|
|
_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]|=_cacb .Data [_degg ];_bcfd ++;_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],_cacb .Data [_degg ]|_ebdb .Data [_bcfd ],_eeaef );
|
|
};};case PixSrcAndDst :for _dcae =0;_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]&=_cacb .Data [_degg ];_bcfd ++;_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],_cacb .Data [_degg ]&_ebdb .Data [_bcfd ],_eeaef );
|
|
};};case PixSrcXorDst :for _dcae =0;_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]^=_cacb .Data [_degg ];_bcfd ++;_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],_cacb .Data [_degg ]^_ebdb .Data [_bcfd ],_eeaef );
|
|
};};case PixNotSrcOrDst :for _dcae =0;_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]|=^(_cacb .Data [_degg ]);_bcfd ++;_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],^(_cacb .Data [_degg ])|_ebdb .Data [_bcfd ],_eeaef );
|
|
};};case PixNotSrcAndDst :for _dcae =0;_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]&=^(_cacb .Data [_degg ]);_bcfd ++;_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],^(_cacb .Data [_degg ])&_ebdb .Data [_bcfd ],_eeaef );
|
|
};};case PixSrcOrNotDst :for _dcae =0;_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]=_cacb .Data [_degg ]|^(_ebdb .Data [_bcfd ]);_bcfd ++;
|
|
_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],_cacb .Data [_degg ]|^(_ebdb .Data [_bcfd ]),_eeaef );};};case PixSrcAndNotDst :for _dcae =0;_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;
|
|
for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]=_cacb .Data [_degg ]&^(_ebdb .Data [_bcfd ]);_bcfd ++;_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],_cacb .Data [_degg ]&^(_ebdb .Data [_bcfd ]),_eeaef );};};case PixNotPixSrcOrDst :for _dcae =0;
|
|
_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]=^(_cacb .Data [_degg ]|_ebdb .Data [_bcfd ]);_bcfd ++;_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],^(_cacb .Data [_degg ]|_ebdb .Data [_bcfd ]),_eeaef );
|
|
};};case PixNotPixSrcAndDst :for _dcae =0;_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]=^(_cacb .Data [_degg ]&_ebdb .Data [_bcfd ]);
|
|
_bcfd ++;_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],^(_cacb .Data [_degg ]&_ebdb .Data [_bcfd ]),_eeaef );};};case PixNotPixSrcXorDst :for _dcae =0;_dcae < _gccc ;_dcae ++{_degg =_eeac +_dcae *_cacb .BytesPerLine ;_bcfd =_bafe +_dcae *_ebdb .BytesPerLine ;
|
|
for _ffdg =0;_ffdg < _cggb ;_ffdg ++{_ebdb .Data [_bcfd ]=^(_cacb .Data [_degg ]^_ebdb .Data [_bcfd ]);_bcfd ++;_degg ++;};if _edeea > 0{_ebdb .Data [_bcfd ]=_ecad (_ebdb .Data [_bcfd ],^(_cacb .Data [_degg ]^_ebdb .Data [_bcfd ]),_eeaef );};};default:_ca .Log .Debug ("\u0050\u0072ov\u0069\u0064\u0065d\u0020\u0069\u006e\u0076ali\u0064 r\u0061\u0073\u0074\u0065\u0072\u0020\u006fpe\u0072\u0061\u0074\u006f\u0072\u003a\u0020%\u0076",_fdbd );
|
|
return _d .New ("\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");};return nil ;};var _ NRGBA =&NRGBA16 {};func (_ada *Monochrome )getBitAt (_aace ,_eafd int )bool {_ead :=_eafd *_ada .BytesPerLine +(_aace >>3);
|
|
_bfac :=_aace &0x07;_eeg :=uint (7-_bfac );if _ead > len (_ada .Data )-1{return false ;};if (_ada .Data [_ead ]>>_eeg )&0x01>=1{return true ;};return false ;};var _ Gray =&Gray16 {};func (_gaa *CMYK32 )Base ()*ImageBase {return &_gaa .ImageBase };func (_ddff *Gray2 )At (x ,y int )_c .Color {_bggc ,_ :=_ddff .ColorAt (x ,y );
|
|
return _bggc };func ColorAtCMYK (x ,y ,width int ,data []byte ,decode []float64 )(_c .CMYK ,error ){_fec :=4*(y *width +x );if _fec +3>=len (data ){return _c .CMYK {},_dbe .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 [_fec ]&0xff;M :=data [_fec +1]&0xff;Y :=data [_fec +2]&0xff;K :=data [_fec +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 _gbcg (_bcf _c .Color )_c .Color {_aeebe :=_c .GrayModel .Convert (_bcf ).(_c .Gray );
|
|
return _bccg (_aeebe );};func (_bda *Gray2 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtGray2BPC (x ,y ,_bda .BytesPerLine ,_bda .Data ,_bda .Decode );};var _ _g .Image =&NRGBA32 {};func _eab (_agb _c .NRGBA )_c .Gray {_gag ,_affd ,_cbfc ,_ :=_agb .RGBA ();
|
|
_cae :=(19595*_gag +38470*_affd +7471*_cbfc +1<<15)>>24;return _c .Gray {Y :uint8 (_cae )};};func _egcf (_defg *Monochrome ,_bdfe ,_fde ,_dfbd ,_ccd int ,_cfef RasterOperator ){if _bdfe < 0{_dfbd +=_bdfe ;_bdfe =0;};_defb :=_bdfe +_dfbd -_defg .Width ;
|
|
if _defb > 0{_dfbd -=_defb ;};if _fde < 0{_ccd +=_fde ;_fde =0;};_dcfg :=_fde +_ccd -_defg .Height ;if _dcfg > 0{_ccd -=_dcfg ;};if _dfbd <=0||_ccd <=0{return ;};if (_bdfe &7)==0{_ddbg (_defg ,_bdfe ,_fde ,_dfbd ,_ccd ,_cfef );}else {_bdeab (_defg ,_bdfe ,_fde ,_dfbd ,_ccd ,_cfef );
|
|
};};func (_geff *ImageBase )HasAlpha ()bool {if _geff .Alpha ==nil {return false ;};for _gbdb :=range _geff .Alpha {if _geff .Alpha [_gbdb ]!=0xff{return true ;};};return false ;};func (_dgeg *ImageBase )setEightFullBytes (_dea int ,_faaf uint64 )error {if _dea +7> len (_dgeg .Data )-1{return _d .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
};_dgeg .Data [_dea ]=byte ((_faaf &0xff00000000000000)>>56);_dgeg .Data [_dea +1]=byte ((_faaf &0xff000000000000)>>48);_dgeg .Data [_dea +2]=byte ((_faaf &0xff0000000000)>>40);_dgeg .Data [_dea +3]=byte ((_faaf &0xff00000000)>>32);_dgeg .Data [_dea +4]=byte ((_faaf &0xff000000)>>24);
|
|
_dgeg .Data [_dea +5]=byte ((_faaf &0xff0000)>>16);_dgeg .Data [_dea +6]=byte ((_faaf &0xff00)>>8);_dgeg .Data [_dea +7]=byte (_faaf &0xff);return nil ;};func (_bdebd *Monochrome )IsUnpadded ()bool {return (_bdebd .Width *_bdebd .Height )==len (_bdebd .Data );
|
|
};func _bebc (_acab _g .Image )(Image ,error ){if _baaa ,_fcdd :=_acab .(*NRGBA32 );_fcdd {return _baaa .Copy (),nil ;};_fbg ,_beef ,_ded :=_dcgg (_acab ,1);_cfaf ,_ebfg :=NewImage (_fbg .Max .X ,_fbg .Max .Y ,8,3,nil ,_ded ,nil );if _ebfg !=nil {return nil ,_ebfg ;
|
|
};_edfg (_acab ,_cfaf ,_fbg );if len (_ded )!=0&&!_beef {if _aacee :=_geffb (_ded ,_cfaf );_aacee !=nil {return nil ,_aacee ;};};return _cfaf ,nil ;};func (_fddf *Monochrome )Set (x ,y int ,c _c .Color ){_ggd :=y *_fddf .BytesPerLine +x >>3;if _ggd > len (_fddf .Data )-1{return ;
|
|
};_gbc :=_fddf .ColorModel ().Convert (c ).(_c .Gray );_fddf .setGray (x ,_gbc ,_ggd );};var _ _g .Image =&Gray16 {};func _cfdcb (_gggd uint8 )bool {if _gggd ==0||_gggd ==255{return true ;};return false ;};func (_becd *Gray8 )Copy ()Image {return &Gray8 {ImageBase :_becd .copy ()}};
|
|
func (_aggc *CMYK32 )Bounds ()_g .Rectangle {return _g .Rectangle {Max :_g .Point {X :_aggc .Width ,Y :_aggc .Height }};};type monochromeThresholdConverter struct{Threshold uint8 ;};func _cce (_cbb ,_fbfa CMYK ,_aca _g .Rectangle ){for _abdc :=0;_abdc < _aca .Max .X ;
|
|
_abdc ++{for _bgdb :=0;_bgdb < _aca .Max .Y ;_bgdb ++{_fbfa .SetCMYK (_abdc ,_bgdb ,_cbb .CMYKAt (_abdc ,_bgdb ));};};};var _ Image =&NRGBA32 {};func (_age *Monochrome )copy ()*Monochrome {_aggd :=_gdc (_age .Width ,_age .Height );_aggd .ModelThreshold =_age .ModelThreshold ;
|
|
_aggd .Data =make ([]byte ,len (_age .Data ));copy (_aggd .Data ,_age .Data );if len (_age .Decode )!=0{_aggd .Decode =make ([]float64 ,len (_age .Decode ));copy (_aggd .Decode ,_age .Decode );};if len (_age .Alpha )!=0{_aggd .Alpha =make ([]byte ,len (_age .Alpha ));
|
|
copy (_aggd .Alpha ,_age .Alpha );};return _aggd ;};func ColorAtGray16BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_c .Gray16 ,error ){_fbee :=(y *bytesPerLine /2+x )*2;if _fbee +1>=len (data ){return _c .Gray16 {},_dbe .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 );
|
|
};_gddd :=uint16 (data [_fbee ])<<8|uint16 (data [_fbee +1]);if len (decode )==2{_gddd =uint16 (uint64 (LinearInterpolate (float64 (_gddd ),0,65535,decode [0],decode [1])));};return _c .Gray16 {Y :_gddd },nil ;};var _ Image =&RGBA32 {};func (_fdac *NRGBA16 )Set (x ,y int ,c _c .Color ){_feac :=y *_fdac .BytesPerLine +x *3/2;
|
|
if _feac +1>=len (_fdac .Data ){return ;};_fedb :=NRGBA16Model .Convert (c ).(_c .NRGBA );_fdac .setNRGBA (x ,y ,_feac ,_fedb );};func _fadb (_bbgf _c .NRGBA )_c .CMYK {_gace ,_ggcc ,_fdge ,_ :=_bbgf .RGBA ();_fbfc ,_bfcd ,_afge ,_fgga :=_c .RGBToCMYK (uint8 (_gace >>8),uint8 (_ggcc >>8),uint8 (_fdge >>8));
|
|
return _c .CMYK {C :_fbfc ,M :_bfcd ,Y :_afge ,K :_fgga };};func _ab (_gac ,_ec *Monochrome )(_adg error ){_fe :=_ec .BytesPerLine ;_ae :=_gac .BytesPerLine ;_abc :=_ec .BytesPerLine *4-_gac .BytesPerLine ;var (_afe ,_gd byte ;_aa uint32 ;_abcf ,_ag ,_da ,_aef ,_cc ,_bgf ,_cb int ;
|
|
);for _da =0;_da < _ec .Height ;_da ++{_abcf =_da *_fe ;_ag =4*_da *_ae ;for _aef =0;_aef < _fe ;_aef ++{_afe =_ec .Data [_abcf +_aef ];_aa =_aed [_afe ];_bgf =_ag +_aef *4;if _abc !=0&&(_aef +1)*4> _gac .BytesPerLine {for _cc =_abc ;_cc > 0;_cc --{_gd =byte ((_aa >>uint (_cc *8))&0xff);
|
|
_cb =_bgf +(_abc -_cc );if _adg =_gac .setByte (_cb ,_gd );_adg !=nil {return _adg ;};};}else if _adg =_gac .setFourBytes (_bgf ,_aa );_adg !=nil {return _adg ;};if _adg =_gac .setFourBytes (_ag +_aef *4,_aed [_ec .Data [_abcf +_aef ]]);_adg !=nil {return _adg ;
|
|
};};for _cc =1;_cc < 4;_cc ++{for _aef =0;_aef < _ae ;_aef ++{if _adg =_gac .setByte (_ag +_cc *_ae +_aef ,_gac .Data [_ag +_aef ]);_adg !=nil {return _adg ;};};};};return nil ;};func (_cfgcc *NRGBA32 )SetNRGBA (x ,y int ,c _c .NRGBA ){_gege :=y *_cfgcc .Width +x ;
|
|
_affab :=3*_gege ;if _affab +2>=len (_cfgcc .Data ){return ;};_cfgcc .setRGBA (_gege ,c );};func _geffb (_abbg []byte ,_agec Image )error {_fcgd :=true ;for _bfeb :=0;_bfeb < len (_abbg );_bfeb ++{if _abbg [_bfeb ]!=0xff{_fcgd =false ;break ;};};if _fcgd {switch _ecfa :=_agec .(type ){case *NRGBA32 :_ecfa .Alpha =nil ;
|
|
case *NRGBA64 :_ecfa .Alpha =nil ;default:return _dbe .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",_agec );
|
|
};};return nil ;};func ColorAtGray4BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_c .Gray ,error ){_beag :=y *bytesPerLine +x >>1;if _beag >=len (data ){return _c .Gray {},_dbe .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 );
|
|
};_gfgf :=data [_beag ]>>uint (4-(x &1)*4)&0xf;if len (decode )==2{_gfgf =uint8 (uint32 (LinearInterpolate (float64 (_gfgf ),0,15,decode [0],decode [1]))&0xf);};return _c .Gray {Y :_gfgf *17&0xff},nil ;};func ColorAtNRGBA16 (x ,y ,width ,bytesPerLine int ,data ,alpha []byte ,decode []float64 )(_c .NRGBA ,error ){_bfegda :=y *bytesPerLine +x *3/2;
|
|
if _bfegda +1>=len (data ){return _c .NRGBA {},_egea (x ,y );};const (_cge =0xf;_caef =uint8 (0xff););_gcae :=_caef ;if alpha !=nil {_cddg :=y *BytesPerLine (width ,4,1);if _cddg < len (alpha ){if x %2==0{_gcae =(alpha [_cddg ]>>uint (4))&_cge ;}else {_gcae =alpha [_cddg ]&_cge ;
|
|
};_gcae |=_gcae <<4;};};var _geca ,_dcce ,_cefg uint8 ;if x *3%2==0{_geca =(data [_bfegda ]>>uint (4))&_cge ;_dcce =data [_bfegda ]&_cge ;_cefg =(data [_bfegda +1]>>uint (4))&_cge ;}else {_geca =data [_bfegda ]&_cge ;_dcce =(data [_bfegda +1]>>uint (4))&_cge ;
|
|
_cefg =data [_bfegda +1]&_cge ;};if len (decode )==6{_geca =uint8 (uint32 (LinearInterpolate (float64 (_geca ),0,15,decode [0],decode [1]))&0xf);_dcce =uint8 (uint32 (LinearInterpolate (float64 (_dcce ),0,15,decode [2],decode [3]))&0xf);_cefg =uint8 (uint32 (LinearInterpolate (float64 (_cefg ),0,15,decode [4],decode [5]))&0xf);
|
|
};return _c .NRGBA {R :(_geca <<4)|(_geca &0xf),G :(_dcce <<4)|(_dcce &0xf),B :(_cefg <<4)|(_cefg &0xf),A :_gcae },nil ;};func NewImageBase (width int ,height int ,bitsPerComponent int ,colorComponents int ,data []byte ,alpha []byte ,decode []float64 )ImageBase {_fbea :=ImageBase {Width :width ,Height :height ,BitsPerComponent :bitsPerComponent ,ColorComponents :colorComponents ,Data :data ,Alpha :alpha ,Decode :decode ,BytesPerLine :BytesPerLine (width ,bitsPerComponent ,colorComponents )};
|
|
if data ==nil {_fbea .Data =make ([]byte ,height *_fbea .BytesPerLine );};return _fbea ;};func (_gaad *Gray2 )SetGray (x ,y int ,gray _c .Gray ){_efae :=_ggcg (gray );_cgced :=y *_gaad .BytesPerLine ;_dbce :=_cgced +(x >>2);if _dbce >=len (_gaad .Data ){return ;
|
|
};_aab :=_efae .Y >>6;_gaad .Data [_dbce ]=(_gaad .Data [_dbce ]&(^(0xc0>>uint (2*((x )&3)))))|(_aab <<uint (6-2*(x &3)));};func (_gffcf *NRGBA16 )Copy ()Image {return &NRGBA16 {ImageBase :_gffcf .copy ()}};func _cfeaa (_gbfb CMYK ,_facf NRGBA ,_agga _g .Rectangle ){for _ffgc :=0;
|
|
_ffgc < _agga .Max .X ;_ffgc ++{for _gddde :=0;_gddde < _agga .Max .Y ;_gddde ++{_aeef :=_gbfb .CMYKAt (_ffgc ,_gddde );_facf .SetNRGBA (_ffgc ,_gddde ,_geae (_aeef ));};};};func (_aeac *Gray8 )Set (x ,y int ,c _c .Color ){_fbdb :=y *_aeac .BytesPerLine +x ;
|
|
if _fbdb > len (_aeac .Data )-1{return ;};_eafb :=_c .GrayModel .Convert (c );_aeac .Data [_fbdb ]=_eafb .(_c .Gray ).Y ;};func (_eed *CMYK32 )SetCMYK (x ,y int ,c _c .CMYK ){_fddg :=4*(y *_eed .Width +x );if _fddg +3>=len (_eed .Data ){return ;};_eed .Data [_fddg ]=c .C ;
|
|
_eed .Data [_fddg +1]=c .M ;_eed .Data [_fddg +2]=c .Y ;_eed .Data [_fddg +3]=c .K ;};func LinearInterpolate (x ,xmin ,xmax ,ymin ,ymax float64 )float64 {if _fd .Abs (xmax -xmin )< 0.000001{return ymin ;};_ddaa :=ymin +(x -xmin )*(ymax -ymin )/(xmax -xmin );
|
|
return _ddaa ;};func (_cabc *Gray4 )Validate ()error {if len (_cabc .Data )!=_cabc .Height *_cabc .BytesPerLine {return ErrInvalidImage ;};return nil ;};type ColorConverter interface{Convert (_agfg _g .Image )(Image ,error );};func (_fdfff *RGBA32 )ColorModel ()_c .Model {return _c .NRGBAModel };
|
|
var (_eac =_gg ();_aed =_bdba ();_egf =_eca (););var _ _g .Image =&Gray4 {};func _eccd (_ccbd *_g .NYCbCrA ,_cfbf NRGBA ,_dcgcc _g .Rectangle ){for _afcg :=0;_afcg < _dcgcc .Max .X ;_afcg ++{for _eecb :=0;_eecb < _dcgcc .Max .Y ;_eecb ++{_ebge :=_ccbd .NYCbCrAAt (_afcg ,_eecb );
|
|
_cfbf .SetNRGBA (_afcg ,_eecb ,_eeae (_ebge ));};};};func (_dfg *Monochrome )InverseData ()error {return _dfg .RasterOperation (0,0,_dfg .Width ,_dfg .Height ,PixNotDst ,nil ,0,0);};var (Gray2Model =_c .ModelFunc (_gfad );Gray4Model =_c .ModelFunc (_gbcg );
|
|
NRGBA16Model =_c .ModelFunc (_abce ););func _deef (_ccba _c .CMYK )_c .RGBA {_gddg ,_gbe ,_effg :=_c .CMYKToRGB (_ccba .C ,_ccba .M ,_ccba .Y ,_ccba .K );return _c .RGBA {R :_gddg ,G :_gbe ,B :_effg ,A :0xff};};func (_badg *NRGBA16 )ColorModel ()_c .Model {return NRGBA16Model };
|
|
func (_fdfg *Gray2 )Set (x ,y int ,c _c .Color ){if x >=_fdfg .Width ||y >=_fdfg .Height {return ;};_fcca :=Gray2Model .Convert (c ).(_c .Gray );_dege :=y *_fdfg .BytesPerLine ;_eagc :=_dege +(x >>2);_efag :=_fcca .Y >>6;_fdfg .Data [_eagc ]=(_fdfg .Data [_eagc ]&(^(0xc0>>uint (2*((x )&3)))))|(_efag <<uint (6-2*(x &3)));
|
|
};func (_fgbd *Gray4 )Bounds ()_g .Rectangle {return _g .Rectangle {Max :_g .Point {X :_fgbd .Width ,Y :_fgbd .Height }};};func _gfad (_eegf _c .Color )_c .Color {_cea :=_c .GrayModel .Convert (_eegf ).(_c .Gray );return _ggcg (_cea );};func (_affdf *NRGBA64 )SetNRGBA64 (x ,y int ,c _c .NRGBA64 ){_ggca :=(y *_affdf .Width +x )*2;
|
|
_ggabf :=_ggca *3;if _ggabf +5>=len (_affdf .Data ){return ;};_affdf .setNRGBA64 (_ggabf ,c ,_ggca );};func (_fefga *Gray8 )At (x ,y int )_c .Color {_bagg ,_ :=_fefga .ColorAt (x ,y );return _bagg };func _gc (_fba *Monochrome ,_b int )(*Monochrome ,error ){if _fba ==nil {return nil ,_d .New ("\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _b ==1{return _fba .copy (),nil ;};if !IsPowerOf2 (uint (_b )){return nil ,_dbe .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",_b );
|
|
};_ga :=_eff (_b );return _af (_fba ,_b ,_ga );};func (_ffc colorConverter )Convert (src _g .Image )(Image ,error ){return _ffc ._cgg (src )};type Monochrome struct{ImageBase ;ModelThreshold uint8 ;};var _ Image =&NRGBA16 {};func (_dgfe *RGBA32 )Copy ()Image {return &RGBA32 {ImageBase :_dgfe .copy ()}};
|
|
func (_bdef *RGBA32 )setRGBA (_bccag int ,_gdbd _c .RGBA ){_gfae :=3*_bccag ;_bdef .Data [_gfae ]=_gdbd .R ;_bdef .Data [_gfae +1]=_gdbd .G ;_bdef .Data [_gfae +2]=_gdbd .B ;if _bccag < len (_bdef .Alpha ){_bdef .Alpha [_bccag ]=_gdbd .A ;};};func (_dcgc *NRGBA32 )setRGBA (_eege int ,_dgged _c .NRGBA ){_cbc :=3*_eege ;
|
|
_dcgc .Data [_cbc ]=_dgged .R ;_dcgc .Data [_cbc +1]=_dgged .G ;_dcgc .Data [_cbc +2]=_dgged .B ;if _eege < len (_dcgc .Alpha ){_dcgc .Alpha [_eege ]=_dgged .A ;};};func (_dcb *CMYK32 )ColorModel ()_c .Model {return _c .CMYKModel };func (_eedb *Monochrome )ColorModel ()_c .Model {return MonochromeModel (_eedb .ModelThreshold )};
|
|
func _adfg (_fefg _c .CMYK )_c .Gray {_fgaf ,_efa ,_dadd :=_c .CMYKToRGB (_fefg .C ,_fefg .M ,_fefg .Y ,_fefg .K );_cfc :=(19595*uint32 (_fgaf )+38470*uint32 (_efa )+7471*uint32 (_dadd )+1<<7)>>16;return _c .Gray {Y :uint8 (_cfc )};};func _acca (_gagb *Monochrome ,_ggdf ,_egdf ,_dfdf ,_ffge int ,_cadb RasterOperator ,_bfegd *Monochrome ,_caae ,_ebaa int )error {var (_fed bool ;
|
|
_gefe bool ;_edeb byte ;_caec int ;_dcaca int ;_fdgda int ;_bad int ;_cada bool ;_edgf int ;_dagg int ;_ddbd int ;_cdcd bool ;_accf byte ;_abfb int ;_affde int ;_edbe int ;_fedc byte ;_egfab int ;_bfag int ;_caeg uint ;_ddd uint ;_agd byte ;_geeg shift ;
|
|
_bcgg bool ;_edggb bool ;_cadf ,_cgggg int ;);if _caae &7!=0{_bfag =8-(_caae &7);};if _ggdf &7!=0{_dcaca =8-(_ggdf &7);};if _bfag ==0&&_dcaca ==0{_agd =_agfge [0];}else {if _dcaca > _bfag {_caeg =uint (_dcaca -_bfag );}else {_caeg =uint (8-(_bfag -_dcaca ));
|
|
};_ddd =8-_caeg ;_agd =_agfge [_caeg ];};if (_ggdf &7)!=0{_fed =true ;_caec =8-(_ggdf &7);_edeb =_agfge [_caec ];_fdgda =_gagb .BytesPerLine *_egdf +(_ggdf >>3);_bad =_bfegd .BytesPerLine *_ebaa +(_caae >>3);_egfab =8-(_caae &7);if _caec > _egfab {_geeg =_edff ;
|
|
if _dfdf >=_bfag {_bcgg =true ;};}else {_geeg =_edbf ;};};if _dfdf < _caec {_gefe =true ;_edeb &=_fgea [8-_caec +_dfdf ];};if !_gefe {_edgf =(_dfdf -_caec )>>3;if _edgf !=0{_cada =true ;_dagg =_gagb .BytesPerLine *_egdf +((_ggdf +_dcaca )>>3);_ddbd =_bfegd .BytesPerLine *_ebaa +((_caae +_dcaca )>>3);
|
|
};};_abfb =(_ggdf +_dfdf )&7;if !(_gefe ||_abfb ==0){_cdcd =true ;_accf =_fgea [_abfb ];_affde =_gagb .BytesPerLine *_egdf +((_ggdf +_dcaca )>>3)+_edgf ;_edbe =_bfegd .BytesPerLine *_ebaa +((_caae +_dcaca )>>3)+_edgf ;if _abfb > int (_ddd ){_edggb =true ;
|
|
};};switch _cadb {case PixSrc :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );};}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],_fedc ,_edeb );
|
|
_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );_gagb .Data [_dagg +_cgggg ]=_fedc ;
|
|
};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;};};if _cdcd {for _cadf =0;_cadf < _ffge ;_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],_fedc ,_accf );
|
|
_affde +=_gagb .BytesPerLine ;_edbe +=_bfegd .BytesPerLine ;};};case PixNotSrc :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );};}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;
|
|
};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],^_fedc ,_edeb );_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );
|
|
_gagb .Data [_dagg +_cgggg ]=^_fedc ;};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;};};if _cdcd {for _cadf =0;_cadf < _ffge ;_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );
|
|
};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],^_fedc ,_accf );_affde +=_gagb .BytesPerLine ;_edbe +=_bfegd .BytesPerLine ;};};case PixSrcOrDst :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );
|
|
};}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],_fedc |_gagb .Data [_fdgda ],_edeb );_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;
|
|
_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );_gagb .Data [_dagg +_cgggg ]|=_fedc ;};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;};};if _cdcd {for _cadf =0;_cadf < _ffge ;
|
|
_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],_fedc |_gagb .Data [_affde ],_accf );_affde +=_gagb .BytesPerLine ;_edbe +=_bfegd .BytesPerLine ;
|
|
};};case PixSrcAndDst :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );};}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],_fedc &_gagb .Data [_fdgda ],_edeb );
|
|
_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );_gagb .Data [_dagg +_cgggg ]&=_fedc ;
|
|
};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;};};if _cdcd {for _cadf =0;_cadf < _ffge ;_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],_fedc &_gagb .Data [_affde ],_accf );
|
|
_affde +=_gagb .BytesPerLine ;_edbe +=_bfegd .BytesPerLine ;};};case PixSrcXorDst :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );};
|
|
}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],_fedc ^_gagb .Data [_fdgda ],_edeb );_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;
|
|
_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );_gagb .Data [_dagg +_cgggg ]^=_fedc ;};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;};};if _cdcd {for _cadf =0;_cadf < _ffge ;
|
|
_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],_fedc ^_gagb .Data [_affde ],_accf );_affde +=_gagb .BytesPerLine ;_edbe +=_bfegd .BytesPerLine ;
|
|
};};case PixNotSrcOrDst :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );};}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],^_fedc |_gagb .Data [_fdgda ],_edeb );
|
|
_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );_gagb .Data [_dagg +_cgggg ]|=^_fedc ;
|
|
};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;};};if _cdcd {for _cadf =0;_cadf < _ffge ;_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],^_fedc |_gagb .Data [_affde ],_accf );
|
|
_affde +=_gagb .BytesPerLine ;_edbe +=_bfegd .BytesPerLine ;};};case PixNotSrcAndDst :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );
|
|
};}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],^_fedc &_gagb .Data [_fdgda ],_edeb );_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;
|
|
_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );_gagb .Data [_dagg +_cgggg ]&=^_fedc ;};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;};};if _cdcd {for _cadf =0;_cadf < _ffge ;
|
|
_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],^_fedc &_gagb .Data [_affde ],_accf );_affde +=_gagb .BytesPerLine ;_edbe +=_bfegd .BytesPerLine ;
|
|
};};case PixSrcOrNotDst :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );};}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],_fedc |^_gagb .Data [_fdgda ],_edeb );
|
|
_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );_gagb .Data [_dagg +_cgggg ]=_fedc |^_gagb .Data [_dagg +_cgggg ];
|
|
};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;};};if _cdcd {for _cadf =0;_cadf < _ffge ;_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],_fedc |^_gagb .Data [_affde ],_accf );
|
|
_affde +=_gagb .BytesPerLine ;_edbe +=_bfegd .BytesPerLine ;};};case PixSrcAndNotDst :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );
|
|
};}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],_fedc &^_gagb .Data [_fdgda ],_edeb );_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;
|
|
_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );_gagb .Data [_dagg +_cgggg ]=_fedc &^_gagb .Data [_dagg +_cgggg ];};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;};
|
|
};if _cdcd {for _cadf =0;_cadf < _ffge ;_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],_fedc &^_gagb .Data [_affde ],_accf );_affde +=_gagb .BytesPerLine ;
|
|
_edbe +=_bfegd .BytesPerLine ;};};case PixNotPixSrcOrDst :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );};}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;
|
|
};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],^(_fedc |_gagb .Data [_fdgda ]),_edeb );_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );
|
|
_gagb .Data [_dagg +_cgggg ]=^(_fedc |_gagb .Data [_dagg +_cgggg ]);};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;};};if _cdcd {for _cadf =0;_cadf < _ffge ;_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );
|
|
};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],^(_fedc |_gagb .Data [_affde ]),_accf );_affde +=_gagb .BytesPerLine ;_edbe +=_bfegd .BytesPerLine ;};};case PixNotPixSrcAndDst :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;
|
|
if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );};}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],^(_fedc &_gagb .Data [_fdgda ]),_edeb );_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;
|
|
};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );_gagb .Data [_dagg +_cgggg ]=^(_fedc &_gagb .Data [_dagg +_cgggg ]);
|
|
};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;};};if _cdcd {for _cadf =0;_cadf < _ffge ;_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],^(_fedc &_gagb .Data [_affde ]),_accf );
|
|
_affde +=_gagb .BytesPerLine ;_edbe +=_bfegd .BytesPerLine ;};};case PixNotPixSrcXorDst :if _fed {for _cadf =0;_cadf < _ffge ;_cadf ++{if _geeg ==_edff {_fedc =_bfegd .Data [_bad ]<<_caeg ;if _bcgg {_fedc =_ecad (_fedc ,_bfegd .Data [_bad +1]>>_ddd ,_agd );
|
|
};}else {_fedc =_bfegd .Data [_bad ]>>_ddd ;};_gagb .Data [_fdgda ]=_ecad (_gagb .Data [_fdgda ],^(_fedc ^_gagb .Data [_fdgda ]),_edeb );_fdgda +=_gagb .BytesPerLine ;_bad +=_bfegd .BytesPerLine ;};};if _cada {for _cadf =0;_cadf < _ffge ;_cadf ++{for _cgggg =0;
|
|
_cgggg < _edgf ;_cgggg ++{_fedc =_ecad (_bfegd .Data [_ddbd +_cgggg ]<<_caeg ,_bfegd .Data [_ddbd +_cgggg +1]>>_ddd ,_agd );_gagb .Data [_dagg +_cgggg ]=^(_fedc ^_gagb .Data [_dagg +_cgggg ]);};_dagg +=_gagb .BytesPerLine ;_ddbd +=_bfegd .BytesPerLine ;
|
|
};};if _cdcd {for _cadf =0;_cadf < _ffge ;_cadf ++{_fedc =_bfegd .Data [_edbe ]<<_caeg ;if _edggb {_fedc =_ecad (_fedc ,_bfegd .Data [_edbe +1]>>_ddd ,_agd );};_gagb .Data [_affde ]=_ecad (_gagb .Data [_affde ],^(_fedc ^_gagb .Data [_affde ]),_accf );_affde +=_gagb .BytesPerLine ;
|
|
_edbe +=_bfegd .BytesPerLine ;};};default:_ca .Log .Debug ("\u004f\u0070e\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006e\u006f\u0074\u0020\u0070\u0065\u0072\u006d\u0069tt\u0065\u0064",_cadb );return _d .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 _fege (_bcec _g .Image )(Image ,error ){if _gbeg ,_dbca :=_bcec .(*NRGBA64 );_dbca {return _gbeg .Copy (),nil ;};_cegbf ,_cfeg ,_efac :=_dcgg (_bcec ,2);_gagc ,_ffece :=NewImage (_cegbf .Max .X ,_cegbf .Max .Y ,16,3,nil ,_efac ,nil );
|
|
if _ffece !=nil {return nil ,_ffece ;};_fgda (_bcec ,_gagc ,_cegbf );if len (_efac )!=0&&!_cfeg {if _gaac :=_geffb (_efac ,_gagc );_gaac !=nil {return nil ,_gaac ;};};return _gagc ,nil ;};func (_eade *Gray2 )Histogram ()(_fcb [256]int ){for _aebd :=0;_aebd < _eade .Width ;
|
|
_aebd ++{for _cbg :=0;_cbg < _eade .Height ;_cbg ++{_fcb [_eade .GrayAt (_aebd ,_cbg ).Y ]++;};};return _fcb ;};func _cbaag (_aaab *_g .Gray ,_cgbe uint8 )*_g .Gray {_fafb :=_aaab .Bounds ();_gbfee :=_g .NewGray (_fafb );for _cffc :=0;_cffc < _fafb .Dx ();
|
|
_cffc ++{for _fabf :=0;_fabf < _fafb .Dy ();_fabf ++{_dadf :=_aaab .GrayAt (_cffc ,_fabf );_gbfee .SetGray (_cffc ,_fabf ,_c .Gray {Y :_cdgc (_dadf .Y ,_cgbe )});};};return _gbfee ;};func (_ege *Monochrome )Validate ()error {if len (_ege .Data )!=_ege .Height *_ege .BytesPerLine {return ErrInvalidImage ;
|
|
};return nil ;};func _dab (_bfg ,_ea *Monochrome )(_gcd error ){_bfe :=_ea .BytesPerLine ;_bc :=_bfg .BytesPerLine ;var _fcdb ,_fcdbg ,_gfg ,_efc ,_gbb int ;for _gfg =0;_gfg < _ea .Height ;_gfg ++{_fcdb =_gfg *_bfe ;_fcdbg =8*_gfg *_bc ;for _efc =0;_efc < _bfe ;
|
|
_efc ++{if _gcd =_bfg .setEightBytes (_fcdbg +_efc *8,_egf [_ea .Data [_fcdb +_efc ]]);_gcd !=nil {return _gcd ;};};for _gbb =1;_gbb < 8;_gbb ++{for _efc =0;_efc < _bc ;_efc ++{if _gcd =_bfg .setByte (_fcdbg +_gbb *_bc +_efc ,_bfg .Data [_fcdbg +_efc ]);
|
|
_gcd !=nil {return _gcd ;};};};};return nil ;};func RasterOperation (dest *Monochrome ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Monochrome ,sx ,sy int )error {return _dbee (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func (_daaed *ImageBase )Pix ()[]byte {return _daaed .Data };
|
|
func MonochromeModel (threshold uint8 )_c .Model {return monochromeModel (threshold )};func (_fgae *Gray16 )Validate ()error {if len (_fgae .Data )!=_fgae .Height *_fgae .BytesPerLine {return ErrInvalidImage ;};return nil ;};func _af (_dbd *Monochrome ,_gf int ,_cag []uint )(*Monochrome ,error ){_ed :=_gf *_dbd .Width ;
|
|
_adb :=_gf *_dbd .Height ;_ef :=_gdc (_ed ,_adb );for _gcf ,_eb :=range _cag {var _fg error ;switch _eb {case 2:_fg =_de (_ef ,_dbd );case 4:_fg =_ab (_ef ,_dbd );case 8:_fg =_dab (_ef ,_dbd );};if _fg !=nil {return nil ,_fg ;};if _gcf !=len (_cag )-1{_dbd =_ef .copy ();
|
|
};};return _ef ,nil ;};var _ Gray =&Gray4 {};func _afbf (_bdfaf ,_aadb RGBA ,_ccc _g .Rectangle ){for _dbge :=0;_dbge < _ccc .Max .X ;_dbge ++{for _ecff :=0;_ecff < _ccc .Max .Y ;_ecff ++{_aadb .SetRGBA (_dbge ,_ecff ,_bdfaf .RGBAAt (_dbge ,_ecff ));};
|
|
};};var (MonochromeConverter =ConverterFunc (_fccc );Gray2Converter =ConverterFunc (_decg );Gray4Converter =ConverterFunc (_ddbf );GrayConverter =ConverterFunc (_cbgd );Gray16Converter =ConverterFunc (_bac );NRGBA16Converter =ConverterFunc (_bdab );NRGBAConverter =ConverterFunc (_bebc );
|
|
NRGBA64Converter =ConverterFunc (_fege );RGBAConverter =ConverterFunc (_fecd );CMYKConverter =ConverterFunc (_fddb ););func (_abfae *NRGBA64 )At (x ,y int )_c .Color {_eaae ,_ :=_abfae .ColorAt (x ,y );return _eaae };var _ _g .Image =&RGBA32 {};func (_cadad *NRGBA32 )Base ()*ImageBase {return &_cadad .ImageBase };
|
|
func _de (_bf ,_ffd *Monochrome )(_gb error ){_ee :=_ffd .BytesPerLine ;_bd :=_bf .BytesPerLine ;var (_bg byte ;_df uint16 ;_fgb ,_bb ,_fc ,_bdb ,_fcd int ;);for _fc =0;_fc < _ffd .Height ;_fc ++{_fgb =_fc *_ee ;_bb =2*_fc *_bd ;for _bdb =0;_bdb < _ee ;
|
|
_bdb ++{_bg =_ffd .Data [_fgb +_bdb ];_df =_eac [_bg ];_fcd =_bb +_bdb *2;if _bf .BytesPerLine !=_ffd .BytesPerLine *2&&(_bdb +1)*2> _bf .BytesPerLine {_gb =_bf .setByte (_fcd ,byte (_df >>8));}else {_gb =_bf .setTwoBytes (_fcd ,_df );};if _gb !=nil {return _gb ;
|
|
};};for _bdb =0;_bdb < _bd ;_bdb ++{_fcd =_bb +_bd +_bdb ;_bg =_bf .Data [_bb +_bdb ];if _gb =_bf .setByte (_fcd ,_bg );_gb !=nil {return _gb ;};};};return nil ;};type nrgba64 interface{NRGBA64At (_gacbc ,_gacf int )_c .NRGBA64 ;SetNRGBA64 (_cbaa ,_bffc int ,_ecgb _c .NRGBA64 );
|
|
};type ImageBase struct{Width ,Height int ;BitsPerComponent ,ColorComponents int ;Data ,Alpha []byte ;Decode []float64 ;BytesPerLine int ;};func _ccgga (_begd *_g .Gray16 ,_fcab uint8 )*_g .Gray {_ceec :=_begd .Bounds ();_fcef :=_g .NewGray (_ceec );for _cdaf :=0;
|
|
_cdaf < _ceec .Dx ();_cdaf ++{for _addc :=0;_addc < _ceec .Dy ();_addc ++{_dgdb :=_begd .Gray16At (_cdaf ,_addc );_fcef .SetGray (_cdaf ,_addc ,_c .Gray {Y :_cdgc (uint8 (_dgdb .Y /256),_fcab )});};};return _fcef ;};func (_dcf *Gray2 )GrayAt (x ,y int )_c .Gray {_dgd ,_ :=ColorAtGray2BPC (x ,y ,_dcf .BytesPerLine ,_dcf .Data ,_dcf .Decode );
|
|
return _dgd ;};func (_dgb *NRGBA16 )At (x ,y int )_c .Color {_adca ,_ :=_dgb .ColorAt (x ,y );return _adca };func (_fgbe *Gray4 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtGray4BPC (x ,y ,_fgbe .BytesPerLine ,_fgbe .Data ,_fgbe .Decode );};func (_afce *Gray8 )Base ()*ImageBase {return &_afce .ImageBase };
|
|
type RasterOperator int ;func _eece (_eeced ,_fgdb *Monochrome ,_eddb []byte ,_afb int )(_aedb error ){var (_eacc ,_fdcg ,_gfb ,_cf ,_gbf ,_abeaa ,_fcc ,_ccbf int ;_beb ,_dce ,_baf ,_gfc uint32 ;_dcac ,_bdeb byte ;_cfe uint16 ;);_dcee :=make ([]byte ,4);
|
|
_dfe :=make ([]byte ,4);for _gfb =0;_gfb < _eeced .Height -1;_gfb ,_cf =_gfb +2,_cf +1{_eacc =_gfb *_eeced .BytesPerLine ;_fdcg =_cf *_fgdb .BytesPerLine ;for _gbf ,_abeaa =0,0;_gbf < _afb ;_gbf ,_abeaa =_gbf +4,_abeaa +1{for _fcc =0;_fcc < 4;_fcc ++{_ccbf =_eacc +_gbf +_fcc ;
|
|
if _ccbf <=len (_eeced .Data )-1&&_ccbf < _eacc +_eeced .BytesPerLine {_dcee [_fcc ]=_eeced .Data [_ccbf ];}else {_dcee [_fcc ]=0x00;};_ccbf =_eacc +_eeced .BytesPerLine +_gbf +_fcc ;if _ccbf <=len (_eeced .Data )-1&&_ccbf < _eacc +(2*_eeced .BytesPerLine ){_dfe [_fcc ]=_eeced .Data [_ccbf ];
|
|
}else {_dfe [_fcc ]=0x00;};};_beb =_db .BigEndian .Uint32 (_dcee );_dce =_db .BigEndian .Uint32 (_dfe );_baf =_beb &_dce ;_baf |=_baf <<1;_gfc =_beb |_dce ;_gfc &=_gfc <<1;_dce =_baf &_gfc ;_dce &=0xaaaaaaaa;_beb =_dce |(_dce <<7);_dcac =byte (_beb >>24);
|
|
_bdeb =byte ((_beb >>8)&0xff);_ccbf =_fdcg +_abeaa ;if _ccbf +1==len (_fgdb .Data )-1||_ccbf +1>=_fdcg +_fgdb .BytesPerLine {if _aedb =_fgdb .setByte (_ccbf ,_eddb [_dcac ]);_aedb !=nil {return _dbe .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_ccbf );
|
|
};}else {_cfe =(uint16 (_eddb [_dcac ])<<8)|uint16 (_eddb [_bdeb ]);if _aedb =_fgdb .setTwoBytes (_ccbf ,_cfe );_aedb !=nil {return _dbe .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",_ccbf );
|
|
};_abeaa ++;};};};return nil ;};func FromGoImage (i _g .Image )(Image ,error ){switch _cdgg :=i .(type ){case Image :return _cdgg .Copy (),nil ;case Gray :return GrayConverter .Convert (i );case *_g .Gray16 :return Gray16Converter .Convert (i );case CMYK :return CMYKConverter .Convert (i );
|
|
case *_g .NRGBA64 :return NRGBA64Converter .Convert (i );default:return NRGBAConverter .Convert (i );};};func (_cabf *ImageBase )getByte (_cefe int )(byte ,error ){if _cefe > len (_cabf .Data )-1||_cefe < 0{return 0,_dbe .Errorf ("\u0069\u006e\u0064\u0065x:\u0020\u0025\u0064\u0020\u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006eg\u0065",_cefe );
|
|
};return _cabf .Data [_cefe ],nil ;};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 ,_dbe .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 (_eedc *Gray8 )Validate ()error {if len (_eedc .Data )!=_eedc .Height *_eedc .BytesPerLine {return ErrInvalidImage ;};return nil ;};func _fffef (_bdge nrgba64 ,_cgef NRGBA ,_cfddf _g .Rectangle ){for _bggd :=0;_bggd < _cfddf .Max .X ;_bggd ++{for _ddbab :=0;
|
|
_ddbab < _cfddf .Max .Y ;_ddbab ++{_egda :=_bdge .NRGBA64At (_bggd ,_ddbab );_cgef .SetNRGBA (_bggd ,_ddbab ,_beggf (_egda ));};};};func GrayHistogram (g Gray )(_dcbc [256]int ){switch _faeg :=g .(type ){case Histogramer :return _faeg .Histogram ();case _g .Image :_cgdf :=_faeg .Bounds ();
|
|
for _cfdb :=0;_cfdb < _cgdf .Max .X ;_cfdb ++{for _aaba :=0;_aaba < _cgdf .Max .Y ;_aaba ++{_dcbc [g .GrayAt (_cfdb ,_aaba ).Y ]++;};};return _dcbc ;default:return [256]int {};};};type NRGBA64 struct{ImageBase };const (_edff shift =iota ;_edbf ;);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 ,_dbe .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 _fddb (_gdg _g .Image )(Image ,error ){if _bdda ,_bag :=_gdg .(*CMYK32 );_bag {return _bdda .Copy (),nil ;};_dgf :=_gdg .Bounds ();_dffcb ,_deg :=NewImage (_dgf .Max .X ,_dgf .Max .Y ,8,4,nil ,nil ,nil );if _deg !=nil {return nil ,_deg ;};switch _dd :=_gdg .(type ){case CMYK :_cce (_dd ,_dffcb .(CMYK ),_dgf );
|
|
case Gray :_cfgd (_dd ,_dffcb .(CMYK ),_dgf );case NRGBA :_bbaf (_dd ,_dffcb .(CMYK ),_dgf );case RGBA :_eefa (_dd ,_dffcb .(CMYK ),_dgf );default:_dfae (_gdg ,_dffcb ,_dgf );};return _dffcb ,nil ;};func (_agaf *Monochrome )Copy ()Image {return &Monochrome {ImageBase :_agaf .ImageBase .copy (),ModelThreshold :_agaf .ModelThreshold };
|
|
};func _decg (_dceg _g .Image )(Image ,error ){if _edg ,_ecda :=_dceg .(*Gray2 );_ecda {return _edg .Copy (),nil ;};_bgda :=_dceg .Bounds ();_bec ,_gdbe :=NewImage (_bgda .Max .X ,_bgda .Max .Y ,2,1,nil ,nil ,nil );if _gdbe !=nil {return nil ,_gdbe ;};
|
|
_fea (_dceg ,_bec ,_bgda );return _bec ,nil ;};func _cabe (_aee _c .RGBA )_c .NRGBA {switch _aee .A {case 0xff:return _c .NRGBA {R :_aee .R ,G :_aee .G ,B :_aee .B ,A :0xff};case 0x00:return _c .NRGBA {};default:_bdfa ,_eae ,_baa ,_caad :=_aee .RGBA ();
|
|
_bdfa =(_bdfa *0xffff)/_caad ;_eae =(_eae *0xffff)/_caad ;_baa =(_baa *0xffff)/_caad ;return _c .NRGBA {R :uint8 (_bdfa >>8),G :uint8 (_eae >>8),B :uint8 (_baa >>8),A :uint8 (_caad >>8)};};};func (_bcdc *Gray4 )Copy ()Image {return &Gray4 {ImageBase :_bcdc .copy ()}};
|
|
var _ _g .Image =&NRGBA64 {};func (_cdca *RGBA32 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtRGBA32 (x ,y ,_cdca .Width ,_cdca .Data ,_cdca .Alpha ,_cdca .Decode );};func (_bedg *NRGBA64 )ColorAt (x ,y int )(_c .Color ,error ){return ColorAtNRGBA64 (x ,y ,_bedg .Width ,_bedg .Data ,_bedg .Alpha ,_bedg .Decode );
|
|
};func (_gfcg *Gray8 )SetGray (x ,y int ,g _c .Gray ){_bfd :=y *_gfcg .BytesPerLine +x ;if _bfd > len (_gfcg .Data )-1{return ;};_gfcg .Data [_bfd ]=g .Y ;};func (_fdgd *Gray4 )ColorModel ()_c .Model {return Gray4Model };func _dgab (_bccd _g .Image ,_cfed Image ,_gdda _g .Rectangle ){if _ggcd ,_ebde :=_bccd .(SMasker );
|
|
_ebde &&_ggcd .HasAlpha (){_cfed .(SMasker ).MakeAlpha ();};switch _bfaa :=_bccd .(type ){case Gray :_cefff (_bfaa ,_cfed .(RGBA ),_gdda );case NRGBA :_eeca (_bfaa ,_cfed .(RGBA ),_gdda );case *_g .NYCbCrA :_geea (_bfaa ,_cfed .(RGBA ),_gdda );case CMYK :_dggbf (_bfaa ,_cfed .(RGBA ),_gdda );
|
|
case RGBA :_afbf (_bfaa ,_cfed .(RGBA ),_gdda );case nrgba64 :_dbcbf (_bfaa ,_cfed .(RGBA ),_gdda );default:_dfae (_bccd ,_cfed ,_gdda );};};func (_dbc *CMYK32 )Validate ()error {if len (_dbc .Data )!=4*_dbc .Width *_dbc .Height {return _d .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 _bdab (_egg _g .Image )(Image ,error ){if _badb ,_aaa :=_egg .(*NRGBA16 );_aaa {return _badb .Copy (),nil ;};_cecd :=_egg .Bounds ();_dfca ,_faeb :=NewImage (_cecd .Max .X ,_cecd .Max .Y ,4,3,nil ,nil ,nil );if _faeb !=nil {return nil ,_faeb ;
|
|
};_edfg (_egg ,_dfca ,_cecd );return _dfca ,nil ;};func _ddbg (_gbef *Monochrome ,_baed ,_cafe int ,_dfdg ,_bgff int ,_ffbd RasterOperator ){var (_feeba int ;_cfdd byte ;_fcad ,_abfdd int ;_fcbg int ;);_cefd :=_dfdg >>3;_ffaa :=_dfdg &7;if _ffaa > 0{_cfdd =_fgea [_ffaa ];
|
|
};_feeba =_gbef .BytesPerLine *_cafe +(_baed >>3);switch _ffbd {case PixClr :for _fcad =0;_fcad < _bgff ;_fcad ++{_fcbg =_feeba +_fcad *_gbef .BytesPerLine ;for _abfdd =0;_abfdd < _cefd ;_abfdd ++{_gbef .Data [_fcbg ]=0x0;_fcbg ++;};if _ffaa > 0{_gbef .Data [_fcbg ]=_ecad (_gbef .Data [_fcbg ],0x0,_cfdd );
|
|
};};case PixSet :for _fcad =0;_fcad < _bgff ;_fcad ++{_fcbg =_feeba +_fcad *_gbef .BytesPerLine ;for _abfdd =0;_abfdd < _cefd ;_abfdd ++{_gbef .Data [_fcbg ]=0xff;_fcbg ++;};if _ffaa > 0{_gbef .Data [_fcbg ]=_ecad (_gbef .Data [_fcbg ],0xff,_cfdd );};};
|
|
case PixNotDst :for _fcad =0;_fcad < _bgff ;_fcad ++{_fcbg =_feeba +_fcad *_gbef .BytesPerLine ;for _abfdd =0;_abfdd < _cefd ;_abfdd ++{_gbef .Data [_fcbg ]=^_gbef .Data [_fcbg ];_fcbg ++;};if _ffaa > 0{_gbef .Data [_fcbg ]=_ecad (_gbef .Data [_fcbg ],^_gbef .Data [_fcbg ],_cfdd );
|
|
};};};};func (_bfca *Monochrome )ResolveDecode ()error {if len (_bfca .Decode )!=2{return nil ;};if _bfca .Decode [0]==1&&_bfca .Decode [1]==0{if _dfcd :=_bfca .InverseData ();_dfcd !=nil {return _dfcd ;};_bfca .Decode =nil ;};return nil ;};func _fggg (_fae _c .NRGBA64 )_c .RGBA {_ecac ,_efe ,_gcfa ,_bega :=_fae .RGBA ();
|
|
return _c .RGBA {R :uint8 (_ecac >>8),G :uint8 (_efe >>8),B :uint8 (_gcfa >>8),A :uint8 (_bega >>8)};};func _geea (_cace *_g .NYCbCrA ,_bgfg RGBA ,_febg _g .Rectangle ){for _dcdf :=0;_dcdf < _febg .Max .X ;_dcdf ++{for _cabd :=0;_cabd < _febg .Max .Y ;
|
|
_cabd ++{_gdaac :=_cace .NYCbCrAAt (_dcdf ,_cabd );_bgfg .SetRGBA (_dcdf ,_cabd ,_faggd (_gdaac ));};};};func (_ecf *monochromeThresholdConverter )Convert (img _g .Image )(Image ,error ){if _bddf ,_cec :=img .(*Monochrome );_cec {return _bddf .Copy (),nil ;
|
|
};_abfc :=img .Bounds ();_ggf ,_dba :=NewImage (_abfc .Max .X ,_abfc .Max .Y ,1,1,nil ,nil ,nil );if _dba !=nil {return nil ,_dba ;};_ggf .(*Monochrome ).ModelThreshold =_ecf .Threshold ;for _gddgf :=0;_gddgf < _abfc .Max .X ;_gddgf ++{for _ddg :=0;_ddg < _abfc .Max .Y ;
|
|
_ddg ++{_efde :=img .At (_gddgf ,_ddg );_ggf .Set (_gddgf ,_ddg ,_efde );};};return _ggf ,nil ;};type NRGBA16 struct{ImageBase };func (_fbgd *RGBA32 )Bounds ()_g .Rectangle {return _g .Rectangle {Max :_g .Point {X :_fbgd .Width ,Y :_fbgd .Height }};};func _dbee (_bgge *Monochrome ,_gcb ,_gccg ,_fdde ,_faed int ,_acae RasterOperator ,_eacg *Monochrome ,_ggab ,_gbfc int )error {if _bgge ==nil {return _d .New ("\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");
|
|
};if _acae ==PixDst {return nil ;};switch _acae {case PixClr ,PixSet ,PixNotDst :_egcf (_bgge ,_gcb ,_gccg ,_fdde ,_faed ,_acae );return nil ;};if _eacg ==nil {_ca .Log .Debug ("\u0052a\u0073\u0074e\u0072\u004f\u0070\u0065r\u0061\u0074\u0069o\u006e\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020bi\u0074\u006d\u0061p\u0020\u0069s\u0020\u006e\u006f\u0074\u0020\u0064e\u0066\u0069n\u0065\u0064");
|
|
return _d .New ("\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _feeb :=_cegd (_bgge ,_gcb ,_gccg ,_fdde ,_faed ,_acae ,_eacg ,_ggab ,_gbfc );_feeb !=nil {return _feeb ;};return nil ;};var _ RGBA =&RGBA32 {};
|
|
func ColorAtNRGBA64 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_c .NRGBA64 ,error ){_cgbg :=(y *width +x )*2;_cefde :=_cgbg *3;if _cefde +5>=len (data ){return _c .NRGBA64 {},_dbe .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 _deegg =0xffff;_fbaa :=uint16 (_deegg );if alpha !=nil &&len (alpha )> _cgbg +1{_fbaa =uint16 (alpha [_cgbg ])<<8|uint16 (alpha [_cgbg +1]);};_deffc :=uint16 (data [_cefde ])<<8|uint16 (data [_cefde +1]);_ggaf :=uint16 (data [_cefde +2])<<8|uint16 (data [_cefde +3]);
|
|
_aefd :=uint16 (data [_cefde +4])<<8|uint16 (data [_cefde +5]);if len (decode )==6{_deffc =uint16 (uint64 (LinearInterpolate (float64 (_deffc ),0,65535,decode [0],decode [1]))&_deegg );_ggaf =uint16 (uint64 (LinearInterpolate (float64 (_ggaf ),0,65535,decode [2],decode [3]))&_deegg );
|
|
_aefd =uint16 (uint64 (LinearInterpolate (float64 (_aefd ),0,65535,decode [4],decode [5]))&_deegg );};return _c .NRGBA64 {R :_deffc ,G :_ggaf ,B :_aefd ,A :_fbaa },nil ;};func _bbbf (_gbgc _c .NRGBA )_c .NRGBA {_gbgc .R =_gbgc .R >>4|(_gbgc .R >>4)<<4;
|
|
_gbgc .G =_gbgc .G >>4|(_gbgc .G >>4)<<4;_gbgc .B =_gbgc .B >>4|(_gbgc .B >>4)<<4;return _gbgc ;};func _gec (_ggfd int ,_bcb int )int {if _ggfd < _bcb {return _ggfd ;};return _bcb ;};func _ge (_gcda *Monochrome ,_cg ,_gdb int )(*Monochrome ,error ){if _gcda ==nil {return nil ,_d .New ("\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _cg <=0||_gdb <=0{return nil ,_d .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 _cg ==_gdb {if _cg ==1{return _gcda .copy (),nil ;};if _cg ==2||_cg ==4||_cg ==8{_ffb ,_gacb :=_gc (_gcda ,_cg );
|
|
if _gacb !=nil {return nil ,_gacb ;};return _ffb ,nil ;};};_aff :=_cg *_gcda .Width ;_gce :=_gdb *_gcda .Height ;_eg :=_gdc (_aff ,_gce );_be :=_eg .BytesPerLine ;var (_bfb ,_dfa ,_abb ,_egb ,_dc int ;_edd byte ;_ba error ;);for _dfa =0;_dfa < _gcda .Height ;
|
|
_dfa ++{_bfb =_gdb *_dfa *_be ;for _abb =0;_abb < _gcda .Width ;_abb ++{if _dee :=_gcda .getBitAt (_abb ,_dfa );_dee {_dc =_cg *_abb ;for _egb =0;_egb < _cg ;_egb ++{_eg .setIndexedBit (_bfb *8+_dc +_egb );};};};for _egb =1;_egb < _gdb ;_egb ++{_ccb :=_bfb +_egb *_be ;
|
|
for _agc :=0;_agc < _be ;_agc ++{if _edd ,_ba =_eg .getByte (_bfb +_agc );_ba !=nil {return nil ,_ba ;};if _ba =_eg .setByte (_ccb +_agc ,_edd );_ba !=nil {return nil ,_ba ;};};};};return _eg ,nil ;};type shift int ;type Image interface{_fb .Image ;Base ()*ImageBase ;
|
|
Copy ()Image ;Pix ()[]byte ;ColorAt (_cfda ,_dda int )(_c .Color ,error );Validate ()error ;};func _eaf (_acf *Monochrome ,_bfeg int ,_adc []byte )(_abcg *Monochrome ,_gdd error ){const _fdb ="\u0072\u0065d\u0075\u0063\u0065R\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079";
|
|
if _acf ==nil {return nil ,_d .New ("\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _bfeg < 1||_bfeg > 4{return nil ,_d .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 _acf .Height <=1{return nil ,_d .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");};_abcg =_gdc (_acf .Width /2,_acf .Height /2);
|
|
if _adc ==nil {_adc =_ebega ();};_fga :=_gec (_acf .BytesPerLine ,2*_abcg .BytesPerLine );switch _bfeg {case 1:_gdd =_eagg (_acf ,_abcg ,_adc ,_fga );case 2:_gdd =_edda (_acf ,_abcg ,_adc ,_fga );case 3:_gdd =_eece (_acf ,_abcg ,_adc ,_fga );case 4:_gdd =_ffda (_acf ,_abcg ,_adc ,_fga );
|
|
};if _gdd !=nil {return nil ,_gdd ;};return _abcg ,nil ;};func (_acga *ImageBase )newAlpha (){_dggd :=BytesPerLine (_acga .Width ,_acga .BitsPerComponent ,1);_acga .Alpha =make ([]byte ,_acga .Height *_dggd );};func (_gbab *RGBA32 )Set (x ,y int ,c _c .Color ){_geggd :=y *_gbab .Width +x ;
|
|
_gcee :=3*_geggd ;if _gcee +2>=len (_gbab .Data ){return ;};_beagd :=_c .RGBAModel .Convert (c ).(_c .RGBA );_gbab .setRGBA (_geggd ,_beagd );};type Gray4 struct{ImageBase };func _edfg (_acea _g .Image ,_daac Image ,_fcfcg _g .Rectangle ){if _ddga ,_feaca :=_acea .(SMasker );
|
|
_feaca &&_ddga .HasAlpha (){_daac .(SMasker ).MakeAlpha ();};switch _adfc :=_acea .(type ){case Gray :_aaaa (_adfc ,_daac .(NRGBA ),_fcfcg );case NRGBA :_ecbg (_adfc ,_daac .(NRGBA ),_fcfcg );case *_g .NYCbCrA :_eccd (_adfc ,_daac .(NRGBA ),_fcfcg );case CMYK :_cfeaa (_adfc ,_daac .(NRGBA ),_fcfcg );
|
|
case RGBA :_faag (_adfc ,_daac .(NRGBA ),_fcfcg );case nrgba64 :_fffef (_adfc ,_daac .(NRGBA ),_fcfcg );default:_dfae (_acea ,_daac ,_fcfcg );};};func _fecd (_ddgd _g .Image )(Image ,error ){if _feaf ,_fffce :=_ddgd .(*RGBA32 );_fffce {return _feaf .Copy (),nil ;
|
|
};_aggdf ,_eaebca ,_badgc :=_dcgg (_ddgd ,1);_ddbc :=&RGBA32 {ImageBase :NewImageBase (_aggdf .Max .X ,_aggdf .Max .Y ,8,3,nil ,_badgc ,nil )};_dgab (_ddgd ,_ddbc ,_aggdf );if len (_badgc )!=0&&!_eaebca {if _gdcb :=_geffb (_badgc ,_ddbc );_gdcb !=nil {return nil ,_gdcb ;
|
|
};};return _ddbc ,nil ;};func AutoThresholdTriangle (histogram [256]int )uint8 {var _cbfg ,_ccgg ,_efbd ,_cbcef int ;for _ffag :=0;_ffag < len (histogram );_ffag ++{if histogram [_ffag ]> 0{_cbfg =_ffag ;break ;};};if _cbfg > 0{_cbfg --;};for _bbgd :=255;
|
|
_bbgd > 0;_bbgd --{if histogram [_bbgd ]> 0{_cbcef =_bbgd ;break ;};};if _cbcef < 255{_cbcef ++;};for _cacf :=0;_cacf < 256;_cacf ++{if histogram [_cacf ]> _ccgg {_efbd =_cacf ;_ccgg =histogram [_cacf ];};};var _gfe bool ;if (_efbd -_cbfg )< (_cbcef -_efbd ){_gfe =true ;
|
|
var _gcef int ;_dafg :=255;for _gcef < _dafg {_fbb :=histogram [_gcef ];histogram [_gcef ]=histogram [_dafg ];histogram [_dafg ]=_fbb ;_gcef ++;_dafg --;};_cbfg =255-_cbcef ;_efbd =255-_efbd ;};if _cbfg ==_efbd {return uint8 (_cbfg );};_acdef :=float64 (histogram [_efbd ]);
|
|
_gedd :=float64 (_cbfg -_efbd );_dde :=_fd .Sqrt (_acdef *_acdef +_gedd *_gedd );_acdef /=_dde ;_gedd /=_dde ;_dde =_acdef *float64 (_cbfg )+_gedd *float64 (histogram [_cbfg ]);_bagd :=_cbfg ;var _acbg float64 ;for _ceab :=_cbfg +1;_ceab <=_efbd ;_ceab ++{_aadg :=_acdef *float64 (_ceab )+_gedd *float64 (histogram [_ceab ])-_dde ;
|
|
if _aadg > _acbg {_bagd =_ceab ;_acbg =_aadg ;};};_bagd --;if _gfe {var _edc int ;_cffe :=255;for _edc < _cffe {_bfde :=histogram [_edc ];histogram [_edc ]=histogram [_cffe ];histogram [_cffe ]=_bfde ;_edc ++;_cffe --;};return uint8 (255-_bagd );};return uint8 (_bagd );
|
|
};func _edda (_fbe ,_fbf *Monochrome ,_bgdc []byte ,_aded int )(_gcfg error ){var (_deeg ,_dfba ,_ebg ,_abea ,_fgaa ,_aedc ,_fgd ,_geg int ;_acg ,_eea ,_ebeg ,_ggc uint32 ;_daa ,_aeg byte ;_bba uint16 ;);_afgg :=make ([]byte ,4);_gde :=make ([]byte ,4);
|
|
for _ebg =0;_ebg < _fbe .Height -1;_ebg ,_abea =_ebg +2,_abea +1{_deeg =_ebg *_fbe .BytesPerLine ;_dfba =_abea *_fbf .BytesPerLine ;for _fgaa ,_aedc =0,0;_fgaa < _aded ;_fgaa ,_aedc =_fgaa +4,_aedc +1{for _fgd =0;_fgd < 4;_fgd ++{_geg =_deeg +_fgaa +_fgd ;
|
|
if _geg <=len (_fbe .Data )-1&&_geg < _deeg +_fbe .BytesPerLine {_afgg [_fgd ]=_fbe .Data [_geg ];}else {_afgg [_fgd ]=0x00;};_geg =_deeg +_fbe .BytesPerLine +_fgaa +_fgd ;if _geg <=len (_fbe .Data )-1&&_geg < _deeg +(2*_fbe .BytesPerLine ){_gde [_fgd ]=_fbe .Data [_geg ];
|
|
}else {_gde [_fgd ]=0x00;};};_acg =_db .BigEndian .Uint32 (_afgg );_eea =_db .BigEndian .Uint32 (_gde );_ebeg =_acg &_eea ;_ebeg |=_ebeg <<1;_ggc =_acg |_eea ;_ggc &=_ggc <<1;_eea =_ebeg |_ggc ;_eea &=0xaaaaaaaa;_acg =_eea |(_eea <<7);_daa =byte (_acg >>24);
|
|
_aeg =byte ((_acg >>8)&0xff);_geg =_dfba +_aedc ;if _geg +1==len (_fbf .Data )-1||_geg +1>=_dfba +_fbf .BytesPerLine {if _gcfg =_fbf .setByte (_geg ,_bgdc [_daa ]);_gcfg !=nil {return _dbe .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_geg );
|
|
};}else {_bba =(uint16 (_bgdc [_daa ])<<8)|uint16 (_bgdc [_aeg ]);if _gcfg =_fbf .setTwoBytes (_geg ,_bba );_gcfg !=nil {return _dbe .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",_geg );
|
|
};_aedc ++;};};};return nil ;};func _abe (_dffc ,_gcc int ,_gcdg []byte )*Monochrome {_agcg :=_gdc (_dffc ,_gcc );_agcg .Data =_gcdg ;return _agcg ;};func _fgcg (_bgdd _c .NRGBA64 )_c .Gray {var _bdea _c .NRGBA64 ;if _bgdd ==_bdea {return _c .Gray {Y :0xff};
|
|
};_fef ,_faab ,_fagg ,_ :=_bgdd .RGBA ();_dcbd :=(19595*_fef +38470*_faab +7471*_fagg +1<<15)>>24;return _c .Gray {Y :uint8 (_dcbd )};};func _cceb (_gfbc _g .Image ,_ccbc uint8 )*_g .Gray {_cgbf :=_gfbc .Bounds ();_ebdf :=_g .NewGray (_cgbf );var (_bgag _c .Color ;
|
|
_aagc _c .Gray ;);for _ecab :=0;_ecab < _cgbf .Max .X ;_ecab ++{for _agbg :=0;_agbg < _cgbf .Max .Y ;_agbg ++{_bgag =_gfbc .At (_ecab ,_agbg );_ebdf .Set (_ecab ,_agbg ,_bgag );_aagc =_ebdf .GrayAt (_ecab ,_agbg );_ebdf .SetGray (_ecab ,_agbg ,_c .Gray {Y :_cdgc (_aagc .Y ,_ccbc )});
|
|
};};return _ebdf ;};func _fea (_bdca _g .Image ,_fbfcc Image ,_fcbe _g .Rectangle ){switch _fffe :=_bdca .(type ){case Gray :_egeg (_fffe ,_fbfcc .(Gray ),_fcbe );case NRGBA :_fbae (_fffe ,_fbfcc .(Gray ),_fcbe );case CMYK :_dacd (_fffe ,_fbfcc .(Gray ),_fcbe );
|
|
case RGBA :_dgec (_fffe ,_fbfcc .(Gray ),_fcbe );default:_dfae (_bdca ,_fbfcc ,_fcbe );};};func (_cege *Monochrome )GrayAt (x ,y int )_c .Gray {_gdcd ,_ :=ColorAtGray1BPC (x ,y ,_cege .BytesPerLine ,_cege .Data ,_cege .Decode );return _gdcd ;};var ErrInvalidImage =_d .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");
|
|
var _ Gray =&Gray8 {};type Histogramer interface{Histogram ()[256]int ;};func ColorAtGray8BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_c .Gray ,error ){_bcdd :=y *bytesPerLine +x ;if _bcdd >=len (data ){return _c .Gray {},_dbe .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 );
|
|
};_cade :=data [_bcdd ];if len (decode )==2{_cade =uint8 (uint32 (LinearInterpolate (float64 (_cade ),0,255,decode [0],decode [1]))&0xff);};return _c .Gray {Y :_cade },nil ;};func _gdc (_fgc ,_gda int )*Monochrome {return &Monochrome {ImageBase :NewImageBase (_fgc ,_gda ,1,1,nil ,nil ,nil ),ModelThreshold :0x0f};
|
|
};func (_aeed *Monochrome )setGrayBit (_dbbd ,_ceff int ){_aeed .Data [_dbbd ]|=0x80>>uint (_ceff &7)};func (_ceefg *NRGBA16 )Bounds ()_g .Rectangle {return _g .Rectangle {Max :_g .Point {X :_ceefg .Width ,Y :_ceefg .Height }};};func (_agab *Monochrome )SetGray (x ,y int ,g _c .Gray ){_cgce :=y *_agab .BytesPerLine +x >>3;
|
|
if _cgce > len (_agab .Data )-1{return ;};g =_ced (g ,monochromeModel (_agab .ModelThreshold ));_agab .setGray (x ,g ,_cgce );};func (_aad *Monochrome )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Monochrome ,sx ,sy int )error {return _dbee (_aad ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
};func _feg (_ebf _c .RGBA )_c .CMYK {_bdde ,_cgf ,_acce ,_fada :=_c .RGBToCMYK (_ebf .R ,_ebf .G ,_ebf .B );return _c .CMYK {C :_bdde ,M :_cgf ,Y :_acce ,K :_fada };};func _cegd (_beed *Monochrome ,_caaa ,_addf int ,_fdaf ,_aafg int ,_degb RasterOperator ,_ababg *Monochrome ,_agfff ,_gbg int )error {var _eega ,_ccaa ,_cggd ,_cfbc int ;
|
|
if _caaa < 0{_agfff -=_caaa ;_fdaf +=_caaa ;_caaa =0;};if _agfff < 0{_caaa -=_agfff ;_fdaf +=_agfff ;_agfff =0;};_eega =_caaa +_fdaf -_beed .Width ;if _eega > 0{_fdaf -=_eega ;};_ccaa =_agfff +_fdaf -_ababg .Width ;if _ccaa > 0{_fdaf -=_ccaa ;};if _addf < 0{_gbg -=_addf ;
|
|
_aafg +=_addf ;_addf =0;};if _gbg < 0{_addf -=_gbg ;_aafg +=_gbg ;_gbg =0;};_cggd =_addf +_aafg -_beed .Height ;if _cggd > 0{_aafg -=_cggd ;};_cfbc =_gbg +_aafg -_ababg .Height ;if _cfbc > 0{_aafg -=_cfbc ;};if _fdaf <=0||_aafg <=0{return nil ;};var _fcbd error ;
|
|
switch {case _caaa &7==0&&_agfff &7==0:_fcbd =_bafc (_beed ,_caaa ,_addf ,_fdaf ,_aafg ,_degb ,_ababg ,_agfff ,_gbg );case _caaa &7==_agfff &7:_fcbd =_gadd (_beed ,_caaa ,_addf ,_fdaf ,_aafg ,_degb ,_ababg ,_agfff ,_gbg );default:_fcbd =_acca (_beed ,_caaa ,_addf ,_fdaf ,_aafg ,_degb ,_ababg ,_agfff ,_gbg );
|
|
};if _fcbd !=nil {return _fcbd ;};return nil ;};func (_dagc *Monochrome )ExpandBinary (factor int )(*Monochrome ,error ){if !IsPowerOf2 (uint (factor )){return nil ,_dbe .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 _gc (_dagc ,factor );};type RGBA32 struct{ImageBase };func (_daefa *NRGBA32 )NRGBAAt (x ,y int )_c .NRGBA {_gade ,_ :=ColorAtNRGBA32 (x ,y ,_daefa .Width ,_daefa .Data ,_daefa .Alpha ,_daefa .Decode );return _gade ;};type SMasker interface{HasAlpha ()bool ;
|
|
GetAlpha ()[]byte ;MakeAlpha ();};type Gray8 struct{ImageBase };var _ _g .Image =&Gray2 {};func (_befe *NRGBA32 )At (x ,y int )_c .Color {_eacgg ,_ :=_befe .ColorAt (x ,y );return _eacgg };func (_fdcd *NRGBA64 )Copy ()Image {return &NRGBA64 {ImageBase :_fdcd .copy ()}};
|
|
func _eefa (_dccd RGBA ,_fbed CMYK ,_ccf _g .Rectangle ){for _bfc :=0;_bfc < _ccf .Max .X ;_bfc ++{for _cab :=0;_cab < _ccf .Max .Y ;_cab ++{_dfee :=_dccd .RGBAAt (_bfc ,_cab );_fbed .SetCMYK (_bfc ,_cab ,_feg (_dfee ));};};};func (_cfab *Monochrome )setGray (_ggg int ,_acaf _c .Gray ,_eaed int ){if _acaf .Y ==0{_cfab .clearBit (_eaed ,_ggg );
|
|
}else {_cfab .setGrayBit (_eaed ,_ggg );};};func (_aeacg *Gray16 )At (x ,y int )_c .Color {_dbec ,_ :=_aeacg .ColorAt (x ,y );return _dbec };func _ffcf (_aaca uint )uint {var _fdda uint ;for _aaca !=0{_aaca >>=1;_fdda ++;};return _fdda -1;};func (_acef *ImageBase )setFourBytes (_cegb int ,_fbfcb uint32 )error {if _cegb +3> len (_acef .Data )-1{return _dbe .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_cegb );
|
|
};_acef .Data [_cegb ]=byte ((_fbfcb &0xff000000)>>24);_acef .Data [_cegb +1]=byte ((_fbfcb &0xff0000)>>16);_acef .Data [_cegb +2]=byte ((_fbfcb &0xff00)>>8);_acef .Data [_cegb +3]=byte (_fbfcb &0xff);return nil ;};func _ebc (){for _ffa :=0;_ffa < 256;
|
|
_ffa ++{_dfgg [_ffa ]=uint8 (_ffa &0x1)+(uint8 (_ffa >>1)&0x1)+(uint8 (_ffa >>2)&0x1)+(uint8 (_ffa >>3)&0x1)+(uint8 (_ffa >>4)&0x1)+(uint8 (_ffa >>5)&0x1)+(uint8 (_ffa >>6)&0x1)+(uint8 (_ffa >>7)&0x1);};}; |