2020-08-27 21:45:09 +00:00
|
|
|
//
|
|
|
|
// 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/
|
|
|
|
|
2023-03-01 18:45:57 +00:00
|
|
|
package imageutil ;import (_ab "encoding/binary";_a "errors";_e "fmt";_eb "github.com/unidoc/unipdf/v3/common";_fe "github.com/unidoc/unipdf/v3/internal/bitwise";_f "image";_gc "image/color";_da "image/draw";_d "math";);func (_dbebc *NRGBA16 )Set (x ,y int ,c _gc .Color ){_cebd :=y *_dbebc .BytesPerLine +x *3/2;
|
|
|
|
if _cebd +1>=len (_dbebc .Data ){return ;};_bfff :=NRGBA16Model .Convert (c ).(_gc .NRGBA );_dbebc .setNRGBA (x ,y ,_cebd ,_bfff );};var _ _f .Image =&Monochrome {};func _ecf (_dcbb ,_fcg int ,_cecc []byte )*Monochrome {_cbc :=_cea (_dcbb ,_fcg );_cbc .Data =_cecc ;
|
|
|
|
return _cbc ;};func _fge (_bdae ,_ddgc *Monochrome ,_cabe []byte ,_fdg int )(_cecf error ){var (_gbbe ,_cef ,_age ,_geg ,_aad ,_edc ,_cbee ,_cdga int ;_ebg ,_egg uint32 ;_agg ,_ebf byte ;_gcag uint16 ;);_dac :=make ([]byte ,4);_gfd :=make ([]byte ,4);for _age =0;
|
|
|
|
_age < _bdae .Height -1;_age ,_geg =_age +2,_geg +1{_gbbe =_age *_bdae .BytesPerLine ;_cef =_geg *_ddgc .BytesPerLine ;for _aad ,_edc =0,0;_aad < _fdg ;_aad ,_edc =_aad +4,_edc +1{for _cbee =0;_cbee < 4;_cbee ++{_cdga =_gbbe +_aad +_cbee ;if _cdga <=len (_bdae .Data )-1&&_cdga < _gbbe +_bdae .BytesPerLine {_dac [_cbee ]=_bdae .Data [_cdga ];
|
|
|
|
}else {_dac [_cbee ]=0x00;};_cdga =_gbbe +_bdae .BytesPerLine +_aad +_cbee ;if _cdga <=len (_bdae .Data )-1&&_cdga < _gbbe +(2*_bdae .BytesPerLine ){_gfd [_cbee ]=_bdae .Data [_cdga ];}else {_gfd [_cbee ]=0x00;};};_ebg =_ab .BigEndian .Uint32 (_dac );_egg =_ab .BigEndian .Uint32 (_gfd );
|
|
|
|
_egg &=_ebg ;_egg &=_egg <<1;_egg &=0xaaaaaaaa;_ebg =_egg |(_egg <<7);_agg =byte (_ebg >>24);_ebf =byte ((_ebg >>8)&0xff);_cdga =_cef +_edc ;if _cdga +1==len (_ddgc .Data )-1||_cdga +1>=_cef +_ddgc .BytesPerLine {_ddgc .Data [_cdga ]=_cabe [_agg ];if _cecf =_ddgc .setByte (_cdga ,_cabe [_agg ]);
|
|
|
|
_cecf !=nil {return _e .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_cdga );};}else {_gcag =(uint16 (_cabe [_agg ])<<8)|uint16 (_cabe [_ebf ]);if _cecf =_ddgc .setTwoBytes (_cdga ,_gcag );_cecf !=nil {return _e .Errorf ("s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_cdga );
|
|
|
|
};_edc ++;};};};return nil ;};func _ecgf (_cfgb _f .Image )(Image ,error ){if _edcf ,_daac :=_cfgb .(*Gray8 );_daac {return _edcf .Copy (),nil ;};_efa :=_cfgb .Bounds ();_cce ,_cfff :=NewImage (_efa .Max .X ,_efa .Max .Y ,8,1,nil ,nil ,nil );if _cfff !=nil {return nil ,_cfff ;
|
|
|
|
};_afdd (_cfgb ,_cce ,_efa );return _cce ,nil ;};func (_aagg *NRGBA64 )NRGBA64At (x ,y int )_gc .NRGBA64 {_gdb ,_ :=ColorAtNRGBA64 (x ,y ,_aagg .Width ,_aagg .Data ,_aagg .Alpha ,_aagg .Decode );return _gdb ;};var (_cbe =_dgb ();_cbd =_gcg ();_de =_bga ();
|
|
|
|
);func (_aedg *Monochrome )ScaleLow (width ,height int )(*Monochrome ,error ){if width < 0||height < 0{return nil ,_a .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");
|
|
|
|
};_eebc :=_cea (width ,height );_dafc :=make ([]int ,height );_acdc :=make ([]int ,width );_cfdg :=float64 (_aedg .Width )/float64 (width );_beb :=float64 (_aedg .Height )/float64 (height );for _fcd :=0;_fcd < height ;_fcd ++{_dafc [_fcd ]=int (_d .Min (_beb *float64 (_fcd )+0.5,float64 (_aedg .Height -1)));
|
|
|
|
};for _eebg :=0;_eebg < width ;_eebg ++{_acdc [_eebg ]=int (_d .Min (_cfdg *float64 (_eebg )+0.5,float64 (_aedg .Width -1)));};_eceg :=-1;_dbdae :=byte (0);for _dcce :=0;_dcce < height ;_dcce ++{_ggag :=_dafc [_dcce ]*_aedg .BytesPerLine ;_accfc :=_dcce *_eebc .BytesPerLine ;
|
|
|
|
for _cbfg :=0;_cbfg < width ;_cbfg ++{_bcdb :=_acdc [_cbfg ];if _bcdb !=_eceg {_dbdae =_aedg .getBit (_ggag ,_bcdb );if _dbdae !=0{_eebc .setBit (_accfc ,_cbfg );};_eceg =_bcdb ;}else {if _dbdae !=0{_eebc .setBit (_accfc ,_cbfg );};};};};return _eebc ,nil ;
|
|
|
|
};func _bdfc (_fcgg _f .Image )(Image ,error ){if _eaef ,_dge :=_fcgg .(*Gray4 );_dge {return _eaef .Copy (),nil ;};_cdda :=_fcgg .Bounds ();_fdgg ,_bbgc :=NewImage (_cdda .Max .X ,_cdda .Max .Y ,4,1,nil ,nil ,nil );if _bbgc !=nil {return nil ,_bbgc ;};
|
|
|
|
_afdd (_fcgg ,_fdgg ,_cdda );return _fdgg ,nil ;};func (_gebb *CMYK32 )SetCMYK (x ,y int ,c _gc .CMYK ){_cgb :=4*(y *_gebb .Width +x );if _cgb +3>=len (_gebb .Data ){return ;};_gebb .Data [_cgb ]=c .C ;_gebb .Data [_cgb +1]=c .M ;_gebb .Data [_cgb +2]=c .Y ;
|
|
|
|
_gebb .Data [_cgb +3]=c .K ;};func _afa (_dbeb Gray ,_dce CMYK ,_ebcb _f .Rectangle ){for _bgc :=0;_bgc < _ebcb .Max .X ;_bgc ++{for _cfbb :=0;_cfbb < _ebcb .Max .Y ;_cfbb ++{_bdc :=_dbeb .GrayAt (_bgc ,_cfbb );_dce .SetCMYK (_bgc ,_cfbb ,_dbac (_bdc ));
|
|
|
|
};};};var _ Gray =&Gray8 {};func _gdd (_adde Gray ,_fcafa NRGBA ,_gada _f .Rectangle ){for _aec :=0;_aec < _gada .Max .X ;_aec ++{for _gcd :=0;_gcd < _gada .Max .Y ;_gcd ++{_ddgg :=_bcc (_fcafa .NRGBAAt (_aec ,_gcd ));_adde .SetGray (_aec ,_gcd ,_ddgg );
|
|
|
|
};};};type shift int ;func (_gccc *RGBA32 )setRGBA (_ffae int ,_bea _gc .RGBA ){_fcdc :=3*_ffae ;_gccc .Data [_fcdc ]=_bea .R ;_gccc .Data [_fcdc +1]=_bea .G ;_gccc .Data [_fcdc +2]=_bea .B ;if _ffae < len (_gccc .Alpha ){_gccc .Alpha [_ffae ]=_bea .A ;
|
|
|
|
};};func (_gdgc *NRGBA16 )NRGBAAt (x ,y int )_gc .NRGBA {_bede ,_ :=ColorAtNRGBA16 (x ,y ,_gdgc .Width ,_gdgc .BytesPerLine ,_gdgc .Data ,_gdgc .Alpha ,_gdgc .Decode );return _bede ;};func _eccd (_gfcg _gc .NRGBA )_gc .NRGBA {_gfcg .R =_gfcg .R >>4|(_gfcg .R >>4)<<4;
|
|
|
|
_gfcg .G =_gfcg .G >>4|(_gfcg .G >>4)<<4;_gfcg .B =_gfcg .B >>4|(_gfcg .B >>4)<<4;return _gfcg ;};type Monochrome struct{ImageBase ;ModelThreshold uint8 ;};var _ Gray =&Gray4 {};func _adae (_bgca _gc .CMYK )_gc .Gray {_add ,_bcf ,_bff :=_gc .CMYKToRGB (_bgca .C ,_bgca .M ,_bgca .Y ,_bgca .K );
|
|
|
|
_dgcd :=(19595*uint32 (_add )+38470*uint32 (_bcf )+7471*uint32 (_bff )+1<<7)>>16;return _gc .Gray {Y :uint8 (_dgcd )};};func (_geae *Gray4 )Histogram ()(_dgbd [256]int ){for _ceb :=0;_ceb < _geae .Width ;_ceb ++{for _dbed :=0;_dbed < _geae .Height ;_dbed ++{_dgbd [_geae .GrayAt (_ceb ,_dbed ).Y ]++;
|
|
|
|
};};return _dgbd ;};type Gray16 struct{ImageBase };func (_eeaaa *RGBA32 )At (x ,y int )_gc .Color {_dfee ,_ :=_eeaaa .ColorAt (x ,y );return _dfee };func _bdec (_ecgfe *Monochrome ,_bcfb ,_ebge ,_eaeg ,_abfc int ,_dgbg RasterOperator ,_ecgfc *Monochrome ,_fgff ,_begc int )error {var (_eebcb byte ;
|
|
|
|
_dffd int ;_fdbe int ;_egff ,_cfedg int ;_abafe ,_aaed int ;);_dgad :=_eaeg >>3;_efdg :=_eaeg &7;if _efdg > 0{_eebcb =_egcfb [_efdg ];};_dffd =_ecgfc .BytesPerLine *_begc +(_fgff >>3);_fdbe =_ecgfe .BytesPerLine *_ebge +(_bcfb >>3);switch _dgbg {case PixSrc :for _abafe =0;
|
|
|
|
_abafe < _abfc ;_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;for _aaed =0;_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]=_ecgfc .Data [_egff ];_cfedg ++;_egff ++;};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],_ecgfc .Data [_egff ],_eebcb );
|
|
|
|
};};case PixNotSrc :for _abafe =0;_abafe < _abfc ;_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;for _aaed =0;_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]=^(_ecgfc .Data [_egff ]);_cfedg ++;_egff ++;
|
|
|
|
};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],^_ecgfc .Data [_egff ],_eebcb );};};case PixSrcOrDst :for _abafe =0;_abafe < _abfc ;_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;for _aaed =0;
|
|
|
|
_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]|=_ecgfc .Data [_egff ];_cfedg ++;_egff ++;};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],_ecgfc .Data [_egff ]|_ecgfe .Data [_cfedg ],_eebcb );};};case PixSrcAndDst :for _abafe =0;_abafe < _abfc ;
|
|
|
|
_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;for _aaed =0;_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]&=_ecgfc .Data [_egff ];_cfedg ++;_egff ++;};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],_ecgfc .Data [_egff ]&_ecgfe .Data [_cfedg ],_eebcb );
|
|
|
|
};};case PixSrcXorDst :for _abafe =0;_abafe < _abfc ;_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;for _aaed =0;_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]^=_ecgfc .Data [_egff ];_cfedg ++;_egff ++;
|
|
|
|
};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],_ecgfc .Data [_egff ]^_ecgfe .Data [_cfedg ],_eebcb );};};case PixNotSrcOrDst :for _abafe =0;_abafe < _abfc ;_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;
|
|
|
|
for _aaed =0;_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]|=^(_ecgfc .Data [_egff ]);_cfedg ++;_egff ++;};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],^(_ecgfc .Data [_egff ])|_ecgfe .Data [_cfedg ],_eebcb );};};case PixNotSrcAndDst :for _abafe =0;
|
|
|
|
_abafe < _abfc ;_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;for _aaed =0;_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]&=^(_ecgfc .Data [_egff ]);_cfedg ++;_egff ++;};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],^(_ecgfc .Data [_egff ])&_ecgfe .Data [_cfedg ],_eebcb );
|
|
|
|
};};case PixSrcOrNotDst :for _abafe =0;_abafe < _abfc ;_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;for _aaed =0;_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]=_ecgfc .Data [_egff ]|^(_ecgfe .Data [_cfedg ]);
|
|
|
|
_cfedg ++;_egff ++;};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],_ecgfc .Data [_egff ]|^(_ecgfe .Data [_cfedg ]),_eebcb );};};case PixSrcAndNotDst :for _abafe =0;_abafe < _abfc ;_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;
|
|
|
|
_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;for _aaed =0;_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]=_ecgfc .Data [_egff ]&^(_ecgfe .Data [_cfedg ]);_cfedg ++;_egff ++;};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],_ecgfc .Data [_egff ]&^(_ecgfe .Data [_cfedg ]),_eebcb );
|
|
|
|
};};case PixNotPixSrcOrDst :for _abafe =0;_abafe < _abfc ;_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;for _aaed =0;_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]=^(_ecgfc .Data [_egff ]|_ecgfe .Data [_cfedg ]);
|
|
|
|
_cfedg ++;_egff ++;};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],^(_ecgfc .Data [_egff ]|_ecgfe .Data [_cfedg ]),_eebcb );};};case PixNotPixSrcAndDst :for _abafe =0;_abafe < _abfc ;_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;
|
|
|
|
_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;for _aaed =0;_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]=^(_ecgfc .Data [_egff ]&_ecgfe .Data [_cfedg ]);_cfedg ++;_egff ++;};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],^(_ecgfc .Data [_egff ]&_ecgfe .Data [_cfedg ]),_eebcb );
|
|
|
|
};};case PixNotPixSrcXorDst :for _abafe =0;_abafe < _abfc ;_abafe ++{_egff =_dffd +_abafe *_ecgfc .BytesPerLine ;_cfedg =_fdbe +_abafe *_ecgfe .BytesPerLine ;for _aaed =0;_aaed < _dgad ;_aaed ++{_ecgfe .Data [_cfedg ]=^(_ecgfc .Data [_egff ]^_ecgfe .Data [_cfedg ]);
|
|
|
|
_cfedg ++;_egff ++;};if _efdg > 0{_ecgfe .Data [_cfedg ]=_eaae (_ecgfe .Data [_cfedg ],^(_ecgfc .Data [_egff ]^_ecgfe .Data [_cfedg ]),_eebcb );};};default:_eb .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",_dgbg );
|
|
|
|
return _a .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 _abdd (_bbfe *Monochrome ,_gadg ,_gce ,_dea ,_ecega int ,_bgaf RasterOperator ,_egfd *Monochrome ,_bddb ,_dgac int )error {if _bbfe ==nil {return _a .New ("\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");
|
|
|
|
};if _bgaf ==PixDst {return nil ;};switch _bgaf {case PixClr ,PixSet ,PixNotDst :_deba (_bbfe ,_gadg ,_gce ,_dea ,_ecega ,_bgaf );return nil ;};if _egfd ==nil {_eb .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 _a .New ("\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _bbdd :=_ccad (_bbfe ,_gadg ,_gce ,_dea ,_ecega ,_bgaf ,_egfd ,_bddb ,_dgac );_bbdd !=nil {return _bbdd ;};return nil ;};func (_dacd *Gray16 )ColorModel ()_gc .Model {return _gc .Gray16Model };
|
|
|
|
func (_ccdf *NRGBA16 )SetNRGBA (x ,y int ,c _gc .NRGBA ){_accb :=y *_ccdf .BytesPerLine +x *3/2;if _accb +1>=len (_ccdf .Data ){return ;};c =_eccd (c );_ccdf .setNRGBA (x ,y ,_accb ,c );};func _ebc (_ge *Monochrome ,_ea int )(*Monochrome ,error ){if _ge ==nil {return nil ,_a .New ("\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if _ea ==1{return _ge .copy (),nil ;};if !IsPowerOf2 (uint (_ea )){return nil ,_e .Errorf ("\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006ci\u0064 \u0065x\u0070a\u006e\u0064\u0020\u0066\u0061\u0063\u0074\u006f\u0072\u003a\u0020\u0025\u0064",_ea );
|
|
|
|
};_ce :=_ec (_ea );return _eg (_ge ,_ea ,_ce );};func (_eddag *NRGBA64 )Bounds ()_f .Rectangle {return _f .Rectangle {Max :_f .Point {X :_eddag .Width ,Y :_eddag .Height }};};type Gray interface{GrayAt (_gdg ,_cdde int )_gc .Gray ;SetGray (_ggac ,_efe int ,_gecc _gc .Gray );
|
|
|
|
};func _efac (_ebdb int ,_gff int )error {return _e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",_ebdb ,_gff );
|
|
|
|
};func (_cbcb *ImageBase )HasAlpha ()bool {if _cbcb .Alpha ==nil {return false ;};for _bfd :=range _cbcb .Alpha {if _cbcb .Alpha [_bfd ]!=0xff{return true ;};};return false ;};func _ace (_egfc NRGBA ,_ddf CMYK ,_gea _f .Rectangle ){for _gfa :=0;_gfa < _gea .Max .X ;
|
|
|
|
_gfa ++{for _bdfd :=0;_bdfd < _gea .Max .Y ;_bdfd ++{_eef :=_egfc .NRGBAAt (_gfa ,_bdfd );_ddf .SetCMYK (_gfa ,_bdfd ,_ggbg (_eef ));};};};type CMYK32 struct{ImageBase };func (_aabed *Gray8 )Validate ()error {if len (_aabed .Data )!=_aabed .Height *_aabed .BytesPerLine {return ErrInvalidImage ;
|
|
|
|
};return nil ;};func (_fce *Gray8 )Set (x ,y int ,c _gc .Color ){_baea :=y *_fce .BytesPerLine +x ;if _baea > len (_fce .Data )-1{return ;};_ffbb :=_gc .GrayModel .Convert (c );_fce .Data [_baea ]=_ffbb .(_gc .Gray ).Y ;};func (_ggg *CMYK32 )At (x ,y int )_gc .Color {_dgfd ,_ :=_ggg .ColorAt (x ,y );
|
|
|
|
return _dgfd };func (_gfge *Gray8 )At (x ,y int )_gc .Color {_gegf ,_ :=_gfge .ColorAt (x ,y );return _gegf };type ImageBase struct{Width ,Height int ;BitsPerComponent ,ColorComponents int ;Data ,Alpha []byte ;Decode []float64 ;BytesPerLine int ;};func AddDataPadding (width ,height ,bitsPerComponent ,colorComponents int ,data []byte )([]byte ,error ){_baae :=BytesPerLine (width ,bitsPerComponent ,colorComponents );
|
|
|
|
if _baae ==width *colorComponents *bitsPerComponent /8{return data ,nil ;};_abf :=width *colorComponents *bitsPerComponent ;_bfafg :=_baae *8;_eade :=8-(_bfafg -_abf );_cbbf :=_fe .NewReader (data );_fcb :=_baae -1;_dacdc :=make ([]byte ,_fcb );_dagfc :=make ([]byte ,height *_baae );
|
|
|
|
_bgad :=_fe .NewWriterMSB (_dagfc );var _bbfd uint64 ;var _dafa error ;for _daeb :=0;_daeb < height ;_daeb ++{_ ,_dafa =_cbbf .Read (_dacdc );if _dafa !=nil {return nil ,_dafa ;};_ ,_dafa =_bgad .Write (_dacdc );if _dafa !=nil {return nil ,_dafa ;};_bbfd ,_dafa =_cbbf .ReadBits (byte (_eade ));
|
|
|
|
if _dafa !=nil {return nil ,_dafa ;};_ ,_dafa =_bgad .WriteBits (_bbfd ,_eade );if _dafa !=nil {return nil ,_dafa ;};_bgad .FinishByte ();};return _dagfc ,nil ;};func (_aeea *Gray2 )At (x ,y int )_gc .Color {_gcgg ,_ :=_aeea .ColorAt (x ,y );return _gcgg };
|
|
|
|
func (_cefd *NRGBA64 )setNRGBA64 (_dcba int ,_cbbb _gc .NRGBA64 ,_bedc int ){_cefd .Data [_dcba ]=uint8 (_cbbb .R >>8);_cefd .Data [_dcba +1]=uint8 (_cbbb .R &0xff);_cefd .Data [_dcba +2]=uint8 (_cbbb .G >>8);_cefd .Data [_dcba +3]=uint8 (_cbbb .G &0xff);
|
|
|
|
_cefd .Data [_dcba +4]=uint8 (_cbbb .B >>8);_cefd .Data [_dcba +5]=uint8 (_cbbb .B &0xff);if _bedc +1< len (_cefd .Alpha ){_cefd .Alpha [_bedc ]=uint8 (_cbbb .A >>8);_cefd .Alpha [_bedc +1]=uint8 (_cbbb .A &0xff);};};func _aef (_be ,_aaf *Monochrome ,_ggb []byte ,_bda int )(_bae error ){var (_abc ,_bdd ,_fcc ,_fdb ,_ffe ,_geb ,_gga ,_fa int ;
|
|
|
|
_aea ,_dedg uint32 ;_aac ,_efcba byte ;_cbef uint16 ;);_cbg :=make ([]byte ,4);_aeac :=make ([]byte ,4);for _fcc =0;_fcc < _be .Height -1;_fcc ,_fdb =_fcc +2,_fdb +1{_abc =_fcc *_be .BytesPerLine ;_bdd =_fdb *_aaf .BytesPerLine ;for _ffe ,_geb =0,0;_ffe < _bda ;
|
|
|
|
_ffe ,_geb =_ffe +4,_geb +1{for _gga =0;_gga < 4;_gga ++{_fa =_abc +_ffe +_gga ;if _fa <=len (_be .Data )-1&&_fa < _abc +_be .BytesPerLine {_cbg [_gga ]=_be .Data [_fa ];}else {_cbg [_gga ]=0x00;};_fa =_abc +_be .BytesPerLine +_ffe +_gga ;if _fa <=len (_be .Data )-1&&_fa < _abc +(2*_be .BytesPerLine ){_aeac [_gga ]=_be .Data [_fa ];
|
|
|
|
}else {_aeac [_gga ]=0x00;};};_aea =_ab .BigEndian .Uint32 (_cbg );_dedg =_ab .BigEndian .Uint32 (_aeac );_dedg |=_aea ;_dedg |=_dedg <<1;_dedg &=0xaaaaaaaa;_aea =_dedg |(_dedg <<7);_aac =byte (_aea >>24);_efcba =byte ((_aea >>8)&0xff);_fa =_bdd +_geb ;
|
|
|
|
if _fa +1==len (_aaf .Data )-1||_fa +1>=_bdd +_aaf .BytesPerLine {_aaf .Data [_fa ]=_ggb [_aac ];}else {_cbef =(uint16 (_ggb [_aac ])<<8)|uint16 (_ggb [_efcba ]);if _bae =_aaf .setTwoBytes (_fa ,_cbef );_bae !=nil {return _e .Errorf ("s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_fa );
|
|
|
|
};_geb ++;};};};return nil ;};func GetConverter (bitsPerComponent ,colorComponents int )(ColorConverter ,error ){switch colorComponents {case 1:switch bitsPerComponent {case 1:return MonochromeConverter ,nil ;case 2:return Gray2Converter ,nil ;case 4:return Gray4Converter ,nil ;
|
2023-02-07 17:17:49 +00:00
|
|
|
case 8:return GrayConverter ,nil ;case 16:return Gray16Converter ,nil ;};case 3:switch bitsPerComponent {case 4:return NRGBA16Converter ,nil ;case 8:return NRGBAConverter ,nil ;case 16:return NRGBA64Converter ,nil ;};case 4:return CMYKConverter ,nil ;};
|
|
|
|
return nil ,_e .Errorf ("\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0069\u006e\u0076\u0061l\u0069\u0064\u0020\u0063\u006f\u006c\u006f\u0072\u0043o\u006e\u0076\u0065\u0072\u0074\u0065\u0072\u0020\u0070\u0061\u0072\u0061\u006d\u0065t\u0065\u0072\u0073\u002e\u0020\u0042\u0069\u0074\u0073\u0050\u0065\u0072\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u003a\u0020\u0025\u0064\u002c\u0020\u0043\u006f\u006co\u0072\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006et\u0073\u003a \u0025\u0064",bitsPerComponent ,colorComponents );
|
2023-03-01 18:45:57 +00:00
|
|
|
};func (_efbgb *NRGBA32 )At (x ,y int )_gc .Color {_ddee ,_ :=_efbgb .ColorAt (x ,y );return _ddee };func (_ebde *NRGBA64 )Validate ()error {if len (_ebde .Data )!=3*2*_ebde .Width *_ebde .Height {return _a .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 _ba (_ef ,_ebe *Monochrome )(_gef error ){_eag :=_ebe .BytesPerLine ;_bf :=_ef .BytesPerLine ;var _dfd ,_bfc ,_cab ,_dad ,_ae int ;for _cab =0;_cab < _ebe .Height ;_cab ++{_dfd =_cab *_eag ;_bfc =8*_cab *_bf ;for _dad =0;_dad < _eag ;
|
|
|
|
_dad ++{if _gef =_ef .setEightBytes (_bfc +_dad *8,_de [_ebe .Data [_dfd +_dad ]]);_gef !=nil {return _gef ;};};for _ae =1;_ae < 8;_ae ++{for _dad =0;_dad < _bf ;_dad ++{if _gef =_ef .setByte (_bfc +_ae *_bf +_dad ,_ef .Data [_bfc +_dad ]);_gef !=nil {return _gef ;
|
|
|
|
};};};};return nil ;};var _ Gray =&Gray16 {};func (_bed *ImageBase )newAlpha (){_aedc :=BytesPerLine (_bed .Width ,_bed .BitsPerComponent ,1);_bed .Alpha =make ([]byte ,_bed .Height *_aedc );};func (_dbba *NRGBA32 )NRGBAAt (x ,y int )_gc .NRGBA {_facg ,_ :=ColorAtNRGBA32 (x ,y ,_dbba .Width ,_dbba .Data ,_dbba .Alpha ,_dbba .Decode );
|
|
|
|
return _facg ;};var _ _f .Image =&RGBA32 {};func ColorAtNRGBA16 (x ,y ,width ,bytesPerLine int ,data ,alpha []byte ,decode []float64 )(_gc .NRGBA ,error ){_ddce :=y *bytesPerLine +x *3/2;if _ddce +1>=len (data ){return _gc .NRGBA {},_efac (x ,y );};const (_faffa =0xf;
|
|
|
|
_cfbd =uint8 (0xff););_becb :=_cfbd ;if alpha !=nil {_cfbdc :=y *BytesPerLine (width ,4,1);if _cfbdc < len (alpha ){if x %2==0{_becb =(alpha [_cfbdc ]>>uint (4))&_faffa ;}else {_becb =alpha [_cfbdc ]&_faffa ;};_becb |=_becb <<4;};};var _ggfd ,_cbae ,_fcafc uint8 ;
|
|
|
|
if x *3%2==0{_ggfd =(data [_ddce ]>>uint (4))&_faffa ;_cbae =data [_ddce ]&_faffa ;_fcafc =(data [_ddce +1]>>uint (4))&_faffa ;}else {_ggfd =data [_ddce ]&_faffa ;_cbae =(data [_ddce +1]>>uint (4))&_faffa ;_fcafc =data [_ddce +1]&_faffa ;};if len (decode )==6{_ggfd =uint8 (uint32 (LinearInterpolate (float64 (_ggfd ),0,15,decode [0],decode [1]))&0xf);
|
|
|
|
_cbae =uint8 (uint32 (LinearInterpolate (float64 (_cbae ),0,15,decode [2],decode [3]))&0xf);_fcafc =uint8 (uint32 (LinearInterpolate (float64 (_fcafc ),0,15,decode [4],decode [5]))&0xf);};return _gc .NRGBA {R :(_ggfd <<4)|(_ggfd &0xf),G :(_cbae <<4)|(_cbae &0xf),B :(_fcafc <<4)|(_fcafc &0xf),A :_becb },nil ;
|
|
|
|
};func (_fgfa *Monochrome )Histogram ()(_egae [256]int ){for _ ,_gae :=range _fgfa .Data {_egae [0xff]+=int (_fecdb [_fgfa .Data [_gae ]]);};return _egae ;};func (_gaeb *NRGBA32 )setRGBA (_cfcc int ,_gedfd _gc .NRGBA ){_adgd :=3*_cfcc ;_gaeb .Data [_adgd ]=_gedfd .R ;
|
|
|
|
_gaeb .Data [_adgd +1]=_gedfd .G ;_gaeb .Data [_adgd +2]=_gedfd .B ;if _cfcc < len (_gaeb .Alpha ){_gaeb .Alpha [_cfcc ]=_gedfd .A ;};};func ColorAt (x ,y ,width ,bitsPerColor ,colorComponents ,bytesPerLine int ,data ,alpha []byte ,decode []float64 )(_gc .Color ,error ){switch colorComponents {case 1:return ColorAtGrayscale (x ,y ,bitsPerColor ,bytesPerLine ,data ,decode );
|
|
|
|
case 3:return ColorAtNRGBA (x ,y ,width ,bytesPerLine ,bitsPerColor ,data ,alpha ,decode );case 4:return ColorAtCMYK (x ,y ,width ,data ,decode );default:return nil ,_e .Errorf ("\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0063o\u006c\u006f\u0072\u0020\u0063\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0020\u0066\u006f\u0072\u0020\u0074h\u0065\u0020\u0069\u006d\u0061\u0067\u0065\u003a\u0020\u0025\u0064",colorComponents );
|
|
|
|
};};func ColorAtGray16BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_gc .Gray16 ,error ){_effc :=(y *bytesPerLine /2+x )*2;if _effc +1>=len (data ){return _gc .Gray16 {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
|
|
};_fgee :=uint16 (data [_effc ])<<8|uint16 (data [_effc +1]);if len (decode )==2{_fgee =uint16 (uint64 (LinearInterpolate (float64 (_fgee ),0,65535,decode [0],decode [1])));};return _gc .Gray16 {Y :_fgee },nil ;};func _bdcf (_dgae *_f .NYCbCrA ,_cfee RGBA ,_gfee _f .Rectangle ){for _fdgb :=0;
|
|
|
|
_fdgb < _gfee .Max .X ;_fdgb ++{for _eebcc :=0;_eebcc < _gfee .Max .Y ;_eebcc ++{_eadbb :=_dgae .NYCbCrAAt (_fdgb ,_eebcc );_cfee .SetRGBA (_fdgb ,_eebcc ,_bfbf (_eadbb ));};};};func _daae (_fgfae int ,_fbeg int )int {if _fgfae < _fbeg {return _fgfae ;
|
|
|
|
};return _fbeg ;};func (_gabc *RGBA32 )Copy ()Image {return &RGBA32 {ImageBase :_gabc .copy ()}};func (_aeb *NRGBA64 )Base ()*ImageBase {return &_aeb .ImageBase };type RGBA32 struct{ImageBase };func (_cgbe *Monochrome )copy ()*Monochrome {_bage :=_cea (_cgbe .Width ,_cgbe .Height );
|
|
|
|
_bage .ModelThreshold =_cgbe .ModelThreshold ;_bage .Data =make ([]byte ,len (_cgbe .Data ));copy (_bage .Data ,_cgbe .Data );if len (_cgbe .Decode )!=0{_bage .Decode =make ([]float64 ,len (_cgbe .Decode ));copy (_bage .Decode ,_cgbe .Decode );};if len (_cgbe .Alpha )!=0{_bage .Alpha =make ([]byte ,len (_cgbe .Alpha ));
|
|
|
|
copy (_bage .Alpha ,_cgbe .Alpha );};return _bage ;};func (_eggg *Monochrome )Scale (scale float64 )(*Monochrome ,error ){var _ffce bool ;_egge :=scale ;if scale < 1{_egge =1/scale ;_ffce =true ;};_eaa :=NextPowerOf2 (uint (_egge ));if InDelta (float64 (_eaa ),_egge ,0.001){if _ffce {return _eggg .ReduceBinary (_egge );
|
|
|
|
};return _eggg .ExpandBinary (int (_eaa ));};_afgg :=int (_d .RoundToEven (float64 (_eggg .Width )*scale ));_cfdfe :=int (_d .RoundToEven (float64 (_eggg .Height )*scale ));return _eggg .ScaleLow (_afgg ,_cfdfe );};func _eadc (_gbdg uint8 )bool {if _gbdg ==0||_gbdg ==255{return true ;
|
|
|
|
};return false ;};func (_ddfef *Gray16 )Copy ()Image {return &Gray16 {ImageBase :_ddfef .copy ()}};func (_bfbce *Gray2 )Set (x ,y int ,c _gc .Color ){if x >=_bfbce .Width ||y >=_bfbce .Height {return ;};_dgaa :=Gray2Model .Convert (c ).(_gc .Gray );_ggba :=y *_bfbce .BytesPerLine ;
|
|
|
|
_cabf :=_ggba +(x >>2);_ddgf :=_dgaa .Y >>6;_bfbce .Data [_cabf ]=(_bfbce .Data [_cabf ]&(^(0xc0>>uint (2*((x )&3)))))|(_ddgf <<uint (6-2*(x &3)));};func (_caac *Gray8 )ColorModel ()_gc .Model {return _gc .GrayModel };func (_feab *Monochrome )AddPadding ()(_cafed error ){if _aeff :=((_feab .Width *_feab .Height )+7)>>3;
|
|
|
|
len (_feab .Data )< _aeff {return _e .Errorf ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0064a\u0074\u0061\u0020\u006c\u0065\u006e\u0067\u0074\u0068\u003a\u0020\u0027\u0025\u0064\u0027\u002e\u0020\u0054\u0068\u0065\u0020\u0064\u0061t\u0061\u0020s\u0068\u006fu\u006c\u0064\u0020\u0063\u006f\u006e\u0074\u0061\u0069\u006e\u0020\u0061\u0074 l\u0065\u0061\u0073\u0074\u003a\u0020\u0027\u0025\u0064'\u0020\u0062\u0079\u0074\u0065\u0073",len (_feab .Data ),_aeff );
|
|
|
|
};_fdbae :=_feab .Width %8;if _fdbae ==0{return nil ;};_dfabg :=_feab .Width /8;_aeca :=_fe .NewReader (_feab .Data );_cdf :=make ([]byte ,_feab .Height *_feab .BytesPerLine );_dcfd :=_fe .NewWriterMSB (_cdf );_efbg :=make ([]byte ,_dfabg );var (_gcgb int ;
|
|
|
|
_cca uint64 ;);for _gcgb =0;_gcgb < _feab .Height ;_gcgb ++{if _ ,_cafed =_aeca .Read (_efbg );_cafed !=nil {return _cafed ;};if _ ,_cafed =_dcfd .Write (_efbg );_cafed !=nil {return _cafed ;};if _cca ,_cafed =_aeca .ReadBits (byte (_fdbae ));_cafed !=nil {return _cafed ;
|
|
|
|
};if _cafed =_dcfd .WriteByte (byte (_cca )<<uint (8-_fdbae ));_cafed !=nil {return _cafed ;};};_feab .Data =_dcfd .Data ();return nil ;};func _bfad (_ecb _gc .NRGBA )_gc .RGBA {_fecd ,_fcaf ,_bec ,_afd :=_ecb .RGBA ();return _gc .RGBA {R :uint8 (_fecd >>8),G :uint8 (_fcaf >>8),B :uint8 (_bec >>8),A :uint8 (_afd >>8)};
|
|
|
|
};func init (){_beca ()};func RasterOperation (dest *Monochrome ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Monochrome ,sx ,sy int )error {return _abdd (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func (_gcdc *ImageBase )setEightBytes (_bgbb int ,_cgfd uint64 )error {_cadd :=_gcdc .BytesPerLine -(_bgbb %_gcdc .BytesPerLine );
|
|
|
|
if _gcdc .BytesPerLine !=_gcdc .Width >>3{_cadd --;};if _cadd >=8{return _gcdc .setEightFullBytes (_bgbb ,_cgfd );};return _gcdc .setEightPartlyBytes (_bgbb ,_cadd ,_cgfd );};type RGBA interface{RGBAAt (_bafb ,_agdbg int )_gc .RGBA ;SetRGBA (_dbdb ,_fed int ,_bceb _gc .RGBA );
|
|
|
|
};func MonochromeModel (threshold uint8 )_gc .Model {return monochromeModel (threshold )};func (_bggf *Gray4 )Copy ()Image {return &Gray4 {ImageBase :_bggf .copy ()}};func (_fcf *Gray8 )Histogram ()(_dec [256]int ){for _bgga :=0;_bgga < len (_fcf .Data );
|
|
|
|
_bgga ++{_dec [_fcf .Data [_bgga ]]++;};return _dec ;};func _bfef (_fbab uint )uint {var _gcad uint ;for _fbab !=0{_fbab >>=1;_gcad ++;};return _gcad -1;};func (_dgce *Monochrome )clearBit (_dfdg ,_baff int ){_dgce .Data [_dfdg ]&=^(0x80>>uint (_baff &7))};
|
|
|
|
type NRGBA interface{NRGBAAt (_deea ,_edcc int )_gc .NRGBA ;SetNRGBA (_dgbgb ,_bcaf int ,_ffcd _gc .NRGBA );};func ColorAtGrayscale (x ,y ,bitsPerColor ,bytesPerLine int ,data []byte ,decode []float64 )(_gc .Color ,error ){switch bitsPerColor {case 1:return ColorAtGray1BPC (x ,y ,bytesPerLine ,data ,decode );
|
|
|
|
case 2:return ColorAtGray2BPC (x ,y ,bytesPerLine ,data ,decode );case 4:return ColorAtGray4BPC (x ,y ,bytesPerLine ,data ,decode );case 8:return ColorAtGray8BPC (x ,y ,bytesPerLine ,data ,decode );case 16:return ColorAtGray16BPC (x ,y ,bytesPerLine ,data ,decode );
|
|
|
|
default:return nil ,_e .Errorf ("\u0075\u006e\u0073\u0075\u0070\u0070\u006f\u0072\u0074\u0065\u0064\u0020\u0067\u0072\u0061\u0079\u0020\u0073c\u0061\u006c\u0065\u0020\u0062\u0069\u0074s\u0020\u0070\u0065\u0072\u0020\u0063\u006f\u006c\u006f\u0072\u0020a\u006d\u006f\u0075\u006e\u0074\u003a\u0020\u0027\u0025\u0064\u0027",bitsPerColor );
|
|
|
|
};};func _gedca (_dcafd *_f .Gray ,_eccc uint8 )*_f .Gray {_abea :=_dcafd .Bounds ();_cgbee :=_f .NewGray (_abea );for _cege :=0;_cege < _abea .Dx ();_cege ++{for _cfbg :=0;_cfbg < _abea .Dy ();_cfbg ++{_ddceg :=_dcafd .GrayAt (_cege ,_cfbg );_cgbee .SetGray (_cege ,_cfbg ,_gc .Gray {Y :_adf (_ddceg .Y ,_eccc )});
|
|
|
|
};};return _cgbee ;};func (_acab *Gray16 )GrayAt (x ,y int )_gc .Gray {_fgfe ,_ :=_acab .ColorAt (x ,y );return _gc .Gray {Y :uint8 (_fgfe .(_gc .Gray16 ).Y >>8)};};func (_bgbg *NRGBA64 )Copy ()Image {return &NRGBA64 {ImageBase :_bgbg .copy ()}};var _ _f .Image =&Gray4 {};
|
|
|
|
func _bcc (_eccb _gc .NRGBA )_gc .Gray {var _agcb _gc .NRGBA ;if _eccb ==_agcb {return _gc .Gray {Y :0xff};};_abb ,_faff ,_cbdf ,_ :=_eccb .RGBA ();_efd :=(19595*_abb +38470*_faff +7471*_cbdf +1<<15)>>24;return _gc .Gray {Y :uint8 (_efd )};};func _gd (_cdd ,_aabg *Monochrome )(_eee error ){_dd :=_aabg .BytesPerLine ;
|
|
|
|
_dfc :=_cdd .BytesPerLine ;_dae :=_aabg .BytesPerLine *4-_cdd .BytesPerLine ;var (_ac ,_dc byte ;_gbb uint32 ;_cafe ,_dcb ,_dg ,_dgg ,_fb ,_ead ,_gde int ;);for _dg =0;_dg < _aabg .Height ;_dg ++{_cafe =_dg *_dd ;_dcb =4*_dg *_dfc ;for _dgg =0;_dgg < _dd ;
|
|
|
|
_dgg ++{_ac =_aabg .Data [_cafe +_dgg ];_gbb =_cbd [_ac ];_ead =_dcb +_dgg *4;if _dae !=0&&(_dgg +1)*4> _cdd .BytesPerLine {for _fb =_dae ;_fb > 0;_fb --{_dc =byte ((_gbb >>uint (_fb *8))&0xff);_gde =_ead +(_dae -_fb );if _eee =_cdd .setByte (_gde ,_dc );
|
|
|
|
_eee !=nil {return _eee ;};};}else if _eee =_cdd .setFourBytes (_ead ,_gbb );_eee !=nil {return _eee ;};if _eee =_cdd .setFourBytes (_dcb +_dgg *4,_cbd [_aabg .Data [_cafe +_dgg ]]);_eee !=nil {return _eee ;};};for _fb =1;_fb < 4;_fb ++{for _dgg =0;_dgg < _dfc ;
|
|
|
|
_dgg ++{if _eee =_cdd .setByte (_dcb +_fb *_dfc +_dgg ,_cdd .Data [_dcb +_dgg ]);_eee !=nil {return _eee ;};};};};return nil ;};func (_cfda *Monochrome )Copy ()Image {return &Monochrome {ImageBase :_cfda .ImageBase .copy (),ModelThreshold :_cfda .ModelThreshold };
|
|
|
|
};func (_bcfg *Monochrome )setBit (_cbcf ,_egbf int ){_bcfg .Data [_cbcf +(_egbf >>3)]|=0x80>>uint (_egbf &7);};func (_agdb *Gray16 )ColorAt (x ,y int )(_gc .Color ,error ){return ColorAtGray16BPC (x ,y ,_agdb .BytesPerLine ,_agdb .Data ,_agdb .Decode );
|
|
|
|
};func (_fdae *RGBA32 )Base ()*ImageBase {return &_fdae .ImageBase };func (_aff *Gray16 )Bounds ()_f .Rectangle {return _f .Rectangle {Max :_f .Point {X :_aff .Width ,Y :_aff .Height }};};func (_dedc *NRGBA16 )ColorModel ()_gc .Model {return NRGBA16Model };
|
|
|
|
func _bbce (_egbg _gc .Color )_gc .Color {_gfda :=_gc .GrayModel .Convert (_egbg ).(_gc .Gray );return _dagf (_gfda );};func (_gee *CMYK32 )Validate ()error {if len (_gee .Data )!=4*_gee .Width *_gee .Height {return _a .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 (_cefa *ImageBase )Pix ()[]byte {return _cefa .Data };func (_dfdf *RGBA32 )Bounds ()_f .Rectangle {return _f .Rectangle {Max :_f .Point {X :_dfdf .Width ,Y :_dfdf .Height }};};func (_afca *Monochrome )getBit (_edfg ,_eggf int )uint8 {return _afca .Data [_edfg +(_eggf >>3)]>>uint (7-(_eggf &7))&1;
|
|
|
|
};func _ggcd (_ffbag *_f .Gray )bool {for _ddbg :=0;_ddbg < len (_ffbag .Pix );_ddbg ++{if !_eadc (_ffbag .Pix [_ddbg ]){return false ;};};return true ;};func _fga (_eba ,_gefd *Monochrome ,_ced []byte ,_ceg int )(_gcc error ){var (_cfb ,_fad ,_faf ,_ag ,_aaab ,_dcc ,_aga ,_dcg int ;
|
|
|
|
_fec ,_dgf ,_fgag ,_cae uint32 ;_gbf ,_bdf byte ;_acf uint16 ;);_ade :=make ([]byte ,4);_bfg :=make ([]byte ,4);for _faf =0;_faf < _eba .Height -1;_faf ,_ag =_faf +2,_ag +1{_cfb =_faf *_eba .BytesPerLine ;_fad =_ag *_gefd .BytesPerLine ;for _aaab ,_dcc =0,0;
|
|
|
|
_aaab < _ceg ;_aaab ,_dcc =_aaab +4,_dcc +1{for _aga =0;_aga < 4;_aga ++{_dcg =_cfb +_aaab +_aga ;if _dcg <=len (_eba .Data )-1&&_dcg < _cfb +_eba .BytesPerLine {_ade [_aga ]=_eba .Data [_dcg ];}else {_ade [_aga ]=0x00;};_dcg =_cfb +_eba .BytesPerLine +_aaab +_aga ;
|
|
|
|
if _dcg <=len (_eba .Data )-1&&_dcg < _cfb +(2*_eba .BytesPerLine ){_bfg [_aga ]=_eba .Data [_dcg ];}else {_bfg [_aga ]=0x00;};};_fec =_ab .BigEndian .Uint32 (_ade );_dgf =_ab .BigEndian .Uint32 (_bfg );_fgag =_fec &_dgf ;_fgag |=_fgag <<1;_cae =_fec |_dgf ;
|
|
|
|
_cae &=_cae <<1;_dgf =_fgag &_cae ;_dgf &=0xaaaaaaaa;_fec =_dgf |(_dgf <<7);_gbf =byte (_fec >>24);_bdf =byte ((_fec >>8)&0xff);_dcg =_fad +_dcc ;if _dcg +1==len (_gefd .Data )-1||_dcg +1>=_fad +_gefd .BytesPerLine {if _gcc =_gefd .setByte (_dcg ,_ced [_gbf ]);
|
|
|
|
_gcc !=nil {return _e .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_dcg );};}else {_acf =(uint16 (_ced [_gbf ])<<8)|uint16 (_ced [_bdf ]);if _gcc =_gefd .setTwoBytes (_dcg ,_acf );_gcc !=nil {return _e .Errorf ("s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_dcg );
|
|
|
|
};_dcc ++;};};};return nil ;};var _fecdb [256]uint8 ;var _ _f .Image =&Gray8 {};func (_cfg *CMYK32 )CMYKAt (x ,y int )_gc .CMYK {_bbc ,_ :=ColorAtCMYK (x ,y ,_cfg .Width ,_cfg .Data ,_cfg .Decode );return _bbc ;};func (_egca *Monochrome )setGray (_adef int ,_ffcf _gc .Gray ,_cdb int ){if _ffcf .Y ==0{_egca .clearBit (_cdb ,_adef );
|
|
|
|
}else {_egca .setGrayBit (_cdb ,_adef );};};func (_aag *Monochrome )ExpandBinary (factor int )(*Monochrome ,error ){if !IsPowerOf2 (uint (factor )){return nil ,_e .Errorf ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0065\u0078\u0070\u0061\u006e\u0064\u0020b\u0069n\u0061\u0072\u0079\u0020\u0066\u0061\u0063\u0074\u006f\u0072\u003a\u0020\u0025\u0064",factor );
|
|
|
|
};return _ebc (_aag ,factor );};func _dcca (_fbfg _f .Image ,_daf Image ,_edfa _f .Rectangle ){for _aaaf :=0;_aaaf < _edfa .Max .X ;_aaaf ++{for _bcea :=0;_bcea < _edfa .Max .Y ;_bcea ++{_fgf :=_fbfg .At (_aaaf ,_bcea );_daf .Set (_aaaf ,_bcea ,_fgf );
|
|
|
|
};};};type NRGBA16 struct{ImageBase };func ConverterFunc (converterFunc func (_ddcf _f .Image )(Image ,error ))ColorConverter {return colorConverter {_bbefc :converterFunc };};func (_eac *Gray4 )Validate ()error {if len (_eac .Data )!=_eac .Height *_eac .BytesPerLine {return ErrInvalidImage ;
|
|
|
|
};return nil ;};func (_eeaga *RGBA32 )ColorModel ()_gc .Model {return _gc .NRGBAModel };func (_gcf *Gray2 )ColorAt (x ,y int )(_gc .Color ,error ){return ColorAtGray2BPC (x ,y ,_gcf .BytesPerLine ,_gcf .Data ,_gcf .Decode );};var _ Image =&CMYK32 {};func _ccca (_bbcc *Monochrome ,_ddeb ,_bacd ,_bagg ,_deaa int ,_ggf RasterOperator ,_adagd *Monochrome ,_fdbc ,_aedd int )error {var (_dbdd bool ;
|
|
|
|
_abab bool ;_gfce byte ;_dfgg int ;_egffd int ;_dccc int ;_eaeee int ;_dffc bool ;_fcgae int ;_ccdg int ;_fcge int ;_cdfd bool ;_gcbc byte ;_debe int ;_gggfa int ;_cffec int ;_bfafb byte ;_ecea int ;_geec int ;_dgcg uint ;_dbec uint ;_fbcg byte ;_cedf shift ;
|
|
|
|
_cdcf bool ;_afaa bool ;_agad ,_fbg int ;);if _fdbc &7!=0{_geec =8-(_fdbc &7);};if _ddeb &7!=0{_egffd =8-(_ddeb &7);};if _geec ==0&&_egffd ==0{_fbcg =_gbfg [0];}else {if _egffd > _geec {_dgcg =uint (_egffd -_geec );}else {_dgcg =uint (8-(_geec -_egffd ));
|
|
|
|
};_dbec =8-_dgcg ;_fbcg =_gbfg [_dgcg ];};if (_ddeb &7)!=0{_dbdd =true ;_dfgg =8-(_ddeb &7);_gfce =_gbfg [_dfgg ];_dccc =_bbcc .BytesPerLine *_bacd +(_ddeb >>3);_eaeee =_adagd .BytesPerLine *_aedd +(_fdbc >>3);_ecea =8-(_fdbc &7);if _dfgg > _ecea {_cedf =_ddgfe ;
|
|
|
|
if _bagg >=_geec {_cdcf =true ;};}else {_cedf =_ffga ;};};if _bagg < _dfgg {_abab =true ;_gfce &=_egcfb [8-_dfgg +_bagg ];};if !_abab {_fcgae =(_bagg -_dfgg )>>3;if _fcgae !=0{_dffc =true ;_ccdg =_bbcc .BytesPerLine *_bacd +((_ddeb +_egffd )>>3);_fcge =_adagd .BytesPerLine *_aedd +((_fdbc +_egffd )>>3);
|
|
|
|
};};_debe =(_ddeb +_bagg )&7;if !(_abab ||_debe ==0){_cdfd =true ;_gcbc =_egcfb [_debe ];_gggfa =_bbcc .BytesPerLine *_bacd +((_ddeb +_egffd )>>3)+_fcgae ;_cffec =_adagd .BytesPerLine *_aedd +((_fdbc +_egffd )>>3)+_fcgae ;if _debe > int (_dbec ){_afaa =true ;
|
|
|
|
};};switch _ggf {case PixSrc :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;
|
|
|
|
};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],_bfafb ,_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;};};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );
|
|
|
|
_bbcc .Data [_ccdg +_fbg ]=_bfafb ;};_ccdg +=_bbcc .BytesPerLine ;_fcge +=_adagd .BytesPerLine ;};};if _cdfd {for _agad =0;_agad < _deaa ;_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );
|
|
|
|
};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],_bfafb ,_gcbc );_gggfa +=_bbcc .BytesPerLine ;_cffec +=_adagd .BytesPerLine ;};};case PixNotSrc :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;
|
|
|
|
if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],^_bfafb ,_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;};
|
|
|
|
};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );_bbcc .Data [_ccdg +_fbg ]=^_bfafb ;};_ccdg +=_bbcc .BytesPerLine ;_fcge +=_adagd .BytesPerLine ;
|
|
|
|
};};if _cdfd {for _agad =0;_agad < _deaa ;_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],^_bfafb ,_gcbc );_gggfa +=_bbcc .BytesPerLine ;
|
|
|
|
_cffec +=_adagd .BytesPerLine ;};};case PixSrcOrDst :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;
|
|
|
|
};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],_bfafb |_bbcc .Data [_dccc ],_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;};};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );
|
|
|
|
_bbcc .Data [_ccdg +_fbg ]|=_bfafb ;};_ccdg +=_bbcc .BytesPerLine ;_fcge +=_adagd .BytesPerLine ;};};if _cdfd {for _agad =0;_agad < _deaa ;_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );
|
|
|
|
};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],_bfafb |_bbcc .Data [_gggfa ],_gcbc );_gggfa +=_bbcc .BytesPerLine ;_cffec +=_adagd .BytesPerLine ;};};case PixSrcAndDst :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;
|
|
|
|
if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],_bfafb &_bbcc .Data [_dccc ],_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;
|
|
|
|
};};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );_bbcc .Data [_ccdg +_fbg ]&=_bfafb ;};_ccdg +=_bbcc .BytesPerLine ;_fcge +=_adagd .BytesPerLine ;
|
|
|
|
};};if _cdfd {for _agad =0;_agad < _deaa ;_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],_bfafb &_bbcc .Data [_gggfa ],_gcbc );
|
|
|
|
_gggfa +=_bbcc .BytesPerLine ;_cffec +=_adagd .BytesPerLine ;};};case PixSrcXorDst :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );
|
|
|
|
};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],_bfafb ^_bbcc .Data [_dccc ],_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;};};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;
|
|
|
|
_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );_bbcc .Data [_ccdg +_fbg ]^=_bfafb ;};_ccdg +=_bbcc .BytesPerLine ;_fcge +=_adagd .BytesPerLine ;};};if _cdfd {for _agad =0;_agad < _deaa ;
|
|
|
|
_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],_bfafb ^_bbcc .Data [_gggfa ],_gcbc );_gggfa +=_bbcc .BytesPerLine ;_cffec +=_adagd .BytesPerLine ;
|
|
|
|
};};case PixNotSrcOrDst :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;
|
|
|
|
};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],^_bfafb |_bbcc .Data [_dccc ],_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;};};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );
|
|
|
|
_bbcc .Data [_ccdg +_fbg ]|=^_bfafb ;};_ccdg +=_bbcc .BytesPerLine ;_fcge +=_adagd .BytesPerLine ;};};if _cdfd {for _agad =0;_agad < _deaa ;_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );
|
|
|
|
};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],^_bfafb |_bbcc .Data [_gggfa ],_gcbc );_gggfa +=_bbcc .BytesPerLine ;_cffec +=_adagd .BytesPerLine ;};};case PixNotSrcAndDst :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;
|
|
|
|
if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],^_bfafb &_bbcc .Data [_dccc ],_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;
|
|
|
|
};};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );_bbcc .Data [_ccdg +_fbg ]&=^_bfafb ;};_ccdg +=_bbcc .BytesPerLine ;_fcge +=_adagd .BytesPerLine ;
|
|
|
|
};};if _cdfd {for _agad =0;_agad < _deaa ;_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],^_bfafb &_bbcc .Data [_gggfa ],_gcbc );
|
|
|
|
_gggfa +=_bbcc .BytesPerLine ;_cffec +=_adagd .BytesPerLine ;};};case PixSrcOrNotDst :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );
|
|
|
|
};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],_bfafb |^_bbcc .Data [_dccc ],_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;};};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;
|
|
|
|
_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );_bbcc .Data [_ccdg +_fbg ]=_bfafb |^_bbcc .Data [_ccdg +_fbg ];};_ccdg +=_bbcc .BytesPerLine ;_fcge +=_adagd .BytesPerLine ;};};if _cdfd {for _agad =0;
|
|
|
|
_agad < _deaa ;_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],_bfafb |^_bbcc .Data [_gggfa ],_gcbc );_gggfa +=_bbcc .BytesPerLine ;
|
|
|
|
_cffec +=_adagd .BytesPerLine ;};};case PixSrcAndNotDst :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;
|
|
|
|
};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],_bfafb &^_bbcc .Data [_dccc ],_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;};};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );
|
|
|
|
_bbcc .Data [_ccdg +_fbg ]=_bfafb &^_bbcc .Data [_ccdg +_fbg ];};_ccdg +=_bbcc .BytesPerLine ;_fcge +=_adagd .BytesPerLine ;};};if _cdfd {for _agad =0;_agad < _deaa ;_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );
|
|
|
|
};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],_bfafb &^_bbcc .Data [_gggfa ],_gcbc );_gggfa +=_bbcc .BytesPerLine ;_cffec +=_adagd .BytesPerLine ;};};case PixNotPixSrcOrDst :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;
|
|
|
|
if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],^(_bfafb |_bbcc .Data [_dccc ]),_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;
|
|
|
|
};};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );_bbcc .Data [_ccdg +_fbg ]=^(_bfafb |_bbcc .Data [_ccdg +_fbg ]);};_ccdg +=_bbcc .BytesPerLine ;
|
|
|
|
_fcge +=_adagd .BytesPerLine ;};};if _cdfd {for _agad =0;_agad < _deaa ;_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],^(_bfafb |_bbcc .Data [_gggfa ]),_gcbc );
|
|
|
|
_gggfa +=_bbcc .BytesPerLine ;_cffec +=_adagd .BytesPerLine ;};};case PixNotPixSrcAndDst :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );
|
|
|
|
};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],^(_bfafb &_bbcc .Data [_dccc ]),_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;};};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;
|
|
|
|
_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );_bbcc .Data [_ccdg +_fbg ]=^(_bfafb &_bbcc .Data [_ccdg +_fbg ]);};_ccdg +=_bbcc .BytesPerLine ;_fcge +=_adagd .BytesPerLine ;};};if _cdfd {for _agad =0;
|
|
|
|
_agad < _deaa ;_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],^(_bfafb &_bbcc .Data [_gggfa ]),_gcbc );_gggfa +=_bbcc .BytesPerLine ;
|
|
|
|
_cffec +=_adagd .BytesPerLine ;};};case PixNotPixSrcXorDst :if _dbdd {for _agad =0;_agad < _deaa ;_agad ++{if _cedf ==_ddgfe {_bfafb =_adagd .Data [_eaeee ]<<_dgcg ;if _cdcf {_bfafb =_eaae (_bfafb ,_adagd .Data [_eaeee +1]>>_dbec ,_fbcg );};}else {_bfafb =_adagd .Data [_eaeee ]>>_dbec ;
|
|
|
|
};_bbcc .Data [_dccc ]=_eaae (_bbcc .Data [_dccc ],^(_bfafb ^_bbcc .Data [_dccc ]),_gfce );_dccc +=_bbcc .BytesPerLine ;_eaeee +=_adagd .BytesPerLine ;};};if _dffc {for _agad =0;_agad < _deaa ;_agad ++{for _fbg =0;_fbg < _fcgae ;_fbg ++{_bfafb =_eaae (_adagd .Data [_fcge +_fbg ]<<_dgcg ,_adagd .Data [_fcge +_fbg +1]>>_dbec ,_fbcg );
|
|
|
|
_bbcc .Data [_ccdg +_fbg ]=^(_bfafb ^_bbcc .Data [_ccdg +_fbg ]);};_ccdg +=_bbcc .BytesPerLine ;_fcge +=_adagd .BytesPerLine ;};};if _cdfd {for _agad =0;_agad < _deaa ;_agad ++{_bfafb =_adagd .Data [_cffec ]<<_dgcg ;if _afaa {_bfafb =_eaae (_bfafb ,_adagd .Data [_cffec +1]>>_dbec ,_fbcg );
|
|
|
|
};_bbcc .Data [_gggfa ]=_eaae (_bbcc .Data [_gggfa ],^(_bfafb ^_bbcc .Data [_gggfa ]),_gcbc );_gggfa +=_bbcc .BytesPerLine ;_cffec +=_adagd .BytesPerLine ;};};default:_eb .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",_ggf );
|
|
|
|
return _a .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 ColorAtGray1BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_gc .Gray ,error ){_aefc :=y *bytesPerLine +x >>3;
|
|
|
|
if _aefc >=len (data ){return _gc .Gray {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
|
|
};_egcc :=data [_aefc ]>>uint (7-(x &7))&1;if len (decode )==2{_egcc =uint8 (LinearInterpolate (float64 (_egcc ),0.0,1.0,decode [0],decode [1]))&1;};return _gc .Gray {Y :_egcc *255},nil ;};func ImgToGray (i _f .Image )*_f .Gray {if _acdcb ,_ccfe :=i .(*_f .Gray );
|
|
|
|
_ccfe {return _acdcb ;};_feb :=i .Bounds ();_gdgf :=_f .NewGray (_feb );for _eaga :=0;_eaga < _feb .Max .X ;_eaga ++{for _cefbf :=0;_cefbf < _feb .Max .Y ;_cefbf ++{_dcac :=i .At (_eaga ,_cefbf );_gdgf .Set (_eaga ,_cefbf ,_dcac );};};return _gdgf ;};type nrgba64 interface{NRGBA64At (_edcg ,_feac int )_gc .NRGBA64 ;
|
|
|
|
SetNRGBA64 (_becc ,_bdecf int ,_eace _gc .NRGBA64 );};var _ NRGBA =&NRGBA32 {};var _ Image =&Gray4 {};func ColorAtCMYK (x ,y ,width int ,data []byte ,decode []float64 )(_gc .CMYK ,error ){_ecg :=4*(y *width +x );if _ecg +3>=len (data ){return _gc .CMYK {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
|
|
};C :=data [_ecg ]&0xff;M :=data [_ecg +1]&0xff;Y :=data [_ecg +2]&0xff;K :=data [_ecg +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 _gc .CMYK {C :C ,M :M ,Y :Y ,K :K },nil ;};func (_bgdc *Gray8 )SetGray (x ,y int ,g _gc .Gray ){_agfg :=y *_bgdc .BytesPerLine +x ;
|
|
|
|
if _agfg > len (_bgdc .Data )-1{return ;};_bgdc .Data [_agfg ]=g .Y ;};func (_cgbg *Gray4 )ColorAt (x ,y int )(_gc .Color ,error ){return ColorAtGray4BPC (x ,y ,_cgbg .BytesPerLine ,_cgbg .Data ,_cgbg .Decode );};func _feg (_dbace NRGBA ,_gfdeg RGBA ,_aefd _f .Rectangle ){for _ggfdd :=0;
|
|
|
|
_ggfdd < _aefd .Max .X ;_ggfdd ++{for _cccd :=0;_cccd < _aefd .Max .Y ;_cccd ++{_bdgc :=_dbace .NRGBAAt (_ggfdd ,_cccd );_gfdeg .SetRGBA (_ggfdd ,_cccd ,_bfad (_bdgc ));};};};func _deba (_gfed *Monochrome ,_gdec ,_cdcdb ,_cafa ,_adcd int ,_dgbdb RasterOperator ){if _gdec < 0{_cafa +=_gdec ;
|
|
|
|
_gdec =0;};_efdd :=_gdec +_cafa -_gfed .Width ;if _efdd > 0{_cafa -=_efdd ;};if _cdcdb < 0{_adcd +=_cdcdb ;_cdcdb =0;};_edeb :=_cdcdb +_adcd -_gfed .Height ;if _edeb > 0{_adcd -=_edeb ;};if _cafa <=0||_adcd <=0{return ;};if (_gdec &7)==0{_ecdda (_gfed ,_gdec ,_cdcdb ,_cafa ,_adcd ,_dgbdb );
|
|
|
|
}else {_fbga (_gfed ,_gdec ,_cdcdb ,_cafa ,_adcd ,_dgbdb );};};func (_eab *ImageBase )setByte (_ebgg int ,_cddg byte )error {if _ebgg > len (_eab .Data )-1{return _a .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
|
|
};_eab .Data [_ebgg ]=_cddg ;return nil ;};var _ _f .Image =&NRGBA64 {};func (_cedc *Gray8 )ColorAt (x ,y int )(_gc .Color ,error ){return ColorAtGray8BPC (x ,y ,_cedc .BytesPerLine ,_cedc .Data ,_cedc .Decode );};func (_ddgcd *Gray2 )GrayAt (x ,y int )_gc .Gray {_ecbc ,_ :=ColorAtGray2BPC (x ,y ,_ddgcd .BytesPerLine ,_ddgcd .Data ,_ddgcd .Decode );
|
|
|
|
return _ecbc ;};func (_ecdb *ImageBase )GetAlpha ()[]byte {return _ecdb .Alpha };func _cabc (_accf _gc .Gray )_gc .RGBA {return _gc .RGBA {R :_accf .Y ,G :_accf .Y ,B :_accf .Y ,A :0xff}};func (_cegf *Monochrome )GrayAt (x ,y int )_gc .Gray {_eada ,_ :=ColorAtGray1BPC (x ,y ,_cegf .BytesPerLine ,_cegf .Data ,_cegf .Decode );
|
|
|
|
return _eada ;};func ColorAtNRGBA (x ,y ,width ,bytesPerLine ,bitsPerColor int ,data ,alpha []byte ,decode []float64 )(_gc .Color ,error ){switch bitsPerColor {case 4:return ColorAtNRGBA16 (x ,y ,width ,bytesPerLine ,data ,alpha ,decode );case 8:return ColorAtNRGBA32 (x ,y ,width ,data ,alpha ,decode );
|
|
|
|
case 16:return ColorAtNRGBA64 (x ,y ,width ,data ,alpha ,decode );default:return nil ,_e .Errorf ("\u0075\u006e\u0073\u0075\u0070\u0070\u006fr\u0074\u0065\u0064 \u0072\u0067\u0062\u0020b\u0069\u0074\u0073\u0020\u0070\u0065\u0072\u0020\u0063\u006f\u006c\u006f\u0072\u0020\u0061\u006d\u006f\u0075\u006e\u0074\u003a\u0020\u0027\u0025\u0064\u0027",bitsPerColor );
|
|
|
|
};};func _abaf (_efgd _gc .RGBA )_gc .CMYK {_efb ,_bgae ,_aabc ,_agcd :=_gc .RGBToCMYK (_efgd .R ,_efgd .G ,_efgd .B );return _gc .CMYK {C :_efb ,M :_bgae ,Y :_aabc ,K :_agcd };};func _bfeb (_bgdf _f .Image )(Image ,error ){if _bgaa ,_ggcc :=_bgdf .(*Gray16 );
|
|
|
|
_ggcc {return _bgaa .Copy (),nil ;};_gaaf :=_bgdf .Bounds ();_cga ,_fgcc :=NewImage (_gaaf .Max .X ,_gaaf .Max .Y ,16,1,nil ,nil ,nil );if _fgcc !=nil {return nil ,_fgcc ;};_afdd (_bgdf ,_cga ,_gaaf );return _cga ,nil ;};var (MonochromeConverter =ConverterFunc (_fafb );
|
|
|
|
Gray2Converter =ConverterFunc (_geca );Gray4Converter =ConverterFunc (_bdfc );GrayConverter =ConverterFunc (_ecgf );Gray16Converter =ConverterFunc (_bfeb );NRGBA16Converter =ConverterFunc (_bddf );NRGBAConverter =ConverterFunc (_fdbaf );NRGBA64Converter =ConverterFunc (_gfca );
|
|
|
|
RGBAConverter =ConverterFunc (_cdgd );CMYKConverter =ConverterFunc (_gfb ););func (_dgge *RGBA32 )SetRGBA (x ,y int ,c _gc .RGBA ){_cbfb :=y *_dgge .Width +x ;_bebb :=3*_cbfb ;if _bebb +2>=len (_dgge .Data ){return ;};_dgge .setRGBA (_cbfb ,c );};func (_gaef *Gray4 )Base ()*ImageBase {return &_gaef .ImageBase };
|
|
|
|
func _bedea (_edec *_f .Gray16 ,_gbcg uint8 )*_f .Gray {_ccff :=_edec .Bounds ();_ecbcg :=_f .NewGray (_ccff );for _edge :=0;_edge < _ccff .Dx ();_edge ++{for _afcfb :=0;_afcfb < _ccff .Dy ();_afcfb ++{_gfgc :=_edec .Gray16At (_edge ,_afcfb );_ecbcg .SetGray (_edge ,_afcfb ,_gc .Gray {Y :_adf (uint8 (_gfgc .Y /256),_gbcg )});
|
|
|
|
};};return _ecbcg ;};func (_gfbd *Monochrome )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Monochrome ,sx ,sy int )error {return _abdd (_gfbd ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};var (_egcfb =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};
|
|
|
|
_gbfg =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);func _adf (_faab ,_cccg uint8 )uint8 {if _faab < _cccg {return 255;};return 0;};var _ Image =&NRGBA32 {};func FromGoImage (i _f .Image )(Image ,error ){switch _fgeg :=i .(type ){case Image :return _fgeg .Copy (),nil ;
|
|
|
|
case Gray :return GrayConverter .Convert (i );case *_f .Gray16 :return Gray16Converter .Convert (i );case CMYK :return CMYKConverter .Convert (i );case *_f .NRGBA64 :return NRGBA64Converter .Convert (i );default:return NRGBAConverter .Convert (i );};};
|
|
|
|
func (_bace *NRGBA64 )Set (x ,y int ,c _gc .Color ){_fdf :=(y *_bace .Width +x )*2;_gdcb :=_fdf *3;if _gdcb +5>=len (_bace .Data ){return ;};_ccgb :=_gc .NRGBA64Model .Convert (c ).(_gc .NRGBA64 );_bace .setNRGBA64 (_gdcb ,_ccgb ,_fdf );};func (_dfg *Gray4 )SetGray (x ,y int ,g _gc .Gray ){if x >=_dfg .Width ||y >=_dfg .Height {return ;
|
|
|
|
};g =_baef (g );_dfg .setGray (x ,y ,g );};func (_ccef *NRGBA64 )ColorModel ()_gc .Model {return _gc .NRGBA64Model };func _fdaf (_ccg _gc .NRGBA )_gc .Gray {_bfe ,_ebcd ,_eeb ,_ :=_ccg .RGBA ();_aabb :=(19595*_bfe +38470*_ebcd +7471*_eeb +1<<15)>>24;return _gc .Gray {Y :uint8 (_aabb )};
|
|
|
|
};func (_dcae *Gray16 )Set (x ,y int ,c _gc .Color ){_eeea :=(y *_dcae .BytesPerLine /2+x )*2;if _eeea +1>=len (_dcae .Data ){return ;};_acgc :=_gc .Gray16Model .Convert (c ).(_gc .Gray16 );_dcae .Data [_eeea ],_dcae .Data [_eeea +1]=uint8 (_acgc .Y >>8),uint8 (_acgc .Y &0xff);
|
|
|
|
};func _dbag (_aedf _f .Image ,_afea Image ,_cdgb _f .Rectangle ){if _gbfef ,_defd :=_aedf .(SMasker );_defd &&_gbfef .HasAlpha (){_afea .(SMasker ).MakeAlpha ();};switch _fcaa :=_aedf .(type ){case Gray :_ecbge (_fcaa ,_afea .(RGBA ),_cdgb );case NRGBA :_feg (_fcaa ,_afea .(RGBA ),_cdgb );
|
|
|
|
case *_f .NYCbCrA :_bdcf (_fcaa ,_afea .(RGBA ),_cdgb );case CMYK :_fef (_fcaa ,_afea .(RGBA ),_cdgb );case RGBA :_ebdgb (_fcaa ,_afea .(RGBA ),_cdgb );case nrgba64 :_gebf (_fcaa ,_afea .(RGBA ),_cdgb );default:_dcca (_aedf ,_afea ,_cdgb );};};func (_dcaf *NRGBA16 )ColorAt (x ,y int )(_gc .Color ,error ){return ColorAtNRGBA16 (x ,y ,_dcaf .Width ,_dcaf .BytesPerLine ,_dcaf .Data ,_dcaf .Alpha ,_dcaf .Decode );
|
|
|
|
};func (_dcfa *Monochrome )getBitAt (_dbge ,_def int )bool {_abag :=_def *_dcfa .BytesPerLine +(_dbge >>3);_dbf :=_dbge &0x07;_abd :=uint (7-_dbf );if _abag > len (_dcfa .Data )-1{return false ;};if (_dcfa .Data [_abag ]>>_abd )&0x01>=1{return true ;};
|
|
|
|
return false ;};func (_dega *Gray8 )Copy ()Image {return &Gray8 {ImageBase :_dega .copy ()}};func (_bebg *ImageBase )setEightPartlyBytes (_cbda ,_gdda int ,_fabc uint64 )(_cecec error ){var (_ecbd byte ;_bcdf int ;);for _baga :=1;_baga <=_gdda ;_baga ++{_bcdf =64-_baga *8;
|
|
|
|
_ecbd =byte (_fabc >>uint (_bcdf )&0xff);if _cecec =_bebg .setByte (_cbda +_baga -1,_ecbd );_cecec !=nil {return _cecec ;};};_bded :=_bebg .BytesPerLine *8-_bebg .Width ;if _bded ==0{return nil ;};_bcdf -=8;_ecbd =byte (_fabc >>uint (_bcdf )&0xff)<<uint (_bded );
|
|
|
|
if _cecec =_bebg .setByte (_cbda +_gdda ,_ecbd );_cecec !=nil {return _cecec ;};return nil ;};func _face (_gcgd *_f .NYCbCrA ,_fdgca NRGBA ,_bdda _f .Rectangle ){for _cdec :=0;_cdec < _bdda .Max .X ;_cdec ++{for _becgb :=0;_becgb < _bdda .Max .Y ;_becgb ++{_egfgf :=_gcgd .NYCbCrAAt (_cdec ,_becgb );
|
|
|
|
_fdgca .SetNRGBA (_cdec ,_becgb ,_fdc (_egfgf ));};};};func _cdgd (_gedc _f .Image )(Image ,error ){if _bfbfd ,_efbcd :=_gedc .(*RGBA32 );_efbcd {return _bfbfd .Copy (),nil ;};_dedb ,_geadb ,_caccf :=_bfdb (_gedc ,1);_dfgb :=&RGBA32 {ImageBase :NewImageBase (_dedb .Max .X ,_dedb .Max .Y ,8,3,nil ,_caccf ,nil )};
|
|
|
|
_dbag (_gedc ,_dfgb ,_dedb );if len (_caccf )!=0&&!_geadb {if _dabf :=_abdc (_caccf ,_dfgb );_dabf !=nil {return nil ,_dabf ;};};return _dfgb ,nil ;};func _dgbe (_dga _gc .NRGBA64 )_gc .Gray {var _gead _gc .NRGBA64 ;if _dga ==_gead {return _gc .Gray {Y :0xff};
|
|
|
|
};_ece ,_bcce ,_aded ,_ :=_dga .RGBA ();_fbe :=(19595*_ece +38470*_bcce +7471*_aded +1<<15)>>24;return _gc .Gray {Y :uint8 (_fbe )};};func _ddc ()(_agf []byte ){_agf =make ([]byte ,256);for _ffd :=0;_ffd < 256;_ffd ++{_ged :=byte (_ffd );_agf [_ged ]=(_ged &0x01)|((_ged &0x04)>>1)|((_ged &0x10)>>2)|((_ged &0x40)>>3)|((_ged &0x02)<<3)|((_ged &0x08)<<2)|((_ged &0x20)<<1)|(_ged &0x80);
|
|
|
|
};return _agf ;};func _bddf (_bdee _f .Image )(Image ,error ){if _fbfa ,_abbe :=_bdee .(*NRGBA16 );_abbe {return _fbfa .Copy (),nil ;};_ecef :=_bdee .Bounds ();_cdac ,_acdg :=NewImage (_ecef .Max .X ,_ecef .Max .Y ,4,3,nil ,nil ,nil );if _acdg !=nil {return nil ,_acdg ;
|
|
|
|
};_efdgb (_bdee ,_cdac ,_ecef );return _cdac ,nil ;};func _ec (_gag int )[]uint {var _cfd []uint ;_bab :=_gag ;_bfb :=_bab /8;if _bfb !=0{for _cg :=0;_cg < _bfb ;_cg ++{_cfd =append (_cfd ,8);};_aabf :=_bab %8;_bab =0;if _aabf !=0{_bab =_aabf ;};};_bac :=_bab /4;
|
|
|
|
if _bac !=0{for _bgd :=0;_bgd < _bac ;_bgd ++{_cfd =append (_cfd ,4);};_cff :=_bab %4;_bab =0;if _cff !=0{_bab =_cff ;};};_bb :=_bab /2;if _bb !=0{for _cdg :=0;_cdg < _bb ;_cdg ++{_cfd =append (_cfd ,2);};};return _cfd ;};func _fagb (_baf Gray ,_gade nrgba64 ,_bcda _f .Rectangle ){for _adaf :=0;
|
|
|
|
_adaf < _bcda .Max .X ;_adaf ++{for _dcbbd :=0;_dcbbd < _bcda .Max .Y ;_dcbbd ++{_cabg :=_dgbe (_gade .NRGBA64At (_adaf ,_dcbbd ));_baf .SetGray (_adaf ,_dcbbd ,_cabg );};};};func _dfab (_bbde _gc .Gray )_gc .NRGBA {return _gc .NRGBA {R :_bbde .Y ,G :_bbde .Y ,B :_bbde .Y ,A :0xff}};
|
|
|
|
func _bfdb (_fdgc _f .Image ,_gggd int )(_f .Rectangle ,bool ,[]byte ){_fdbea :=_fdgc .Bounds ();var (_dbad bool ;_bafgc []byte ;);switch _dfed :=_fdgc .(type ){case SMasker :_dbad =_dfed .HasAlpha ();case NRGBA ,RGBA ,*_f .RGBA64 ,nrgba64 ,*_f .NYCbCrA :_bafgc =make ([]byte ,_fdbea .Max .X *_fdbea .Max .Y *_gggd );
|
|
|
|
case *_f .Paletted :var _cdee bool ;for _ ,_aacb :=range _dfed .Palette {_gabf ,_cgbc ,_gdfe ,_cefg :=_aacb .RGBA ();if _gabf ==0&&_cgbc ==0&&_gdfe ==0&&_cefg !=0{_cdee =true ;break ;};};if _cdee {_bafgc =make ([]byte ,_fdbea .Max .X *_fdbea .Max .Y *_gggd );
|
|
|
|
};};return _fdbea ,_dbad ,_bafgc ;};func IsGrayImgBlackAndWhite (i *_f .Gray )bool {return _ggcd (i )};func _bfac (_aba _gc .CMYK )_gc .NRGBA {_gfbe ,_ecfa ,_aabe :=_gc .CMYKToRGB (_aba .C ,_aba .M ,_aba .Y ,_aba .K );return _gc .NRGBA {R :_gfbe ,G :_ecfa ,B :_aabe ,A :0xff};
|
|
|
|
};func BytesPerLine (width ,bitsPerComponent ,colorComponents int )int {return ((width *bitsPerComponent )*colorComponents +7)>>3;};func _gebg (_bccff Gray ,_abafc NRGBA ,_eaff _f .Rectangle ){for _gdecd :=0;_gdecd < _eaff .Max .X ;_gdecd ++{for _dcaa :=0;
|
|
|
|
_dcaa < _eaff .Max .Y ;_dcaa ++{_dgee :=_bccff .GrayAt (_gdecd ,_dcaa );_abafc .SetNRGBA (_gdecd ,_dcaa ,_dfab (_dgee ));};};};func (_dgag *Monochrome )Validate ()error {if len (_dgag .Data )!=_dgag .Height *_dgag .BytesPerLine {return ErrInvalidImage ;
|
|
|
|
};return nil ;};func (_addeb *NRGBA32 )SetNRGBA (x ,y int ,c _gc .NRGBA ){_bgag :=y *_addeb .Width +x ;_cafc :=3*_bgag ;if _cafc +2>=len (_addeb .Data ){return ;};_addeb .setRGBA (_bgag ,c );};func (_cee *Monochrome )ColorModel ()_gc .Model {return MonochromeModel (_cee .ModelThreshold )};
|
|
|
|
func (_dcag *Monochrome )IsUnpadded ()bool {return (_dcag .Width *_dcag .Height )==len (_dcag .Data )};func _gad (_ff ,_bg *Monochrome )(_aab error ){_cc :=_bg .BytesPerLine ;_ca :=_ff .BytesPerLine ;var (_cb byte ;_caf uint16 ;_fea ,_eae ,_cd ,_df ,_cda int ;
|
|
|
|
);for _cd =0;_cd < _bg .Height ;_cd ++{_fea =_cd *_cc ;_eae =2*_cd *_ca ;for _df =0;_df < _cc ;_df ++{_cb =_bg .Data [_fea +_df ];_caf =_cbe [_cb ];_cda =_eae +_df *2;if _ff .BytesPerLine !=_bg .BytesPerLine *2&&(_df +1)*2> _ff .BytesPerLine {_aab =_ff .setByte (_cda ,byte (_caf >>8));
|
|
|
|
}else {_aab =_ff .setTwoBytes (_cda ,_caf );};if _aab !=nil {return _aab ;};};for _df =0;_df < _ca ;_df ++{_cda =_eae +_ca +_df ;_cb =_ff .Data [_eae +_df ];if _aab =_ff .setByte (_cda ,_cb );_aab !=nil {return _aab ;};};};return nil ;};func _efgb (_adc _gc .RGBA )_gc .Gray {_cadc :=(19595*uint32 (_adc .R )+38470*uint32 (_adc .G )+7471*uint32 (_adc .B )+1<<7)>>16;
|
|
|
|
return _gc .Gray {Y :uint8 (_cadc )};};type NRGBA32 struct{ImageBase };type SMasker interface{HasAlpha ()bool ;GetAlpha ()[]byte ;MakeAlpha ();};func _gcggd (_bdba CMYK ,_fdcc Gray ,_bdab _f .Rectangle ){for _ccde :=0;_ccde < _bdab .Max .X ;_ccde ++{for _gbca :=0;
|
|
|
|
_gbca < _bdab .Max .Y ;_gbca ++{_fgd :=_adae (_bdba .CMYKAt (_ccde ,_gbca ));_fdcc .SetGray (_ccde ,_gbca ,_fgd );};};};var _ _f .Image =&Gray16 {};func (_gbg *Gray4 )At (x ,y int )_gc .Color {_cffc ,_ :=_gbg .ColorAt (x ,y );return _cffc };func NewImage (width ,height ,bitsPerComponent ,colorComponents int ,data ,alpha []byte ,decode []float64 )(Image ,error ){_dfag :=NewImageBase (width ,height ,bitsPerComponent ,colorComponents ,data ,alpha ,decode );
|
|
|
|
var _bgda Image ;switch colorComponents {case 1:switch bitsPerComponent {case 1:_bgda =&Monochrome {ImageBase :_dfag ,ModelThreshold :0x0f};case 2:_bgda =&Gray2 {ImageBase :_dfag };case 4:_bgda =&Gray4 {ImageBase :_dfag };case 8:_bgda =&Gray8 {ImageBase :_dfag };
|
|
|
|
case 16:_bgda =&Gray16 {ImageBase :_dfag };};case 3:switch bitsPerComponent {case 4:_bgda =&NRGBA16 {ImageBase :_dfag };case 8:_bgda =&NRGBA32 {ImageBase :_dfag };case 16:_bgda =&NRGBA64 {ImageBase :_dfag };};case 4:_bgda =&CMYK32 {ImageBase :_dfag };};
|
|
|
|
if _bgda ==nil {return nil ,ErrInvalidImage ;};return _bgda ,nil ;};func _ecbge (_bbcdc Gray ,_aceb RGBA ,_gfeg _f .Rectangle ){for _bcgc :=0;_bcgc < _gfeg .Max .X ;_bcgc ++{for _adgf :=0;_adgf < _gfeg .Max .Y ;_adgf ++{_fccgf :=_bbcdc .GrayAt (_bcgc ,_adgf );
|
|
|
|
_aceb .SetRGBA (_bcgc ,_adgf ,_cabc (_fccgf ));};};};var _ Image =&Gray2 {};func GrayHistogram (g Gray )(_efaf [256]int ){switch _gbbb :=g .(type ){case Histogramer :return _gbbb .Histogram ();case _f .Image :_fgad :=_gbbb .Bounds ();for _dcfe :=0;_dcfe < _fgad .Max .X ;
|
|
|
|
_dcfe ++{for _bbcb :=0;_bbcb < _fgad .Max .Y ;_bbcb ++{_efaf [g .GrayAt (_dcfe ,_bbcb ).Y ]++;};};return _efaf ;default:return [256]int {};};};var _ Image =&Gray8 {};func _afdd (_gfac _f .Image ,_cbad Image ,_dege _f .Rectangle ){switch _fba :=_gfac .(type ){case Gray :_gfdd (_fba ,_cbad .(Gray ),_dege );
|
|
|
|
case NRGBA :_gfea (_fba ,_cbad .(Gray ),_dege );case CMYK :_gcggd (_fba ,_cbad .(Gray ),_dege );case RGBA :_cdfg (_fba ,_cbad .(Gray ),_dege );default:_dcca (_gfac ,_cbad ,_dege );};};var _ _f .Image =&Gray2 {};func ImgToBinary (i _f .Image ,threshold uint8 )*_f .Gray {switch _gdbg :=i .(type ){case *_f .Gray :if _ggcd (_gdbg ){return _gdbg ;
|
|
|
|
};return _gedca (_gdbg ,threshold );case *_f .Gray16 :return _bedea (_gdbg ,threshold );default:return _fcebg (_gdbg ,threshold );};};func _ffdf (_ebfb RGBA ,_cfffd NRGBA ,_feabd _f .Rectangle ){for _fdcb :=0;_fdcb < _feabd .Max .X ;_fdcb ++{for _eacb :=0;
|
|
|
|
_eacb < _feabd .Max .Y ;_eacb ++{_eeab :=_ebfb .RGBAAt (_fdcb ,_eacb );_cfffd .SetNRGBA (_fdcb ,_eacb ,_aadg (_eeab ));};};};func (_dff *Monochrome )setGrayBit (_ddfe ,_dbeg int ){_dff .Data [_ddfe ]|=0x80>>uint (_dbeg &7)};func NewImageBase (width int ,height int ,bitsPerComponent int ,colorComponents int ,data []byte ,alpha []byte ,decode []float64 )ImageBase {_cefb :=ImageBase {Width :width ,Height :height ,BitsPerComponent :bitsPerComponent ,ColorComponents :colorComponents ,Data :data ,Alpha :alpha ,Decode :decode ,BytesPerLine :BytesPerLine (width ,bitsPerComponent ,colorComponents )};
|
|
|
|
if data ==nil {_cefb .Data =make ([]byte ,height *_cefb .BytesPerLine );};return _cefb ;};func _cea (_bbd ,_fda int )*Monochrome {return &Monochrome {ImageBase :NewImageBase (_bbd ,_fda ,1,1,nil ,nil ,nil ),ModelThreshold :0x0f};};func _fbga (_eded *Monochrome ,_faba ,_bee int ,_gcdg ,_daaeb int ,_egcaa RasterOperator ){var (_bcbb bool ;
|
|
|
|
_fgca bool ;_becg int ;_fafbe int ;_abddd int ;_cdef int ;_cdcg bool ;_aaac byte ;);_ffef :=8-(_faba &7);_eggfb :=_gbfg [_ffef ];_ccbg :=_eded .BytesPerLine *_bee +(_faba >>3);if _gcdg < _ffef {_bcbb =true ;_eggfb &=_egcfb [8-_ffef +_gcdg ];};if !_bcbb {_becg =(_gcdg -_ffef )>>3;
|
|
|
|
if _becg !=0{_fgca =true ;_fafbe =_ccbg +1;};};_abddd =(_faba +_gcdg )&7;if !(_bcbb ||_abddd ==0){_cdcg =true ;_aaac =_egcfb [_abddd ];_cdef =_ccbg +1+_becg ;};var _aada ,_cadce int ;switch _egcaa {case PixClr :for _aada =0;_aada < _daaeb ;_aada ++{_eded .Data [_ccbg ]=_eaae (_eded .Data [_ccbg ],0x0,_eggfb );
|
|
|
|
_ccbg +=_eded .BytesPerLine ;};if _fgca {for _aada =0;_aada < _daaeb ;_aada ++{for _cadce =0;_cadce < _becg ;_cadce ++{_eded .Data [_fafbe +_cadce ]=0x0;};_fafbe +=_eded .BytesPerLine ;};};if _cdcg {for _aada =0;_aada < _daaeb ;_aada ++{_eded .Data [_cdef ]=_eaae (_eded .Data [_cdef ],0x0,_aaac );
|
|
|
|
_cdef +=_eded .BytesPerLine ;};};case PixSet :for _aada =0;_aada < _daaeb ;_aada ++{_eded .Data [_ccbg ]=_eaae (_eded .Data [_ccbg ],0xff,_eggfb );_ccbg +=_eded .BytesPerLine ;};if _fgca {for _aada =0;_aada < _daaeb ;_aada ++{for _cadce =0;_cadce < _becg ;
|
|
|
|
_cadce ++{_eded .Data [_fafbe +_cadce ]=0xff;};_fafbe +=_eded .BytesPerLine ;};};if _cdcg {for _aada =0;_aada < _daaeb ;_aada ++{_eded .Data [_cdef ]=_eaae (_eded .Data [_cdef ],0xff,_aaac );_cdef +=_eded .BytesPerLine ;};};case PixNotDst :for _aada =0;
|
|
|
|
_aada < _daaeb ;_aada ++{_eded .Data [_ccbg ]=_eaae (_eded .Data [_ccbg ],^_eded .Data [_ccbg ],_eggfb );_ccbg +=_eded .BytesPerLine ;};if _fgca {for _aada =0;_aada < _daaeb ;_aada ++{for _cadce =0;_cadce < _becg ;_cadce ++{_eded .Data [_fafbe +_cadce ]=^(_eded .Data [_fafbe +_cadce ]);
|
|
|
|
};_fafbe +=_eded .BytesPerLine ;};};if _cdcg {for _aada =0;_aada < _daaeb ;_aada ++{_eded .Data [_cdef ]=_eaae (_eded .Data [_cdef ],^_eded .Data [_cdef ],_aaac );_cdef +=_eded .BytesPerLine ;};};};};func (_dcf *CMYK32 )Set (x ,y int ,c _gc .Color ){_afga :=4*(y *_dcf .Width +x );
|
|
|
|
if _afga +3>=len (_dcf .Data ){return ;};_dca :=_gc .CMYKModel .Convert (c ).(_gc .CMYK );_dcf .Data [_afga ]=_dca .C ;_dcf .Data [_afga +1]=_dca .M ;_dcf .Data [_afga +2]=_dca .Y ;_dcf .Data [_afga +3]=_dca .K ;};func _fdc (_fag _gc .NYCbCrA )_gc .NRGBA {_ffg :=int32 (_fag .Y )*0x10101;
|
|
|
|
_ggca :=int32 (_fag .Cb )-128;_efgg :=int32 (_fag .Cr )-128;_fdafa :=_ffg +91881*_efgg ;if uint32 (_fdafa )&0xff000000==0{_fdafa >>=8;}else {_fdafa =^(_fdafa >>31)&0xffff;};_adce :=_ffg -22554*_ggca -46802*_efgg ;if uint32 (_adce )&0xff000000==0{_adce >>=8;
|
|
|
|
}else {_adce =^(_adce >>31)&0xffff;};_ega :=_ffg +116130*_ggca ;if uint32 (_ega )&0xff000000==0{_ega >>=8;}else {_ega =^(_ega >>31)&0xffff;};return _gc .NRGBA {R :uint8 (_fdafa >>8),G :uint8 (_adce >>8),B :uint8 (_ega >>8),A :_fag .A };};var _ Image =&NRGBA64 {};
|
|
|
|
const (_ddgfe shift =iota ;_ffga ;);func ScaleAlphaToMonochrome (data []byte ,width ,height int )([]byte ,error ){_b :=BytesPerLine (width ,8,1);if len (data )< _b *height {return nil ,nil ;};_ee :=&Gray8 {NewImageBase (width ,height ,8,1,data ,nil ,nil )};
|
|
|
|
_c ,_ga :=MonochromeConverter .Convert (_ee );if _ga !=nil {return nil ,_ga ;};return _c .Base ().Data ,nil ;};func (_dcga *NRGBA16 )Validate ()error {if len (_dcga .Data )!=3*_dcga .Width *_dcga .Height /2{return _a .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 _baef (_fab _gc .Gray )_gc .Gray {_fab .Y >>=4;_fab .Y |=_fab .Y <<4;return _fab };func _fcgag (_cfgae ,_bffea NRGBA ,_aagb _f .Rectangle ){for _ddac :=0;_ddac < _aagb .Max .X ;_ddac ++{for _gcfaa :=0;_gcfaa < _aagb .Max .Y ;_gcfaa ++{_bffea .SetNRGBA (_ddac ,_gcfaa ,_cfgae .NRGBAAt (_ddac ,_gcfaa ));
|
|
|
|
};};};func _fcebg (_ebb _f .Image ,_cbca uint8 )*_f .Gray {_ddeba :=_ebb .Bounds ();_agcg :=_f .NewGray (_ddeba );var (_gefc _gc .Color ;_dbgc _gc .Gray ;);for _bfcc :=0;_bfcc < _ddeba .Max .X ;_bfcc ++{for _dagd :=0;_dagd < _ddeba .Max .Y ;_dagd ++{_gefc =_ebb .At (_bfcc ,_dagd );
|
|
|
|
_agcg .Set (_bfcc ,_dagd ,_gefc );_dbgc =_agcg .GrayAt (_bfcc ,_dagd );_agcg .SetGray (_bfcc ,_dagd ,_gc .Gray {Y :_adf (_dbgc .Y ,_cbca )});};};return _agcg ;};type Histogramer interface{Histogram ()[256]int ;};func _geca (_bcb _f .Image )(Image ,error ){if _baee ,_ggcg :=_bcb .(*Gray2 );
|
|
|
|
_ggcg {return _baee .Copy (),nil ;};_afggd :=_bcb .Bounds ();_ccdc ,_cfce :=NewImage (_afggd .Max .X ,_afggd .Max .Y ,2,1,nil ,nil ,nil );if _cfce !=nil {return nil ,_cfce ;};_afdd (_bcb ,_ccdc ,_afggd );return _ccdc ,nil ;};func _ccad (_bafg *Monochrome ,_adgc ,_ddfee int ,_bfbaa ,_dbaa int ,_dggfb RasterOperator ,_efce *Monochrome ,_edd ,_ccf int )error {var _fgcb ,_ebgb ,_cdeg ,_feae int ;
|
|
|
|
if _adgc < 0{_edd -=_adgc ;_bfbaa +=_adgc ;_adgc =0;};if _edd < 0{_adgc -=_edd ;_bfbaa +=_edd ;_edd =0;};_fgcb =_adgc +_bfbaa -_bafg .Width ;if _fgcb > 0{_bfbaa -=_fgcb ;};_ebgb =_edd +_bfbaa -_efce .Width ;if _ebgb > 0{_bfbaa -=_ebgb ;};if _ddfee < 0{_ccf -=_ddfee ;
|
|
|
|
_dbaa +=_ddfee ;_ddfee =0;};if _ccf < 0{_ddfee -=_ccf ;_dbaa +=_ccf ;_ccf =0;};_cdeg =_ddfee +_dbaa -_bafg .Height ;if _cdeg > 0{_dbaa -=_cdeg ;};_feae =_ccf +_dbaa -_efce .Height ;if _feae > 0{_dbaa -=_feae ;};if _bfbaa <=0||_dbaa <=0{return nil ;};var _bafd error ;
|
|
|
|
switch {case _adgc &7==0&&_edd &7==0:_bafd =_bdec (_bafg ,_adgc ,_ddfee ,_bfbaa ,_dbaa ,_dggfb ,_efce ,_edd ,_ccf );case _adgc &7==_edd &7:_bafd =_geea (_bafg ,_adgc ,_ddfee ,_bfbaa ,_dbaa ,_dggfb ,_efce ,_edd ,_ccf );default:_bafd =_ccca (_bafg ,_adgc ,_ddfee ,_bfbaa ,_dbaa ,_dggfb ,_efce ,_edd ,_ccf );
|
|
|
|
};if _bafd !=nil {return _bafd ;};return nil ;};func _bcd (_edg _gc .NRGBA64 )_gc .RGBA {_ebec ,_aggb ,_edfc ,_edaf :=_edg .RGBA ();return _gc .RGBA {R :uint8 (_ebec >>8),G :uint8 (_aggb >>8),B :uint8 (_edfc >>8),A :uint8 (_edaf >>8)};};var _ Image =&Monochrome {};
|
|
|
|
func AutoThresholdTriangle (histogram [256]int )uint8 {var _ecbe ,_gffd ,_fadg ,_bfecf int ;for _bbcg :=0;_bbcg < len (histogram );_bbcg ++{if histogram [_bbcg ]> 0{_ecbe =_bbcg ;break ;};};if _ecbe > 0{_ecbe --;};for _eacg :=255;_eacg > 0;_eacg --{if histogram [_eacg ]> 0{_bfecf =_eacg ;
|
|
|
|
break ;};};if _bfecf < 255{_bfecf ++;};for _dadae :=0;_dadae < 256;_dadae ++{if histogram [_dadae ]> _gffd {_fadg =_dadae ;_gffd =histogram [_dadae ];};};var _aacd bool ;if (_fadg -_ecbe )< (_bfecf -_fadg ){_aacd =true ;var _fgda int ;_ddga :=255;for _fgda < _ddga {_bffec :=histogram [_fgda ];
|
|
|
|
histogram [_fgda ]=histogram [_ddga ];histogram [_ddga ]=_bffec ;_fgda ++;_ddga --;};_ecbe =255-_bfecf ;_fadg =255-_fadg ;};if _ecbe ==_fadg {return uint8 (_ecbe );};_fgeec :=float64 (histogram [_fadg ]);_eefa :=float64 (_ecbe -_fadg );_bfdd :=_d .Sqrt (_fgeec *_fgeec +_eefa *_eefa );
|
|
|
|
_fgeec /=_bfdd ;_eefa /=_bfdd ;_bfdd =_fgeec *float64 (_ecbe )+_eefa *float64 (histogram [_ecbe ]);_bdfa :=_ecbe ;var _egd float64 ;for _begbg :=_ecbe +1;_begbg <=_fadg ;_begbg ++{_daee :=_fgeec *float64 (_begbg )+_eefa *float64 (histogram [_begbg ])-_bfdd ;
|
|
|
|
if _daee > _egd {_bdfa =_begbg ;_egd =_daee ;};};_bdfa --;if _aacd {var _faffb int ;_fcec :=255;for _faffb < _fcec {_ggd :=histogram [_faffb ];histogram [_faffb ]=histogram [_fcec ];histogram [_fcec ]=_ggd ;_faffb ++;_fcec --;};return uint8 (255-_bdfa );
|
|
|
|
};return uint8 (_bdfa );};func _bga ()(_cf [256]uint64 ){for _db :=0;_db < 256;_db ++{if _db &0x01!=0{_cf [_db ]|=0xff;};if _db &0x02!=0{_cf [_db ]|=0xff00;};if _db &0x04!=0{_cf [_db ]|=0xff0000;};if _db &0x08!=0{_cf [_db ]|=0xff000000;};if _db &0x10!=0{_cf [_db ]|=0xff00000000;
|
|
|
|
};if _db &0x20!=0{_cf [_db ]|=0xff0000000000;};if _db &0x40!=0{_cf [_db ]|=0xff000000000000;};if _db &0x80!=0{_cf [_db ]|=0xff00000000000000;};};return _cf ;};func (_fccd *NRGBA32 )ColorAt (x ,y int )(_gc .Color ,error ){return ColorAtNRGBA32 (x ,y ,_fccd .Width ,_fccd .Data ,_fccd .Alpha ,_fccd .Decode );
|
|
|
|
};func _dbac (_bge _gc .Gray )_gc .CMYK {return _gc .CMYK {K :0xff-_bge .Y }};type Image interface{_da .Image ;Base ()*ImageBase ;Copy ()Image ;Pix ()[]byte ;ColorAt (_dcgf ,_dbdf int )(_gc .Color ,error );Validate ()error ;};func (_dbb *Monochrome )ResolveDecode ()error {if len (_dbb .Decode )!=2{return nil ;
|
|
|
|
};if _dbb .Decode [0]==1&&_dbb .Decode [1]==0{if _adec :=_dbb .InverseData ();_adec !=nil {return _adec ;};_dbb .Decode =nil ;};return nil ;};func _fdbaf (_gggb _f .Image )(Image ,error ){if _gbbec ,_cdag :=_gggb .(*NRGBA32 );_cdag {return _gbbec .Copy (),nil ;
|
|
|
|
};_gdf ,_bgcd ,_aedb :=_bfdb (_gggb ,1);_begd ,_ggagf :=NewImage (_gdf .Max .X ,_gdf .Max .Y ,8,3,nil ,_aedb ,nil );if _ggagf !=nil {return nil ,_ggagf ;};_efdgb (_gggb ,_begd ,_gdf );if len (_aedb )!=0&&!_bgcd {if _edcd :=_abdc (_aedb ,_begd );_edcd !=nil {return nil ,_edcd ;
|
|
|
|
};};return _begd ,nil ;};func _gfdd (_eced ,_ceceg Gray ,_aeef _f .Rectangle ){for _cfeb :=0;_cfeb < _aeef .Max .X ;_cfeb ++{for _accdb :=0;_accdb < _aeef .Max .Y ;_accdb ++{_ceceg .SetGray (_cfeb ,_accdb ,_eced .GrayAt (_cfeb ,_accdb ));};};};func _aeg (_bdag RGBA ,_cdc CMYK ,_dbg _f .Rectangle ){for _gfe :=0;
|
|
|
|
_gfe < _dbg .Max .X ;_gfe ++{for _fgce :=0;_fgce < _dbg .Max .Y ;_fgce ++{_ffde :=_bdag .RGBAAt (_gfe ,_fgce );_cdc .SetCMYK (_gfe ,_fgce ,_abaf (_ffde ));};};};func _ggbg (_cabea _gc .NRGBA )_gc .CMYK {_cddd ,_dafg ,_bgg ,_ :=_cabea .RGBA ();_ffc ,_dee ,_aabgb ,_agd :=_gc .RGBToCMYK (uint8 (_cddd >>8),uint8 (_dafg >>8),uint8 (_bgg >>8));
|
|
|
|
return _gc .CMYK {C :_ffc ,M :_dee ,Y :_aabgb ,K :_agd };};func (_dbda *monochromeThresholdConverter )Convert (img _f .Image )(Image ,error ){if _cfag ,_eea :=img .(*Monochrome );_eea {return _cfag .Copy (),nil ;};_ggaa :=img .Bounds ();_gfcf ,_fdba :=NewImage (_ggaa .Max .X ,_ggaa .Max .Y ,1,1,nil ,nil ,nil );
|
|
|
|
if _fdba !=nil {return nil ,_fdba ;};_gfcf .(*Monochrome ).ModelThreshold =_dbda .Threshold ;for _ffgc :=0;_ffgc < _ggaa .Max .X ;_ffgc ++{for _bece :=0;_bece < _ggaa .Max .Y ;_bece ++{_afcf :=img .At (_ffgc ,_bece );_gfcf .Set (_ffgc ,_bece ,_afcf );};
|
|
|
|
};return _gfcf ,nil ;};func (_dced *NRGBA32 )Set (x ,y int ,c _gc .Color ){_fcfb :=y *_dced .Width +x ;_gedg :=3*_fcfb ;if _gedg +2>=len (_dced .Data ){return ;};_bbgcc :=_gc .NRGBAModel .Convert (c ).(_gc .NRGBA );_dced .setRGBA (_fcfb ,_bbgcc );};func _efdgb (_fgef _f .Image ,_acgec Image ,_ceff _f .Rectangle ){if _bfee ,_cacc :=_fgef .(SMasker );
|
|
|
|
_cacc &&_bfee .HasAlpha (){_acgec .(SMasker ).MakeAlpha ();};switch _eddagb :=_fgef .(type ){case Gray :_gebg (_eddagb ,_acgec .(NRGBA ),_ceff );case NRGBA :_fcgag (_eddagb ,_acgec .(NRGBA ),_ceff );case *_f .NYCbCrA :_face (_eddagb ,_acgec .(NRGBA ),_ceff );
|
|
|
|
case CMYK :_eega (_eddagb ,_acgec .(NRGBA ),_ceff );case RGBA :_ffdf (_eddagb ,_acgec .(NRGBA ),_ceff );case nrgba64 :_acea (_eddagb ,_acgec .(NRGBA ),_ceff );default:_dcca (_fgef ,_acgec ,_ceff );};};func (_acb *ImageBase )getByte (_eaee int )(byte ,error ){if _eaee > len (_acb .Data )-1||_eaee < 0{return 0,_e .Errorf ("\u0069\u006e\u0064\u0065x:\u0020\u0025\u0064\u0020\u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006eg\u0065",_eaee );
|
|
|
|
};return _acb .Data [_eaee ],nil ;};func ColorAtNRGBA32 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_gc .NRGBA ,error ){_bgef :=y *width +x ;_bef :=3*_bgef ;if _bef +2>=len (data ){return _gc .NRGBA {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
|
|
};_ccbb :=uint8 (0xff);if alpha !=nil &&len (alpha )> _bgef {_ccbb =alpha [_bgef ];};_ddbe ,_dacf ,_cdddf :=data [_bef ],data [_bef +1],data [_bef +2];if len (decode )==6{_ddbe =uint8 (uint32 (LinearInterpolate (float64 (_ddbe ),0,255,decode [0],decode [1]))&0xff);
|
|
|
|
_dacf =uint8 (uint32 (LinearInterpolate (float64 (_dacf ),0,255,decode [2],decode [3]))&0xff);_cdddf =uint8 (uint32 (LinearInterpolate (float64 (_cdddf ),0,255,decode [4],decode [5]))&0xff);};return _gc .NRGBA {R :_ddbe ,G :_dacf ,B :_cdddf ,A :_ccbb },nil ;
|
|
|
|
};func _cdaf (_gf *Monochrome ,_bgab int ,_ddg []byte )(_dbd *Monochrome ,_gacb error ){const _dde ="\u0072\u0065d\u0075\u0063\u0065R\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079";if _gf ==nil {return nil ,_a .New ("\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
|
|
};if _bgab < 1||_bgab > 4{return nil ,_a .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 _gf .Height <=1{return nil ,_a .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");
|
|
|
|
};_dbd =_cea (_gf .Width /2,_gf .Height /2);if _ddg ==nil {_ddg =_ddc ();};_bcg :=_daae (_gf .BytesPerLine ,2*_dbd .BytesPerLine );switch _bgab {case 1:_gacb =_aef (_gf ,_dbd ,_ddg ,_bcg );case 2:_gacb =_bbg (_gf ,_dbd ,_ddg ,_bcg );case 3:_gacb =_fga (_gf ,_dbd ,_ddg ,_bcg );
|
|
|
|
case 4:_gacb =_fge (_gf ,_dbd ,_ddg ,_bcg );};if _gacb !=nil {return nil ,_gacb ;};return _dbd ,nil ;};var _ _f .Image =&NRGBA32 {};func ColorAtNRGBA64 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_gc .NRGBA64 ,error ){_adgb :=(y *width +x )*2;
|
|
|
|
_eeaa :=_adgb *3;if _eeaa +5>=len (data ){return _gc .NRGBA64 {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
|
|
};const _dfeb =0xffff;_babe :=uint16 (_dfeb );if alpha !=nil &&len (alpha )> _adgb +1{_babe =uint16 (alpha [_adgb ])<<8|uint16 (alpha [_adgb +1]);};_cfbe :=uint16 (data [_eeaa ])<<8|uint16 (data [_eeaa +1]);_ecbg :=uint16 (data [_eeaa +2])<<8|uint16 (data [_eeaa +3]);
|
|
|
|
_acgb :=uint16 (data [_eeaa +4])<<8|uint16 (data [_eeaa +5]);if len (decode )==6{_cfbe =uint16 (uint64 (LinearInterpolate (float64 (_cfbe ),0,65535,decode [0],decode [1]))&_dfeb );_ecbg =uint16 (uint64 (LinearInterpolate (float64 (_ecbg ),0,65535,decode [2],decode [3]))&_dfeb );
|
|
|
|
_acgb =uint16 (uint64 (LinearInterpolate (float64 (_acgb ),0,65535,decode [4],decode [5]))&_dfeb );};return _gc .NRGBA64 {R :_cfbe ,G :_ecbg ,B :_acgb ,A :_babe },nil ;};func (_bfcg *NRGBA32 )Validate ()error {if len (_bfcg .Data )!=3*_bfcg .Width *_bfcg .Height {return _a .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 Gray8 struct{ImageBase };func ColorAtRGBA32 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_gc .RGBA ,error ){_gcgfe :=y *width +x ;_dccf :=3*_gcgfe ;if _dccf +2>=len (data ){return _gc .RGBA {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
|
|
};_bccc :=uint8 (0xff);if alpha !=nil &&len (alpha )> _gcgfe {_bccc =alpha [_gcgfe ];};_fbea ,_egfag ,_bdgd :=data [_dccf ],data [_dccf +1],data [_dccf +2];if len (decode )==6{_fbea =uint8 (uint32 (LinearInterpolate (float64 (_fbea ),0,255,decode [0],decode [1]))&0xff);
|
|
|
|
_egfag =uint8 (uint32 (LinearInterpolate (float64 (_egfag ),0,255,decode [2],decode [3]))&0xff);_bdgd =uint8 (uint32 (LinearInterpolate (float64 (_bdgd ),0,255,decode [4],decode [5]))&0xff);};return _gc .RGBA {R :_fbea ,G :_egfag ,B :_bdgd ,A :_bccc },nil ;
|
|
|
|
};func _bcgd (_dggc _gc .Gray ,_bbee monochromeModel )_gc .Gray {if _dggc .Y > uint8 (_bbee ){return _gc .Gray {Y :_d .MaxUint8 };};return _gc .Gray {};};func _geea (_bdabb *Monochrome ,_fffa ,_acbd ,_gedb ,_aadda int ,_ecec RasterOperator ,_fadf *Monochrome ,_edda ,_aadgc int )error {var (_afeb bool ;
|
|
|
|
_aabeg bool ;_aeccg int ;_bbgb int ;_aefe int ;_cegc bool ;_bdcd byte ;_gcfa int ;_fdggf int ;_cfae int ;_fcdf ,_cffg int ;);_eacd :=8-(_fffa &7);_egbd :=_gbfg [_eacd ];_efagc :=_bdabb .BytesPerLine *_acbd +(_fffa >>3);_dcef :=_fadf .BytesPerLine *_aadgc +(_edda >>3);
|
|
|
|
if _gedb < _eacd {_afeb =true ;_egbd &=_egcfb [8-_eacd +_gedb ];};if !_afeb {_aeccg =(_gedb -_eacd )>>3;if _aeccg > 0{_aabeg =true ;_bbgb =_efagc +1;_aefe =_dcef +1;};};_gcfa =(_fffa +_gedb )&7;if !(_afeb ||_gcfa ==0){_cegc =true ;_bdcd =_egcfb [_gcfa ];
|
|
|
|
_fdggf =_efagc +1+_aeccg ;_cfae =_dcef +1+_aeccg ;};switch _ecec {case PixSrc :for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],_fadf .Data [_dcef ],_egbd );_efagc +=_bdabb .BytesPerLine ;_dcef +=_fadf .BytesPerLine ;
|
|
|
|
};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]=_fadf .Data [_aefe +_cffg ];};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;};};if _cegc {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],_fadf .Data [_cfae ],_bdcd );
|
|
|
|
_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};case PixNotSrc :for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],^_fadf .Data [_dcef ],_egbd );_efagc +=_bdabb .BytesPerLine ;_dcef +=_fadf .BytesPerLine ;
|
|
|
|
};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]=^_fadf .Data [_aefe +_cffg ];};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;};};if _cegc {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],^_fadf .Data [_cfae ],_bdcd );
|
|
|
|
_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};case PixSrcOrDst :for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],_fadf .Data [_dcef ]|_bdabb .Data [_efagc ],_egbd );_efagc +=_bdabb .BytesPerLine ;
|
|
|
|
_dcef +=_fadf .BytesPerLine ;};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]|=_fadf .Data [_aefe +_cffg ];};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;};};if _cegc {for _fcdf =0;
|
|
|
|
_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],_fadf .Data [_cfae ]|_bdabb .Data [_fdggf ],_bdcd );_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};case PixSrcAndDst :for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],_fadf .Data [_dcef ]&_bdabb .Data [_efagc ],_egbd );
|
|
|
|
_efagc +=_bdabb .BytesPerLine ;_dcef +=_fadf .BytesPerLine ;};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]&=_fadf .Data [_aefe +_cffg ];};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;
|
|
|
|
};};if _cegc {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],_fadf .Data [_cfae ]&_bdabb .Data [_fdggf ],_bdcd );_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};case PixSrcXorDst :for _fcdf =0;
|
|
|
|
_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],_fadf .Data [_dcef ]^_bdabb .Data [_efagc ],_egbd );_efagc +=_bdabb .BytesPerLine ;_dcef +=_fadf .BytesPerLine ;};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;
|
|
|
|
_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]^=_fadf .Data [_aefe +_cffg ];};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;};};if _cegc {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],_fadf .Data [_cfae ]^_bdabb .Data [_fdggf ],_bdcd );
|
|
|
|
_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};case PixNotSrcOrDst :for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],^(_fadf .Data [_dcef ])|_bdabb .Data [_efagc ],_egbd );_efagc +=_bdabb .BytesPerLine ;
|
|
|
|
_dcef +=_fadf .BytesPerLine ;};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]|=^(_fadf .Data [_aefe +_cffg ]);};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;};};if _cegc {for _fcdf =0;
|
|
|
|
_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],^(_fadf .Data [_cfae ])|_bdabb .Data [_fdggf ],_bdcd );_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};case PixNotSrcAndDst :for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],^(_fadf .Data [_dcef ])&_bdabb .Data [_efagc ],_egbd );
|
|
|
|
_efagc +=_bdabb .BytesPerLine ;_dcef +=_fadf .BytesPerLine ;};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]&=^_fadf .Data [_aefe +_cffg ];};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;
|
|
|
|
};};if _cegc {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],^(_fadf .Data [_cfae ])&_bdabb .Data [_fdggf ],_bdcd );_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};case PixSrcOrNotDst :for _fcdf =0;
|
|
|
|
_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],_fadf .Data [_dcef ]|^(_bdabb .Data [_efagc ]),_egbd );_efagc +=_bdabb .BytesPerLine ;_dcef +=_fadf .BytesPerLine ;};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;
|
|
|
|
_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]=_fadf .Data [_aefe +_cffg ]|^(_bdabb .Data [_bbgb +_cffg ]);};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;};};if _cegc {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],_fadf .Data [_cfae ]|^(_bdabb .Data [_fdggf ]),_bdcd );
|
|
|
|
_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};case PixSrcAndNotDst :for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],_fadf .Data [_dcef ]&^(_bdabb .Data [_efagc ]),_egbd );_efagc +=_bdabb .BytesPerLine ;
|
|
|
|
_dcef +=_fadf .BytesPerLine ;};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]=_fadf .Data [_aefe +_cffg ]&^(_bdabb .Data [_bbgb +_cffg ]);};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;
|
|
|
|
};};if _cegc {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],_fadf .Data [_cfae ]&^(_bdabb .Data [_fdggf ]),_bdcd );_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};case PixNotPixSrcOrDst :for _fcdf =0;
|
|
|
|
_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],^(_fadf .Data [_dcef ]|_bdabb .Data [_efagc ]),_egbd );_efagc +=_bdabb .BytesPerLine ;_dcef +=_fadf .BytesPerLine ;};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;
|
|
|
|
_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]=^(_fadf .Data [_aefe +_cffg ]|_bdabb .Data [_bbgb +_cffg ]);};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;};};if _cegc {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],^(_fadf .Data [_cfae ]|_bdabb .Data [_fdggf ]),_bdcd );
|
|
|
|
_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};case PixNotPixSrcAndDst :for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],^(_fadf .Data [_dcef ]&_bdabb .Data [_efagc ]),_egbd );_efagc +=_bdabb .BytesPerLine ;
|
|
|
|
_dcef +=_fadf .BytesPerLine ;};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]=^(_fadf .Data [_aefe +_cffg ]&_bdabb .Data [_bbgb +_cffg ]);};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;
|
|
|
|
};};if _cegc {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],^(_fadf .Data [_cfae ]&_bdabb .Data [_fdggf ]),_bdcd );_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};case PixNotPixSrcXorDst :for _fcdf =0;
|
|
|
|
_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_efagc ]=_eaae (_bdabb .Data [_efagc ],^(_fadf .Data [_dcef ]^_bdabb .Data [_efagc ]),_egbd );_efagc +=_bdabb .BytesPerLine ;_dcef +=_fadf .BytesPerLine ;};if _aabeg {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{for _cffg =0;
|
|
|
|
_cffg < _aeccg ;_cffg ++{_bdabb .Data [_bbgb +_cffg ]=^(_fadf .Data [_aefe +_cffg ]^_bdabb .Data [_bbgb +_cffg ]);};_bbgb +=_bdabb .BytesPerLine ;_aefe +=_fadf .BytesPerLine ;};};if _cegc {for _fcdf =0;_fcdf < _aadda ;_fcdf ++{_bdabb .Data [_fdggf ]=_eaae (_bdabb .Data [_fdggf ],^(_fadf .Data [_cfae ]^_bdabb .Data [_fdggf ]),_bdcd );
|
|
|
|
_fdggf +=_bdabb .BytesPerLine ;_cfae +=_fadf .BytesPerLine ;};};default:_eb .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",_ecec );return _a .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 InDelta (expected ,current ,delta float64 )bool {_gbcc :=expected -current ;if _gbcc <=-delta ||_gbcc >=delta {return false ;};return true ;};func (_dbe *CMYK32 )Base ()*ImageBase {return &_dbe .ImageBase };func (_cbb *ImageBase )copy ()ImageBase {_daad :=*_cbb ;
|
|
|
|
_daad .Data =make ([]byte ,len (_cbb .Data ));copy (_daad .Data ,_cbb .Data );return _daad ;};func (_gefb *NRGBA32 )Bounds ()_f .Rectangle {return _f .Rectangle {Max :_f .Point {X :_gefb .Width ,Y :_gefb .Height }};};func _cgc (_efcb *Monochrome ,_gca ...int )(_fbfb *Monochrome ,_ded error ){if _efcb ==nil {return nil ,_a .New ("\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
|
|
};if len (_gca )==0{return nil ,_a .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");
|
|
|
|
};_ecd :=_ddc ();_fbfb =_efcb ;for _ ,_fbb :=range _gca {if _fbb <=0{break ;};_fbfb ,_ded =_cdaf (_fbfb ,_fbb ,_ecd );if _ded !=nil {return nil ,_ded ;};};return _fbfb ,nil ;};var (Gray2Model =_gc .ModelFunc (_bbce );Gray4Model =_gc .ModelFunc (_deff );
|
|
|
|
NRGBA16Model =_gc .ModelFunc (_acge ););var _ NRGBA =&NRGBA16 {};func MonochromeThresholdConverter (threshold uint8 )ColorConverter {return &monochromeThresholdConverter {Threshold :threshold };};func (_ceae *NRGBA32 )Copy ()Image {return &NRGBA32 {ImageBase :_ceae .copy ()}};
|
|
|
|
type ColorConverter interface{Convert (_dbc _f .Image )(Image ,error );};func _gfea (_dgagd NRGBA ,_aafd Gray ,_acce _f .Rectangle ){for _baca :=0;_baca < _acce .Max .X ;_baca ++{for _efag :=0;_efag < _acce .Max .Y ;_efag ++{_dgcea :=_fdaf (_dgagd .NRGBAAt (_baca ,_efag ));
|
|
|
|
_aafd .SetGray (_baca ,_efag ,_dgcea );};};};func _beca (){for _edgb :=0;_edgb < 256;_edgb ++{_fecdb [_edgb ]=uint8 (_edgb &0x1)+(uint8 (_edgb >>1)&0x1)+(uint8 (_edgb >>2)&0x1)+(uint8 (_edgb >>3)&0x1)+(uint8 (_edgb >>4)&0x1)+(uint8 (_edgb >>5)&0x1)+(uint8 (_edgb >>6)&0x1)+(uint8 (_edgb >>7)&0x1);
|
|
|
|
};};func (_bccfb *Gray16 )Validate ()error {if len (_bccfb .Data )!=_bccfb .Height *_bccfb .BytesPerLine {return ErrInvalidImage ;};return nil ;};type monochromeThresholdConverter struct{Threshold uint8 ;};func _fafb (_bbdef _f .Image )(Image ,error ){if _cbff ,_dcff :=_bbdef .(*Monochrome );
|
|
|
|
_dcff {return _cbff ,nil ;};_deg :=_bbdef .Bounds ();var _cgca Gray ;switch _cecd :=_bbdef .(type ){case Gray :_cgca =_cecd ;case NRGBA :_cgca =&Gray8 {ImageBase :NewImageBase (_deg .Max .X ,_deg .Max .Y ,8,1,nil ,nil ,nil )};_gdd (_cgca ,_cecd ,_deg );
|
|
|
|
case nrgba64 :_cgca =&Gray8 {ImageBase :NewImageBase (_deg .Max .X ,_deg .Max .Y ,8,1,nil ,nil ,nil )};_fagb (_cgca ,_cecd ,_deg );default:_gab ,_afe :=GrayConverter .Convert (_bbdef );if _afe !=nil {return nil ,_afe ;};_cgca =_gab .(Gray );};_bbdb ,_afc :=NewImage (_deg .Max .X ,_deg .Max .Y ,1,1,nil ,nil ,nil );
|
|
|
|
if _afc !=nil {return nil ,_afc ;};_egfa :=_bbdb .(*Monochrome );_edfe :=AutoThresholdTriangle (GrayHistogram (_cgca ));for _efbc :=0;_efbc < _deg .Max .X ;_efbc ++{for _gcagg :=0;_gcagg < _deg .Max .Y ;_gcagg ++{_cba :=_bcgd (_cgca .GrayAt (_efbc ,_gcagg ),monochromeModel (_edfe ));
|
|
|
|
_egfa .SetGray (_efbc ,_gcagg ,_cba );};};return _bbdb ,nil ;};func (_dcd *ImageBase )setTwoBytes (_gebe int ,_egccb uint16 )error {if _gebe +1> len (_dcd .Data )-1{return _a .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
|
|
};_dcd .Data [_gebe ]=byte ((_egccb &0xff00)>>8);_dcd .Data [_gebe +1]=byte (_egccb &0xff);return nil ;};func NextPowerOf2 (n uint )uint {if IsPowerOf2 (n ){return n ;};return 1<<(_bfef (n )+1);};func (_bdg *Gray2 )Bounds ()_f .Rectangle {return _f .Rectangle {Max :_f .Point {X :_bdg .Width ,Y :_bdg .Height }};
|
|
|
|
};func _dagf (_degc _gc .Gray )_gc .Gray {_fcga :=_degc .Y >>6;_fcga |=_fcga <<2;_degc .Y =_fcga |_fcga <<4;return _degc ;};type Gray2 struct{ImageBase };func _deff (_cbce _gc .Color )_gc .Color {_dcgg :=_gc .GrayModel .Convert (_cbce ).(_gc .Gray );return _baef (_dcgg );
|
|
|
|
};func _bddd (_aed ,_ecc CMYK ,_bfa _f .Rectangle ){for _cece :=0;_cece < _bfa .Max .X ;_cece ++{for _cfdf :=0;_cfdf < _bfa .Max .Y ;_cfdf ++{_ecc .SetCMYK (_cece ,_cfdf ,_aed .CMYKAt (_cece ,_cfdf ));};};};var _ _f .Image =&NRGBA16 {};func (_eaca *NRGBA16 )At (x ,y int )_gc .Color {_cadg ,_ :=_eaca .ColorAt (x ,y );
|
|
|
|
return _cadg };func (_agag *NRGBA32 )ColorModel ()_gc .Model {return _gc .NRGBAModel };func (_cbfd monochromeModel )Convert (c _gc .Color )_gc .Color {_ffb :=_gc .GrayModel .Convert (c ).(_gc .Gray );return _bcgd (_ffb ,_cbfd );};func _bbg (_gda ,_dab *Monochrome ,_dgc []byte ,_cde int )(_gdc error ){var (_bce ,_acd ,_aee ,_bag ,_edf ,_ddea ,_fbc ,_bbf int ;
|
|
|
|
_ege ,_dfa ,_bbe ,_gge uint32 ;_cdab ,_dcbc byte ;_bgb uint16 ;);_egf :=make ([]byte ,4);_eafe :=make ([]byte ,4);for _aee =0;_aee < _gda .Height -1;_aee ,_bag =_aee +2,_bag +1{_bce =_aee *_gda .BytesPerLine ;_acd =_bag *_dab .BytesPerLine ;for _edf ,_ddea =0,0;
|
|
|
|
_edf < _cde ;_edf ,_ddea =_edf +4,_ddea +1{for _fbc =0;_fbc < 4;_fbc ++{_bbf =_bce +_edf +_fbc ;if _bbf <=len (_gda .Data )-1&&_bbf < _bce +_gda .BytesPerLine {_egf [_fbc ]=_gda .Data [_bbf ];}else {_egf [_fbc ]=0x00;};_bbf =_bce +_gda .BytesPerLine +_edf +_fbc ;
|
|
|
|
if _bbf <=len (_gda .Data )-1&&_bbf < _bce +(2*_gda .BytesPerLine ){_eafe [_fbc ]=_gda .Data [_bbf ];}else {_eafe [_fbc ]=0x00;};};_ege =_ab .BigEndian .Uint32 (_egf );_dfa =_ab .BigEndian .Uint32 (_eafe );_bbe =_ege &_dfa ;_bbe |=_bbe <<1;_gge =_ege |_dfa ;
|
|
|
|
_gge &=_gge <<1;_dfa =_bbe |_gge ;_dfa &=0xaaaaaaaa;_ege =_dfa |(_dfa <<7);_cdab =byte (_ege >>24);_dcbc =byte ((_ege >>8)&0xff);_bbf =_acd +_ddea ;if _bbf +1==len (_dab .Data )-1||_bbf +1>=_acd +_dab .BytesPerLine {if _gdc =_dab .setByte (_bbf ,_dgc [_cdab ]);
|
|
|
|
_gdc !=nil {return _e .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_bbf );};}else {_bgb =(uint16 (_dgc [_cdab ])<<8)|uint16 (_dgc [_dcbc ]);if _gdc =_dab .setTwoBytes (_bbf ,_bgb );_gdc !=nil {return _e .Errorf ("s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_bbf );
|
|
|
|
};_ddea ++;};};};return nil ;};func _dgb ()(_aaa [256]uint16 ){for _baa :=0;_baa < 256;_baa ++{if _baa &0x01!=0{_aaa [_baa ]|=0x3;};if _baa &0x02!=0{_aaa [_baa ]|=0xc;};if _baa &0x04!=0{_aaa [_baa ]|=0x30;};if _baa &0x08!=0{_aaa [_baa ]|=0xc0;};if _baa &0x10!=0{_aaa [_baa ]|=0x300;
|
|
|
|
};if _baa &0x20!=0{_aaa [_baa ]|=0xc00;};if _baa &0x40!=0{_aaa [_baa ]|=0x3000;};if _baa &0x80!=0{_aaa [_baa ]|=0xc000;};};return _aaa ;};func _abdc (_ccgg []byte ,_agb Image )error {_caddg :=true ;for _ffbf :=0;_ffbf < len (_ccgg );_ffbf ++{if _ccgg [_ffbf ]!=0xff{_caddg =false ;
|
|
|
|
break ;};};if _caddg {switch _bbgbc :=_agb .(type ){case *NRGBA32 :_bbgbc .Alpha =nil ;case *NRGBA64 :_bbgbc .Alpha =nil ;default:return _e .Errorf ("i\u006ete\u0072n\u0061l\u0020\u0065\u0072\u0072\u006fr\u0020\u002d\u0020i\u006d\u0061\u0067\u0065\u0020s\u0068\u006f\u0075l\u0064\u0020\u0062\u0065\u0020\u006f\u0066\u0020\u0074\u0079\u0070e\u0020\u002a\u004eRGB\u0041\u0033\u0032\u0020\u006f\u0072 \u002a\u004e\u0052\u0047\u0042\u0041\u0036\u0034\u0020\u0062\u0075\u0074 \u0069s\u003a\u0020\u0025\u0054",_agb );
|
|
|
|
};};return nil ;};func (_cfgc *Gray2 )ColorModel ()_gc .Model {return Gray2Model };func (_cdcd *Monochrome )Base ()*ImageBase {return &_cdcd .ImageBase };func (_edgg *Gray2 )SetGray (x ,y int ,gray _gc .Gray ){_dbbd :=_dagf (gray );_faef :=y *_edgg .BytesPerLine ;
|
|
|
|
_gfba :=_faef +(x >>2);if _gfba >=len (_edgg .Data ){return ;};_eff :=_dbbd .Y >>6;_edgg .Data [_gfba ]=(_edgg .Data [_gfba ]&(^(0xc0>>uint (2*((x )&3)))))|(_eff <<uint (6-2*(x &3)));};func _gegg (_gaa _gc .CMYK )_gc .RGBA {_gggf ,_dba ,_cfa :=_gc .CMYKToRGB (_gaa .C ,_gaa .M ,_gaa .Y ,_gaa .K );
|
|
|
|
return _gc .RGBA {R :_gggf ,G :_dba ,B :_cfa ,A :0xff};};type CMYK interface{CMYKAt (_eda ,_ecdd int )_gc .CMYK ;SetCMYK (_bbef ,_cffe int ,_gedf _gc .CMYK );};type monochromeModel uint8 ;const (PixSrc RasterOperator =0xc;PixDst RasterOperator =0xa;PixNotSrc RasterOperator =0x3;
|
|
|
|
PixNotDst RasterOperator =0x5;PixClr RasterOperator =0x0;PixSet RasterOperator =0xf;PixSrcOrDst RasterOperator =0xe;PixSrcAndDst RasterOperator =0x8;PixSrcXorDst RasterOperator =0x6;PixNotSrcOrDst RasterOperator =0xb;PixNotSrcAndDst RasterOperator =0x2;
|
|
|
|
PixSrcOrNotDst RasterOperator =0xd;PixSrcAndNotDst RasterOperator =0x4;PixNotPixSrcOrDst RasterOperator =0x1;PixNotPixSrcAndDst RasterOperator =0x7;PixNotPixSrcXorDst RasterOperator =0x9;PixPaint =PixSrcOrDst ;PixSubtract =PixNotSrcAndDst ;PixMask =PixSrcAndDst ;
|
|
|
|
);func _ebdgb (_aadc ,_fade RGBA ,_deec _f .Rectangle ){for _ffdfe :=0;_ffdfe < _deec .Max .X ;_ffdfe ++{for _bgec :=0;_bgec < _deec .Max .Y ;_bgec ++{_fade .SetRGBA (_ffdfe ,_bgec ,_aadc .RGBAAt (_ffdfe ,_bgec ));};};};var _ Gray =&Monochrome {};func (_cfga *NRGBA16 )Copy ()Image {return &NRGBA16 {ImageBase :_cfga .copy ()}};
|
|
|
|
type NRGBA64 struct{ImageBase };func (_fee *CMYK32 )ColorAt (x ,y int )(_gc .Color ,error ){return ColorAtCMYK (x ,y ,_fee .Width ,_fee .Data ,_fee .Decode );};type RasterOperator int ;func (_daef *RGBA32 )Validate ()error {if len (_daef .Data )!=3*_daef .Width *_daef .Height {return _a .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 _gcg ()(_cac [256]uint32 ){for _cec :=0;_cec < 256;_cec ++{if _cec &0x01!=0{_cac [_cec ]|=0xf;};if _cec &0x02!=0{_cac [_cec ]|=0xf0;};if _cec &0x04!=0{_cac [_cec ]|=0xf00;};if _cec &0x08!=0{_cac [_cec ]|=0xf000;};if _cec &0x10!=0{_cac [_cec ]|=0xf0000;
|
|
|
|
};if _cec &0x20!=0{_cac [_cec ]|=0xf00000;};if _cec &0x40!=0{_cac [_cec ]|=0xf000000;};if _cec &0x80!=0{_cac [_cec ]|=0xf0000000;};};return _cac ;};func _acea (_eecb nrgba64 ,_bdce NRGBA ,_cbaa _f .Rectangle ){for _bcef :=0;_bcef < _cbaa .Max .X ;_bcef ++{for _geaa :=0;
|
|
|
|
_geaa < _cbaa .Max .Y ;_geaa ++{_bfaa :=_eecb .NRGBA64At (_bcef ,_geaa );_bdce .SetNRGBA (_bcef ,_geaa ,_acg (_bfaa ));};};};func (_ageb *NRGBA32 )Base ()*ImageBase {return &_ageb .ImageBase };func (_aecb *Monochrome )setIndexedBit (_fff int ){_aecb .Data [(_fff >>3)]|=0x80>>uint (_fff &7)};
|
|
|
|
type Gray4 struct{ImageBase };func (_ecee *NRGBA64 )ColorAt (x ,y int )(_gc .Color ,error ){return ColorAtNRGBA64 (x ,y ,_ecee .Width ,_ecee .Data ,_ecee .Alpha ,_ecee .Decode );};func _efcbf (_cadfc _f .Image ,_fbcgb Image ,_bbcd _f .Rectangle ){if _cdeff ,_fccg :=_cadfc .(SMasker );
|
|
|
|
_fccg &&_cdeff .HasAlpha (){_fbcgb .(SMasker ).MakeAlpha ();};_dcca (_cadfc ,_fbcgb ,_bbcd );};func (_bceg *RGBA32 )RGBAAt (x ,y int )_gc .RGBA {_ddeac ,_ :=ColorAtRGBA32 (x ,y ,_bceg .Width ,_bceg .Data ,_bceg .Alpha ,_bceg .Decode );return _ddeac ;};
|
|
|
|
func (_agc colorConverter )Convert (src _f .Image )(Image ,error ){return _agc ._bbefc (src )};func (_fac *Gray4 )Bounds ()_f .Rectangle {return _f .Rectangle {Max :_f .Point {X :_fac .Width ,Y :_fac .Height }};};type colorConverter struct{_bbefc func (_gec _f .Image )(Image ,error );
|
|
|
|
};func (_bbdbe *Gray4 )setGray (_cag int ,_bega int ,_eacf _gc .Gray ){_bccf :=_bega *_bbdbe .BytesPerLine ;_ebdg :=_bccf +(_cag >>1);if _ebdg >=len (_bbdbe .Data ){return ;};_agdc :=_eacf .Y >>4;_bbdbe .Data [_ebdg ]=(_bbdbe .Data [_ebdg ]&(^(0xf0>>uint (4*(_cag &1)))))|(_agdc <<uint (4-4*(_cag &1)));
|
|
|
|
};func (_cad *CMYK32 )Bounds ()_f .Rectangle {return _f .Rectangle {Max :_f .Point {X :_cad .Width ,Y :_cad .Height }};};func _fef (_ffba CMYK ,_dcgc RGBA ,_beac _f .Rectangle ){for _gebgc :=0;_gebgc < _beac .Max .X ;_gebgc ++{for _fdfa :=0;_fdfa < _beac .Max .Y ;
|
|
|
|
_fdfa ++{_dbcd :=_ffba .CMYKAt (_gebgc ,_fdfa );_dcgc .SetRGBA (_gebgc ,_fdfa ,_gegg (_dbcd ));};};};func (_caec *NRGBA64 )SetNRGBA64 (x ,y int ,c _gc .NRGBA64 ){_gcaa :=(y *_caec .Width +x )*2;_cbeg :=_gcaa *3;if _cbeg +5>=len (_caec .Data ){return ;};
|
|
|
|
_caec .setNRGBA64 (_cbeg ,c ,_gcaa );};func (_ecab *Gray16 )Base ()*ImageBase {return &_ecab .ImageBase };func (_gba *NRGBA16 )Bounds ()_f .Rectangle {return _f .Rectangle {Max :_f .Point {X :_gba .Width ,Y :_gba .Height }};};func _efg (_cafb *Monochrome ,_eec ,_efc int )(*Monochrome ,error ){if _cafb ==nil {return nil ,_a .New ("\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if _eec <=0||_efc <=0{return nil ,_a .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 _eec ==_efc {if _eec ==1{return _cafb .copy (),nil ;
|
|
|
|
};if _eec ==2||_eec ==4||_eec ==8{_fc ,_af :=_ebc (_cafb ,_eec );if _af !=nil {return nil ,_af ;};return _fc ,nil ;};};_dda :=_eec *_cafb .Width ;_gac :=_efc *_cafb .Height ;_egc :=_cea (_dda ,_gac );_ada :=_egc .BytesPerLine ;var (_fde ,_dag ,_eaf ,_afg ,_fca int ;
|
|
|
|
_fbf byte ;_daa error ;);for _dag =0;_dag < _cafb .Height ;_dag ++{_fde =_efc *_dag *_ada ;for _eaf =0;_eaf < _cafb .Width ;_eaf ++{if _fgc :=_cafb .getBitAt (_eaf ,_dag );_fgc {_fca =_eec *_eaf ;for _afg =0;_afg < _eec ;_afg ++{_egc .setIndexedBit (_fde *8+_fca +_afg );
|
|
|
|
};};};for _afg =1;_afg < _efc ;_afg ++{_bad :=_fde +_afg *_ada ;for _ed :=0;_ed < _ada ;_ed ++{if _fbf ,_daa =_egc .getByte (_fde +_ed );_daa !=nil {return nil ,_daa ;};if _daa =_egc .setByte (_bad +_ed ,_fbf );_daa !=nil {return nil ,_daa ;};};};};return _egc ,nil ;
|
|
|
|
};func (_gdae *NRGBA16 )Base ()*ImageBase {return &_gdae .ImageBase };func LinearInterpolate (x ,xmin ,xmax ,ymin ,ymax float64 )float64 {if _d .Abs (xmax -xmin )< 0.000001{return ymin ;};_abdg :=ymin +(x -xmin )*(ymax -ymin )/(xmax -xmin );return _abdg ;
|
|
|
|
};func _eaae (_cbga ,_edggg ,_effcg byte )byte {return (_cbga &^(_effcg ))|(_edggg &_effcg )};func _acge (_bffe _gc .Color )_gc .Color {_abg :=_gc .NRGBAModel .Convert (_bffe ).(_gc .NRGBA );return _eccd (_abg );};func (_fdag *Monochrome )InverseData ()error {return _fdag .RasterOperation (0,0,_fdag .Width ,_fdag .Height ,PixNotDst ,nil ,0,0);
|
|
|
|
};var _ Image =&NRGBA16 {};func (_dafgg *Gray2 )Copy ()Image {return &Gray2 {ImageBase :_dafgg .copy ()}};func _gebf (_ebggd nrgba64 ,_egcg RGBA ,_dbbg _f .Rectangle ){for _cbcef :=0;_cbcef < _dbbg .Max .X ;_cbcef ++{for _fabb :=0;_fabb < _dbbg .Max .Y ;
|
|
|
|
_fabb ++{_gcgff :=_ebggd .NRGBA64At (_cbcef ,_fabb );_egcg .SetRGBA (_cbcef ,_fabb ,_bcd (_gcgff ));};};};func (_egfg *Gray4 )Set (x ,y int ,c _gc .Color ){if x >=_egfg .Width ||y >=_egfg .Height {return ;};_cadf :=Gray4Model .Convert (c ).(_gc .Gray );
|
|
|
|
_egfg .setGray (x ,y ,_cadf );};func (_feef *Gray2 )Validate ()error {if len (_feef .Data )!=_feef .Height *_feef .BytesPerLine {return ErrInvalidImage ;};return nil ;};func (_dbcf *ImageBase )setEightFullBytes (_daea int ,_ecbf uint64 )error {if _daea +7> len (_dbcf .Data )-1{return _a .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
|
|
};_dbcf .Data [_daea ]=byte ((_ecbf &0xff00000000000000)>>56);_dbcf .Data [_daea +1]=byte ((_ecbf &0xff000000000000)>>48);_dbcf .Data [_daea +2]=byte ((_ecbf &0xff0000000000)>>40);_dbcf .Data [_daea +3]=byte ((_ecbf &0xff00000000)>>32);_dbcf .Data [_daea +4]=byte ((_ecbf &0xff000000)>>24);
|
|
|
|
_dbcf .Data [_daea +5]=byte ((_ecbf &0xff0000)>>16);_dbcf .Data [_daea +6]=byte ((_ecbf &0xff00)>>8);_dbcf .Data [_daea +7]=byte (_ecbf &0xff);return nil ;};func (_dffb *RGBA32 )ColorAt (x ,y int )(_gc .Color ,error ){return ColorAtRGBA32 (x ,y ,_dffb .Width ,_dffb .Data ,_dffb .Alpha ,_dffb .Decode );
|
|
|
|
};func (_eadb *ImageBase )MakeAlpha (){_eadb .newAlpha ()};func ColorAtGray8BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_gc .Gray ,error ){_baeb :=y *bytesPerLine +x ;if _baeb >=len (data ){return _gc .Gray {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
|
|
};_faa :=data [_baeb ];if len (decode )==2{_faa =uint8 (uint32 (LinearInterpolate (float64 (_faa ),0,255,decode [0],decode [1]))&0xff);};return _gc .Gray {Y :_faa },nil ;};func (_abba *Gray16 )SetGray (x ,y int ,g _gc .Gray ){_egcf :=(y *_abba .BytesPerLine /2+x )*2;
|
|
|
|
if _egcf +1>=len (_abba .Data ){return ;};_abba .Data [_egcf ]=g .Y ;_abba .Data [_egcf +1]=g .Y ;};var _ Gray =&Gray2 {};func (_eadbf *RGBA32 )Set (x ,y int ,c _gc .Color ){_faed :=y *_eadbf .Width +x ;_bffa :=3*_faed ;if _bffa +2>=len (_eadbf .Data ){return ;
|
|
|
|
};_begac :=_gc .RGBAModel .Convert (c ).(_gc .RGBA );_eadbf .setRGBA (_faed ,_begac );};func _gfca (_fdd _f .Image )(Image ,error ){if _bced ,_gcbg :=_fdd .(*NRGBA64 );_gcbg {return _bced .Copy (),nil ;};_dffcd ,_acgca ,_gbd :=_bfdb (_fdd ,2);_afaaf ,_feaef :=NewImage (_dffcd .Max .X ,_dffcd .Max .Y ,16,3,nil ,_gbd ,nil );
|
|
|
|
if _feaef !=nil {return nil ,_feaef ;};_efcbf (_fdd ,_afaaf ,_dffcd );if len (_gbd )!=0&&!_acgca {if _gfde :=_abdc (_gbd ,_afaaf );_gfde !=nil {return nil ,_gfde ;};};return _afaaf ,nil ;};func (_eeag *Gray16 )Histogram ()(_edfb [256]int ){for _ddd :=0;
|
|
|
|
_ddd < _eeag .Width ;_ddd ++{for _cbdg :=0;_cbdg < _eeag .Height ;_cbdg ++{_edfb [_eeag .GrayAt (_ddd ,_cbdg ).Y ]++;};};return _edfb ;};func _acg (_dgdg _gc .NRGBA64 )_gc .NRGBA {return _gc .NRGBA {R :uint8 (_dgdg .R >>8),G :uint8 (_dgdg .G >>8),B :uint8 (_dgdg .B >>8),A :uint8 (_dgdg .A >>8)};
|
|
|
|
};func (_eagb *NRGBA64 )At (x ,y int )_gc .Color {_ddfa ,_ :=_eagb .ColorAt (x ,y );return _ddfa };func _bfbf (_geba _gc .NYCbCrA )_gc .RGBA {_bde ,_ede ,_cfc ,_dggf :=_fdc (_geba ).RGBA ();return _gc .RGBA {R :uint8 (_bde >>8),G :uint8 (_ede >>8),B :uint8 (_cfc >>8),A :uint8 (_dggf >>8)};
|
|
|
|
};func (_bcff *Monochrome )At (x ,y int )_gc .Color {_egb ,_ :=_bcff .ColorAt (x ,y );return _egb };func (_gbbd *Gray8 )Base ()*ImageBase {return &_gbbd .ImageBase };func (_fcef *Gray16 )At (x ,y int )_gc .Color {_aaafa ,_ :=_fcef .ColorAt (x ,y );return _aaafa };
|
|
|
|
func (_caa *Gray2 )Base ()*ImageBase {return &_caa .ImageBase };func (_bba *NRGBA16 )setNRGBA (_fbgg ,_ebda ,_fcag int ,_gbbdf _gc .NRGBA ){if _fbgg *3%2==0{_bba .Data [_fcag ]=(_gbbdf .R >>4)<<4|(_gbbdf .G >>4);_bba .Data [_fcag +1]=(_gbbdf .B >>4)<<4|(_bba .Data [_fcag +1]&0xf);
|
|
|
|
}else {_bba .Data [_fcag ]=(_bba .Data [_fcag ]&0xf0)|(_gbbdf .R >>4);_bba .Data [_fcag +1]=(_gbbdf .G >>4)<<4|(_gbbdf .B >>4);};if _bba .Alpha !=nil {_effd :=_ebda *BytesPerLine (_bba .Width ,4,1);if _effd < len (_bba .Alpha ){if _fbgg %2==0{_bba .Alpha [_effd ]=(_gbbdf .A >>uint (4))<<uint (4)|(_bba .Alpha [_fcag ]&0xf);
|
|
|
|
}else {_bba .Alpha [_effd ]=(_bba .Alpha [_effd ]&0xf0)|(_gbbdf .A >>uint (4));};};};};var _ Image =&Gray16 {};func (_ddfg *Monochrome )ReduceBinary (factor float64 )(*Monochrome ,error ){_cgcd :=_bfef (uint (factor ));if !IsPowerOf2 (uint (factor )){_cgcd ++;
|
|
|
|
};_aecc :=make ([]int ,_cgcd );for _fdbaef :=range _aecc {_aecc [_fdbaef ]=4;};_ccb ,_afeg :=_cgc (_ddfg ,_aecc ...);if _afeg !=nil {return nil ,_afeg ;};return _ccb ,nil ;};var ErrInvalidImage =_a .New ("i\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0069\u006da\u0067\u0065\u0020\u0064\u0061\u0074\u0061 s\u0069\u007a\u0065\u0020f\u006f\u0072\u0020\u0070\u0072\u006f\u0076\u0069\u0064ed\u0020\u0064i\u006d\u0065\u006e\u0073\u0069\u006f\u006e\u0073");
|
|
|
|
func ColorAtGray2BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_gc .Gray ,error ){_gfg :=y *bytesPerLine +x >>2;if _gfg >=len (data ){return _gc .Gray {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
|
|
};_gaag :=data [_gfg ]>>uint (6-(x &3)*2)&3;if len (decode )==2{_gaag =uint8 (uint32 (LinearInterpolate (float64 (_gaag ),0,3.0,decode [0],decode [1]))&3);};return _gc .Gray {Y :_gaag *85},nil ;};func _ecdda (_dgdf *Monochrome ,_gegfg ,_bca int ,_dead ,_eabg int ,_adea RasterOperator ){var (_fdagc int ;
|
|
|
|
_dada byte ;_deeb ,_gcgc int ;_fgae int ;);_agae :=_dead >>3;_gbfe :=_dead &7;if _gbfe > 0{_dada =_egcfb [_gbfe ];};_fdagc =_dgdf .BytesPerLine *_bca +(_gegfg >>3);switch _adea {case PixClr :for _deeb =0;_deeb < _eabg ;_deeb ++{_fgae =_fdagc +_deeb *_dgdf .BytesPerLine ;
|
|
|
|
for _gcgc =0;_gcgc < _agae ;_gcgc ++{_dgdf .Data [_fgae ]=0x0;_fgae ++;};if _gbfe > 0{_dgdf .Data [_fgae ]=_eaae (_dgdf .Data [_fgae ],0x0,_dada );};};case PixSet :for _deeb =0;_deeb < _eabg ;_deeb ++{_fgae =_fdagc +_deeb *_dgdf .BytesPerLine ;for _gcgc =0;
|
|
|
|
_gcgc < _agae ;_gcgc ++{_dgdf .Data [_fgae ]=0xff;_fgae ++;};if _gbfe > 0{_dgdf .Data [_fgae ]=_eaae (_dgdf .Data [_fgae ],0xff,_dada );};};case PixNotDst :for _deeb =0;_deeb < _eabg ;_deeb ++{_fgae =_fdagc +_deeb *_dgdf .BytesPerLine ;for _gcgc =0;_gcgc < _agae ;
|
|
|
|
_gcgc ++{_dgdf .Data [_fgae ]=^_dgdf .Data [_fgae ];_fgae ++;};if _gbfe > 0{_dgdf .Data [_fgae ]=_eaae (_dgdf .Data [_fgae ],^_dgdf .Data [_fgae ],_dada );};};};};func _gfb (_fcab _f .Image )(Image ,error ){if _cbgd ,_abe :=_fcab .(*CMYK32 );_abe {return _cbgd .Copy (),nil ;
|
|
|
|
};_acc :=_fcab .Bounds ();_dgd ,_dccd :=NewImage (_acc .Max .X ,_acc .Max .Y ,8,4,nil ,nil ,nil );if _dccd !=nil {return nil ,_dccd ;};switch _ggc :=_fcab .(type ){case CMYK :_bddd (_ggc ,_dgd .(CMYK ),_acc );case Gray :_afa (_ggc ,_dgd .(CMYK ),_acc );
|
|
|
|
case NRGBA :_ace (_ggc ,_dgd .(CMYK ),_acc );case RGBA :_aeg (_ggc ,_dgd .(CMYK ),_acc );default:_dcca (_fcab ,_dgd ,_acc );};return _dgd ,nil ;};func (_cgg *Gray4 )ColorModel ()_gc .Model {return Gray4Model };func (_gaf *ImageBase )setFourBytes (_dfca int ,_affa uint32 )error {if _dfca +3> len (_gaf .Data )-1{return _e .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_dfca );
|
|
|
|
};_gaf .Data [_dfca ]=byte ((_affa &0xff000000)>>24);_gaf .Data [_dfca +1]=byte ((_affa &0xff0000)>>16);_gaf .Data [_dfca +2]=byte ((_affa &0xff00)>>8);_gaf .Data [_dfca +3]=byte (_affa &0xff);return nil ;};var _ Image =&RGBA32 {};func IsPowerOf2 (n uint )bool {return n > 0&&(n &(n -1))==0};
|
|
|
|
func (_adee *Gray8 )GrayAt (x ,y int )_gc .Gray {_becef ,_ :=ColorAtGray8BPC (x ,y ,_adee .BytesPerLine ,_adee .Data ,_adee .Decode );return _becef ;};func (_adage *Gray8 )Bounds ()_f .Rectangle {return _f .Rectangle {Max :_f .Point {X :_adage .Width ,Y :_adage .Height }};
|
|
|
|
};func (_gdcc *CMYK32 )ColorModel ()_gc .Model {return _gc .CMYKModel };var _ RGBA =&RGBA32 {};func _cdfg (_decd RGBA ,_gebac Gray ,_cfed _f .Rectangle ){for _eagd :=0;_eagd < _cfed .Max .X ;_eagd ++{for _fecg :=0;_fecg < _cfed .Max .Y ;_fecg ++{_begb :=_efgb (_decd .RGBAAt (_eagd ,_fecg ));
|
|
|
|
_gebac .SetGray (_eagd ,_fecg ,_begb );};};};func (_cgf *Monochrome )SetGray (x ,y int ,g _gc .Gray ){_eca :=y *_cgf .BytesPerLine +x >>3;if _eca > len (_cgf .Data )-1{return ;};g =_bcgd (g ,monochromeModel (_cgf .ModelThreshold ));_cgf .setGray (x ,g ,_eca );
|
|
|
|
};func (_fae *Monochrome )Bounds ()_f .Rectangle {return _f .Rectangle {Max :_f .Point {X :_fae .Width ,Y :_fae .Height }};};func _eega (_eeae CMYK ,_ddggc NRGBA ,_ccba _f .Rectangle ){for _dedcf :=0;_dedcf < _ccba .Max .X ;_dedcf ++{for _gafe :=0;_gafe < _ccba .Max .Y ;
|
|
|
|
_gafe ++{_ecgc :=_eeae .CMYKAt (_dedcf ,_gafe );_ddggc .SetNRGBA (_dedcf ,_gafe ,_bfac (_ecgc ));};};};func _eg (_gb *Monochrome ,_eeg int ,_fd []uint )(*Monochrome ,error ){_bc :=_eeg *_gb .Width ;_fg :=_eeg *_gb .Height ;_aa :=_cea (_bc ,_fg );for _bd ,_ad :=range _fd {var _gg error ;
|
|
|
|
switch _ad {case 2:_gg =_gad (_aa ,_gb );case 4:_gg =_gd (_aa ,_gb );case 8:_gg =_ba (_aa ,_gb );};if _gg !=nil {return nil ,_gg ;};if _bd !=len (_fd )-1{_gb =_aa .copy ();};};return _aa ,nil ;};func (_accd *Gray4 )GrayAt (x ,y int )_gc .Gray {_bcffb ,_ :=ColorAtGray4BPC (x ,y ,_accd .BytesPerLine ,_accd .Data ,_accd .Decode );
|
|
|
|
return _bcffb ;};func (_beg *Monochrome )Set (x ,y int ,c _gc .Color ){_agcc :=y *_beg .BytesPerLine +x >>3;if _agcc > len (_beg .Data )-1{return ;};_ffa :=_beg .ColorModel ().Convert (c ).(_gc .Gray );_beg .setGray (x ,_ffa ,_agcc );};func (_bfbc *CMYK32 )Copy ()Image {return &CMYK32 {ImageBase :_bfbc .copy ()}};
|
|
|
|
func (_aadd *Monochrome )ColorAt (x ,y int )(_gc .Color ,error ){return ColorAtGray1BPC (x ,y ,_aadd .BytesPerLine ,_aadd .Data ,_aadd .Decode );};func ColorAtGray4BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_gc .Gray ,error ){_gbc :=y *bytesPerLine +x >>1;
|
|
|
|
if _gbc >=len (data ){return _gc .Gray {},_e .Errorf ("\u0069\u006d\u0061\u0067\u0065\u0020\u0063\u006f\u006f\u0072\u0064\u0069\u006ea\u0074\u0065\u0073\u0020\u006f\u0075t\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u0028\u0025\u0064,\u0020\u0025\u0064\u0029",x ,y );
|
|
|
|
};_ggbc :=data [_gbc ]>>uint (4-(x &1)*4)&0xf;if len (decode )==2{_ggbc =uint8 (uint32 (LinearInterpolate (float64 (_ggbc ),0,15,decode [0],decode [1]))&0xf);};return _gc .Gray {Y :_ggbc *17&0xff},nil ;};func (_degg *Gray2 )Histogram ()(_efeb [256]int ){for _ddb :=0;
|
|
|
|
_ddb < _degg .Width ;_ddb ++{for _bdb :=0;_bdb < _degg .Height ;_bdb ++{_efeb [_degg .GrayAt (_ddb ,_bdb ).Y ]++;};};return _efeb ;};func _aadg (_gcae _gc .RGBA )_gc .NRGBA {switch _gcae .A {case 0xff:return _gc .NRGBA {R :_gcae .R ,G :_gcae .G ,B :_gcae .B ,A :0xff};
|
|
|
|
case 0x00:return _gc .NRGBA {};default:_aabgba ,_gfc ,_ebcf ,_cbf :=_gcae .RGBA ();_aabgba =(_aabgba *0xffff)/_cbf ;_gfc =(_gfc *0xffff)/_cbf ;_ebcf =(_ebcf *0xffff)/_cbf ;return _gc .NRGBA {R :uint8 (_aabgba >>8),G :uint8 (_gfc >>8),B :uint8 (_ebcf >>8),A :uint8 (_cbf >>8)};
|
|
|
|
};};
|