mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-30 13:48:51 +08:00
401 lines
114 KiB
Go
401 lines
114 KiB
Go
//
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
//
|
|
// This is a commercial product and requires a license to operate.
|
|
// A trial license can be obtained at https://unidoc.io
|
|
//
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
//
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
package imageutil ;import (_d "encoding/binary";_c "errors";_f "fmt";_fb "github.com/unidoc/unipdf/v3/common";_cb "github.com/unidoc/unipdf/v3/internal/bitwise";_ce "image";_e "image/color";_g "image/draw";_cg "math";);func (_dabf *Gray4 )setGray (_egbd int ,_gcda int ,_gcf _e .Gray ){_abeg :=_gcda *_dabf .BytesPerLine ;
|
|
_deeb :=_abeg +(_egbd >>1);if _deeb >=len (_dabf .Data ){return ;};_decc :=_gcf .Y >>4;_dabf .Data [_deeb ]=(_dabf .Data [_deeb ]&(^(0xf0>>uint (4*(_egbd &1)))))|(_decc <<uint (4-4*(_egbd &1)));};func (_bbgf *Gray8 )Set (x ,y int ,c _e .Color ){_deba :=y *_bbgf .BytesPerLine +x ;
|
|
if _deba > len (_bbgf .Data )-1{return ;};_ceed :=_e .GrayModel .Convert (c );_bbgf .Data [_deba ]=_ceed .(_e .Gray ).Y ;};func (_bgg *Monochrome )Scale (scale float64 )(*Monochrome ,error ){var _edeg bool ;_gdcg :=scale ;if scale < 1{_gdcg =1/scale ;_edeg =true ;
|
|
};_agbe :=NextPowerOf2 (uint (_gdcg ));if InDelta (float64 (_agbe ),_gdcg ,0.001){if _edeg {return _bgg .ReduceBinary (_gdcg );};return _bgg .ExpandBinary (int (_agbe ));};_aeg :=int (_cg .RoundToEven (float64 (_bgg .Width )*scale ));_cfea :=int (_cg .RoundToEven (float64 (_bgg .Height )*scale ));
|
|
return _bgg .ScaleLow (_aeg ,_cfea );};func (_feee *Gray4 )Histogram ()(_bbba [256]int ){for _befe :=0;_befe < _feee .Width ;_befe ++{for _edea :=0;_edea < _feee .Height ;_edea ++{_bbba [_feee .GrayAt (_befe ,_edea ).Y ]++;};};return _bbba ;};var _ Image =&Gray16 {};
|
|
func ColorAtGray8BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_e .Gray ,error ){_begbf :=y *bytesPerLine +x ;if _begbf >=len (data ){return _e .Gray {},_f .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 );
|
|
};_bba :=data [_begbf ];if len (decode )==2{_bba =uint8 (uint32 (LinearInterpolate (float64 (_bba ),0,255,decode [0],decode [1]))&0xff);};return _e .Gray {Y :_bba },nil ;};func _abbb (_cdega *Monochrome ,_agc ,_dcff ,_bebg ,_bgac int ,_cefb RasterOperator ,_cggg *Monochrome ,_acga ,_bffa int )error {var (_fgcf bool ;
|
|
_gbbb bool ;_agegg int ;_dbefg int ;_gecf int ;_aefa bool ;_fgdc byte ;_eeab int ;_ecg int ;_dgdg int ;_ffg ,_debee int ;);_efdd :=8-(_agc &7);_bdea :=_bcf [_efdd ];_deccb :=_cdega .BytesPerLine *_dcff +(_agc >>3);_bddg :=_cggg .BytesPerLine *_bffa +(_acga >>3);
|
|
if _bebg < _efdd {_fgcf =true ;_bdea &=_eeacb [8-_efdd +_bebg ];};if !_fgcf {_agegg =(_bebg -_efdd )>>3;if _agegg > 0{_gbbb =true ;_dbefg =_deccb +1;_gecf =_bddg +1;};};_eeab =(_agc +_bebg )&7;if !(_fgcf ||_eeab ==0){_aefa =true ;_fgdc =_eeacb [_eeab ];
|
|
_ecg =_deccb +1+_agegg ;_dgdg =_bddg +1+_agegg ;};switch _cefb {case PixSrc :for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],_cggg .Data [_bddg ],_bdea );_deccb +=_cdega .BytesPerLine ;_bddg +=_cggg .BytesPerLine ;
|
|
};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;_debee ++{_cdega .Data [_dbefg +_debee ]=_cggg .Data [_gecf +_debee ];};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;};};if _aefa {for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],_cggg .Data [_dgdg ],_fgdc );
|
|
_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};case PixNotSrc :for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],^_cggg .Data [_bddg ],_bdea );_deccb +=_cdega .BytesPerLine ;_bddg +=_cggg .BytesPerLine ;
|
|
};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;_debee ++{_cdega .Data [_dbefg +_debee ]=^_cggg .Data [_gecf +_debee ];};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;};};if _aefa {for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],^_cggg .Data [_dgdg ],_fgdc );
|
|
_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};case PixSrcOrDst :for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],_cggg .Data [_bddg ]|_cdega .Data [_deccb ],_bdea );_deccb +=_cdega .BytesPerLine ;_bddg +=_cggg .BytesPerLine ;
|
|
};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;_debee ++{_cdega .Data [_dbefg +_debee ]|=_cggg .Data [_gecf +_debee ];};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;};};if _aefa {for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],_cggg .Data [_dgdg ]|_cdega .Data [_ecg ],_fgdc );
|
|
_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};case PixSrcAndDst :for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],_cggg .Data [_bddg ]&_cdega .Data [_deccb ],_bdea );_deccb +=_cdega .BytesPerLine ;_bddg +=_cggg .BytesPerLine ;
|
|
};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;_debee ++{_cdega .Data [_dbefg +_debee ]&=_cggg .Data [_gecf +_debee ];};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;};};if _aefa {for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],_cggg .Data [_dgdg ]&_cdega .Data [_ecg ],_fgdc );
|
|
_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};case PixSrcXorDst :for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],_cggg .Data [_bddg ]^_cdega .Data [_deccb ],_bdea );_deccb +=_cdega .BytesPerLine ;_bddg +=_cggg .BytesPerLine ;
|
|
};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;_debee ++{_cdega .Data [_dbefg +_debee ]^=_cggg .Data [_gecf +_debee ];};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;};};if _aefa {for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],_cggg .Data [_dgdg ]^_cdega .Data [_ecg ],_fgdc );
|
|
_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};case PixNotSrcOrDst :for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],^(_cggg .Data [_bddg ])|_cdega .Data [_deccb ],_bdea );_deccb +=_cdega .BytesPerLine ;
|
|
_bddg +=_cggg .BytesPerLine ;};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;_debee ++{_cdega .Data [_dbefg +_debee ]|=^(_cggg .Data [_gecf +_debee ]);};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;};};if _aefa {for _ffg =0;
|
|
_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],^(_cggg .Data [_dgdg ])|_cdega .Data [_ecg ],_fgdc );_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};case PixNotSrcAndDst :for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],^(_cggg .Data [_bddg ])&_cdega .Data [_deccb ],_bdea );
|
|
_deccb +=_cdega .BytesPerLine ;_bddg +=_cggg .BytesPerLine ;};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;_debee ++{_cdega .Data [_dbefg +_debee ]&=^_cggg .Data [_gecf +_debee ];};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;
|
|
};};if _aefa {for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],^(_cggg .Data [_dgdg ])&_cdega .Data [_ecg ],_fgdc );_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};case PixSrcOrNotDst :for _ffg =0;_ffg < _bgac ;
|
|
_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],_cggg .Data [_bddg ]|^(_cdega .Data [_deccb ]),_bdea );_deccb +=_cdega .BytesPerLine ;_bddg +=_cggg .BytesPerLine ;};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;
|
|
_debee ++{_cdega .Data [_dbefg +_debee ]=_cggg .Data [_gecf +_debee ]|^(_cdega .Data [_dbefg +_debee ]);};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;};};if _aefa {for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],_cggg .Data [_dgdg ]|^(_cdega .Data [_ecg ]),_fgdc );
|
|
_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};case PixSrcAndNotDst :for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],_cggg .Data [_bddg ]&^(_cdega .Data [_deccb ]),_bdea );_deccb +=_cdega .BytesPerLine ;
|
|
_bddg +=_cggg .BytesPerLine ;};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;_debee ++{_cdega .Data [_dbefg +_debee ]=_cggg .Data [_gecf +_debee ]&^(_cdega .Data [_dbefg +_debee ]);};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;
|
|
};};if _aefa {for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],_cggg .Data [_dgdg ]&^(_cdega .Data [_ecg ]),_fgdc );_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};case PixNotPixSrcOrDst :for _ffg =0;_ffg < _bgac ;
|
|
_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],^(_cggg .Data [_bddg ]|_cdega .Data [_deccb ]),_bdea );_deccb +=_cdega .BytesPerLine ;_bddg +=_cggg .BytesPerLine ;};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;
|
|
_debee ++{_cdega .Data [_dbefg +_debee ]=^(_cggg .Data [_gecf +_debee ]|_cdega .Data [_dbefg +_debee ]);};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;};};if _aefa {for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],^(_cggg .Data [_dgdg ]|_cdega .Data [_ecg ]),_fgdc );
|
|
_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};case PixNotPixSrcAndDst :for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],^(_cggg .Data [_bddg ]&_cdega .Data [_deccb ]),_bdea );_deccb +=_cdega .BytesPerLine ;
|
|
_bddg +=_cggg .BytesPerLine ;};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;_debee ++{_cdega .Data [_dbefg +_debee ]=^(_cggg .Data [_gecf +_debee ]&_cdega .Data [_dbefg +_debee ]);};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;
|
|
};};if _aefa {for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],^(_cggg .Data [_dgdg ]&_cdega .Data [_ecg ]),_fgdc );_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};case PixNotPixSrcXorDst :for _ffg =0;_ffg < _bgac ;
|
|
_ffg ++{_cdega .Data [_deccb ]=_ffab (_cdega .Data [_deccb ],^(_cggg .Data [_bddg ]^_cdega .Data [_deccb ]),_bdea );_deccb +=_cdega .BytesPerLine ;_bddg +=_cggg .BytesPerLine ;};if _gbbb {for _ffg =0;_ffg < _bgac ;_ffg ++{for _debee =0;_debee < _agegg ;
|
|
_debee ++{_cdega .Data [_dbefg +_debee ]=^(_cggg .Data [_gecf +_debee ]^_cdega .Data [_dbefg +_debee ]);};_dbefg +=_cdega .BytesPerLine ;_gecf +=_cggg .BytesPerLine ;};};if _aefa {for _ffg =0;_ffg < _bgac ;_ffg ++{_cdega .Data [_ecg ]=_ffab (_cdega .Data [_ecg ],^(_cggg .Data [_dgdg ]^_cdega .Data [_ecg ]),_fgdc );
|
|
_ecg +=_cdega .BytesPerLine ;_dgdg +=_cggg .BytesPerLine ;};};default:_fb .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",_cefb );return _c .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 (_cdad *Monochrome )ColorModel ()_e .Model {return MonochromeModel (_cdad .ModelThreshold )};var (MonochromeConverter =ConverterFunc (_afad );Gray2Converter =ConverterFunc (_acbc );Gray4Converter =ConverterFunc (_aceg );GrayConverter =ConverterFunc (_bfad );
|
|
Gray16Converter =ConverterFunc (_ecab );NRGBA16Converter =ConverterFunc (_ecdeg );NRGBAConverter =ConverterFunc (_aecbf );NRGBA64Converter =ConverterFunc (_dgbe );RGBAConverter =ConverterFunc (_bbgeg );CMYKConverter =ConverterFunc (_agde ););func _fdbb (_ageb _ce .Image ,_bbc Image ,_dcg _ce .Rectangle ){switch _afec :=_ageb .(type ){case Gray :_bde (_afec ,_bbc .(Gray ),_dcg );
|
|
case NRGBA :_gagf (_afec ,_bbc .(Gray ),_dcg );case CMYK :_fddc (_afec ,_bbc .(Gray ),_dcg );case RGBA :_ecde (_afec ,_bbc .(Gray ),_dcg );default:_cbga (_ageb ,_bbc .(Image ),_dcg );};};func _gbdc (_gfed int ,_bfbf int )int {if _gfed < _bfbf {return _gfed ;
|
|
};return _bfbf ;};func ColorAtCMYK (x ,y ,width int ,data []byte ,decode []float64 )(_e .CMYK ,error ){_daf :=4*(y *width +x );if _daf +3>=len (data ){return _e .CMYK {},_f .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 [_daf ]&0xff;M :=data [_daf +1]&0xff;Y :=data [_daf +2]&0xff;K :=data [_daf +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 _e .CMYK {C :C ,M :M ,Y :Y ,K :K },nil ;};type CMYK32 struct{ImageBase };
|
|
const (_bcfe shift =iota ;_edae ;);func _ba (_ff *Monochrome ,_da int ,_ca []uint )(*Monochrome ,error ){_fbb :=_da *_ff .Width ;_de :=_da *_ff .Height ;_fd :=_eda (_fbb ,_de );for _ad ,_fbe :=range _ca {var _aa error ;switch _fbe {case 2:_aa =_cd (_fd ,_ff );
|
|
case 4:_aa =_ec (_fd ,_ff );case 8:_aa =_bd (_fd ,_ff );};if _aa !=nil {return nil ,_aa ;};if _ad !=len (_ca )-1{_ff =_fd .copy ();};};return _fd ,nil ;};var _ Image =&RGBA32 {};func ColorAtGrayscale (x ,y ,bitsPerColor ,bytesPerLine int ,data []byte ,decode []float64 )(_e .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 ,_f .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 (_gfe *Gray16 )Set (x ,y int ,c _e .Color ){_becf :=(y *_gfe .BytesPerLine /2+x )*2;if _becf +1>=len (_gfe .Data ){return ;};_gaeeg :=_e .Gray16Model .Convert (c ).(_e .Gray16 );_gfe .Data [_becf ],_gfe .Data [_becf +1]=uint8 (_gaeeg .Y >>8),uint8 (_gaeeg .Y &0xff);
|
|
};func (_gdeb *ImageBase )newAlpha (){_cdgeb :=BytesPerLine (_gdeb .Width ,_gdeb .BitsPerComponent ,1);_gdeb .Alpha =make ([]byte ,_gdeb .Height *_cdgeb );};func (_fbef *Gray8 )Copy ()Image {return &Gray8 {ImageBase :_fbef .copy ()}};func (_dca *Gray4 )SetGray (x ,y int ,g _e .Gray ){if x >=_dca .Width ||y >=_dca .Height {return ;
|
|
};g =_agg (g );_dca .setGray (x ,y ,g );};func _fbba (_cbc _e .NRGBA64 )_e .Gray {var _gbd _e .NRGBA64 ;if _cbc ==_gbd {return _e .Gray {Y :0xff};};_adg ,_adc ,_fga ,_ :=_cbc .RGBA ();_fbeb :=(19595*_adg +38470*_adc +7471*_fga +1<<15)>>24;return _e .Gray {Y :uint8 (_fbeb )};
|
|
};func _agde (_ebdf _ce .Image )(Image ,error ){if _dde ,_cfd :=_ebdf .(*CMYK32 );_cfd {return _dde .Copy (),nil ;};_fea :=_ebdf .Bounds ();_gceb ,_egea :=NewImage (_fea .Max .X ,_fea .Max .Y ,8,4,nil ,nil ,nil );if _egea !=nil {return nil ,_egea ;};switch _bgd :=_ebdf .(type ){case CMYK :_degf (_bgd ,_gceb .(CMYK ),_fea );
|
|
case Gray :_gef (_bgd ,_gceb .(CMYK ),_fea );case NRGBA :_dfd (_bgd ,_gceb .(CMYK ),_fea );case RGBA :_aecb (_bgd ,_gceb .(CMYK ),_fea );default:_cbga (_ebdf ,_gceb ,_fea );};return _gceb ,nil ;};type Gray16 struct{ImageBase };func (_bbag *RGBA32 )Set (x ,y int ,c _e .Color ){_def :=y *_bbag .Width +x ;
|
|
_fcaea :=3*_def ;if _fcaea +2>=len (_bbag .Data ){return ;};_fec :=_e .RGBAModel .Convert (c ).(_e .RGBA );_bbag .setRGBA (_def ,_fec );};func _gfbb (_dba ,_cdgf *Monochrome ,_dbdf []byte ,_bbb int )(_ceb error ){var (_aca ,_fag ,_aef ,_dfa ,_bed ,_abb ,_dc ,_gda int ;
|
|
_dec ,_eee ,_ggeb ,_ced uint32 ;_bacb ,_dgfd byte ;_aff uint16 ;);_bcg :=make ([]byte ,4);_eea :=make ([]byte ,4);for _aef =0;_aef < _dba .Height -1;_aef ,_dfa =_aef +2,_dfa +1{_aca =_aef *_dba .BytesPerLine ;_fag =_dfa *_cdgf .BytesPerLine ;for _bed ,_abb =0,0;
|
|
_bed < _bbb ;_bed ,_abb =_bed +4,_abb +1{for _dc =0;_dc < 4;_dc ++{_gda =_aca +_bed +_dc ;if _gda <=len (_dba .Data )-1&&_gda < _aca +_dba .BytesPerLine {_bcg [_dc ]=_dba .Data [_gda ];}else {_bcg [_dc ]=0x00;};_gda =_aca +_dba .BytesPerLine +_bed +_dc ;
|
|
if _gda <=len (_dba .Data )-1&&_gda < _aca +(2*_dba .BytesPerLine ){_eea [_dc ]=_dba .Data [_gda ];}else {_eea [_dc ]=0x00;};};_dec =_d .BigEndian .Uint32 (_bcg );_eee =_d .BigEndian .Uint32 (_eea );_ggeb =_dec &_eee ;_ggeb |=_ggeb <<1;_ced =_dec |_eee ;
|
|
_ced &=_ced <<1;_eee =_ggeb |_ced ;_eee &=0xaaaaaaaa;_dec =_eee |(_eee <<7);_bacb =byte (_dec >>24);_dgfd =byte ((_dec >>8)&0xff);_gda =_fag +_abb ;if _gda +1==len (_cdgf .Data )-1||_gda +1>=_fag +_cdgf .BytesPerLine {if _ceb =_cdgf .setByte (_gda ,_dbdf [_bacb ]);
|
|
_ceb !=nil {return _f .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_gda );};}else {_aff =(uint16 (_dbdf [_bacb ])<<8)|uint16 (_dbdf [_dgfd ]);if _ceb =_cdgf .setTwoBytes (_gda ,_aff );_ceb !=nil {return _f .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",_gda );
|
|
};_abb ++;};};};return nil ;};func _ffda (_cdfea *_ce .Gray )bool {for _gbda :=0;_gbda < len (_cdfea .Pix );_gbda ++{if !_geeg (_cdfea .Pix [_gbda ]){return false ;};};return true ;};func (_beee *Monochrome )Histogram ()(_fgedf [256]int ){for _ ,_dagf :=range _beee .Data {_fgedf [0xff]+=int (_bbgd [_beee .Data [_dagf ]]);
|
|
};return _fgedf ;};func (_ffdg *Gray4 )Copy ()Image {return &Gray4 {ImageBase :_ffdg .copy ()}};func AddDataPadding (width ,height ,bitsPerComponent ,colorComponents int ,data []byte )([]byte ,error ){_ecfd :=BytesPerLine (width ,bitsPerComponent ,colorComponents );
|
|
if _ecfd ==width *colorComponents *bitsPerComponent /8{return data ,nil ;};_cgdc :=width *colorComponents *bitsPerComponent ;_cce :=_ecfd *8;_eef :=8-(_cce -_cgdc );_aac :=_cb .NewReader (data );_eggfg :=_ecfd -1;_bbfac :=make ([]byte ,_eggfg );_bbgc :=make ([]byte ,height *_ecfd );
|
|
_afba :=_cb .NewWriterMSB (_bbgc );var _ceda uint64 ;var _bfddg error ;for _bdag :=0;_bdag < height ;_bdag ++{_ ,_bfddg =_aac .Read (_bbfac );if _bfddg !=nil {return nil ,_bfddg ;};_ ,_bfddg =_afba .Write (_bbfac );if _bfddg !=nil {return nil ,_bfddg ;
|
|
};_ceda ,_bfddg =_aac .ReadBits (byte (_eef ));if _bfddg !=nil {return nil ,_bfddg ;};_ ,_bfddg =_afba .WriteBits (_ceda ,_eef );if _bfddg !=nil {return nil ,_bfddg ;};_afba .FinishByte ();};return _bbgc ,nil ;};func (_acf *Gray8 )GrayAt (x ,y int )_e .Gray {_acfe ,_ :=ColorAtGray8BPC (x ,y ,_acf .BytesPerLine ,_acf .Data ,_acf .Decode );
|
|
return _acfe ;};func _gfgb (_cdea *Monochrome ,_debed ,_gffea int ,_cgce ,_ega int ,_dddd RasterOperator ){var (_gebf bool ;_dagfe bool ;_ccac int ;_dbfc int ;_fgggg int ;_bdeaf int ;_aaeag bool ;_gbbe byte ;);_fbee :=8-(_debed &7);_cfc :=_bcf [_fbee ];
|
|
_aeac :=_cdea .BytesPerLine *_gffea +(_debed >>3);if _cgce < _fbee {_gebf =true ;_cfc &=_eeacb [8-_fbee +_cgce ];};if !_gebf {_ccac =(_cgce -_fbee )>>3;if _ccac !=0{_dagfe =true ;_dbfc =_aeac +1;};};_fgggg =(_debed +_cgce )&7;if !(_gebf ||_fgggg ==0){_aaeag =true ;
|
|
_gbbe =_eeacb [_fgggg ];_bdeaf =_aeac +1+_ccac ;};var _aaee ,_ebfc int ;switch _dddd {case PixClr :for _aaee =0;_aaee < _ega ;_aaee ++{_cdea .Data [_aeac ]=_ffab (_cdea .Data [_aeac ],0x0,_cfc );_aeac +=_cdea .BytesPerLine ;};if _dagfe {for _aaee =0;_aaee < _ega ;
|
|
_aaee ++{for _ebfc =0;_ebfc < _ccac ;_ebfc ++{_cdea .Data [_dbfc +_ebfc ]=0x0;};_dbfc +=_cdea .BytesPerLine ;};};if _aaeag {for _aaee =0;_aaee < _ega ;_aaee ++{_cdea .Data [_bdeaf ]=_ffab (_cdea .Data [_bdeaf ],0x0,_gbbe );_bdeaf +=_cdea .BytesPerLine ;
|
|
};};case PixSet :for _aaee =0;_aaee < _ega ;_aaee ++{_cdea .Data [_aeac ]=_ffab (_cdea .Data [_aeac ],0xff,_cfc );_aeac +=_cdea .BytesPerLine ;};if _dagfe {for _aaee =0;_aaee < _ega ;_aaee ++{for _ebfc =0;_ebfc < _ccac ;_ebfc ++{_cdea .Data [_dbfc +_ebfc ]=0xff;
|
|
};_dbfc +=_cdea .BytesPerLine ;};};if _aaeag {for _aaee =0;_aaee < _ega ;_aaee ++{_cdea .Data [_bdeaf ]=_ffab (_cdea .Data [_bdeaf ],0xff,_gbbe );_bdeaf +=_cdea .BytesPerLine ;};};case PixNotDst :for _aaee =0;_aaee < _ega ;_aaee ++{_cdea .Data [_aeac ]=_ffab (_cdea .Data [_aeac ],^_cdea .Data [_aeac ],_cfc );
|
|
_aeac +=_cdea .BytesPerLine ;};if _dagfe {for _aaee =0;_aaee < _ega ;_aaee ++{for _ebfc =0;_ebfc < _ccac ;_ebfc ++{_cdea .Data [_dbfc +_ebfc ]=^(_cdea .Data [_dbfc +_ebfc ]);};_dbfc +=_cdea .BytesPerLine ;};};if _aaeag {for _aaee =0;_aaee < _ega ;_aaee ++{_cdea .Data [_bdeaf ]=_ffab (_cdea .Data [_bdeaf ],^_cdea .Data [_bdeaf ],_gbbe );
|
|
_bdeaf +=_cdea .BytesPerLine ;};};};};func (_edbd *NRGBA16 )SetNRGBA (x ,y int ,c _e .NRGBA ){_bgbe :=y *_edbd .BytesPerLine +x *3/2;if _bgbe +1>=len (_edbd .Data ){return ;};c =_cefc (c );_edbd .setNRGBA (x ,y ,_bgbe ,c );};func (_acc *CMYK32 )Base ()*ImageBase {return &_acc .ImageBase };
|
|
func (_ecd *Gray2 )Histogram ()(_cdbf [256]int ){for _ebdb :=0;_ebdb < _ecd .Width ;_ebdb ++{for _afc :=0;_afc < _ecd .Height ;_afc ++{_cdbf [_ecd .GrayAt (_ebdb ,_afc ).Y ]++;};};return _cdbf ;};type RGBA interface{RGBAAt (_fagd ,_cace int )_e .RGBA ;
|
|
SetRGBA (_eeeg ,_ecdb int ,_gdge _e .RGBA );};func (_dgaad *ImageBase )setEightBytes (_eggd int ,_cagd uint64 )error {_efdc :=_dgaad .BytesPerLine -(_eggd %_dgaad .BytesPerLine );if _dgaad .BytesPerLine !=_dgaad .Width >>3{_efdc --;};if _efdc >=8{return _dgaad .setEightFullBytes (_eggd ,_cagd );
|
|
};return _dgaad .setEightPartlyBytes (_eggd ,_efdc ,_cagd );};func NewImageBase (width int ,height int ,bitsPerComponent int ,colorComponents int ,data []byte ,alpha []byte ,decode []float64 )ImageBase {_acdg :=ImageBase {Width :width ,Height :height ,BitsPerComponent :bitsPerComponent ,ColorComponents :colorComponents ,Data :data ,Alpha :alpha ,Decode :decode ,BytesPerLine :BytesPerLine (width ,bitsPerComponent ,colorComponents )};
|
|
if data ==nil {_acdg .Data =make ([]byte ,height *_acdg .BytesPerLine );};return _acdg ;};func (_dgaa *Gray4 )Validate ()error {if len (_dgaa .Data )!=_dgaa .Height *_dgaa .BytesPerLine {return ErrInvalidImage ;};return nil ;};func ConverterFunc (converterFunc func (_feae _ce .Image )(Image ,error ))ColorConverter {return colorConverter {_dddf :converterFunc };
|
|
};func (_bgcc *Gray16 )Validate ()error {if len (_bgcc .Data )!=_bgcc .Height *_bgcc .BytesPerLine {return ErrInvalidImage ;};return nil ;};func (_bgddg *NRGBA32 )ColorAt (x ,y int )(_e .Color ,error ){return ColorAtNRGBA32 (x ,y ,_bgddg .Width ,_bgddg .Data ,_bgddg .Alpha ,_bgddg .Decode );
|
|
};func _ae (_cgd *Monochrome ,_bf int )(*Monochrome ,error ){if _cgd ==nil {return nil ,_c .New ("\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _bf ==1{return _cgd .copy (),nil ;};if !IsPowerOf2 (uint (_bf )){return nil ,_f .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",_bf );
|
|
};_gc :=_dfg (_bf );return _ba (_cgd ,_bf ,_gc );};func (_cgeab *Gray8 )ColorModel ()_e .Model {return _e .GrayModel };var _ Image =&NRGBA16 {};func (_fbbe *Gray8 )ColorAt (x ,y int )(_e .Color ,error ){return ColorAtGray8BPC (x ,y ,_fbbe .BytesPerLine ,_fbbe .Data ,_fbbe .Decode );
|
|
};var _ _ce .Image =&Gray16 {};func (_dfgf *CMYK32 )At (x ,y int )_e .Color {_cabf ,_ :=_dfgf .ColorAt (x ,y );return _cabf };func _egca (_beaa *Monochrome ,_geab ,_bded ,_dea ,_bgfc int ,_baga RasterOperator ){if _geab < 0{_dea +=_geab ;_geab =0;};_dcad :=_geab +_dea -_beaa .Width ;
|
|
if _dcad > 0{_dea -=_dcad ;};if _bded < 0{_bgfc +=_bded ;_bded =0;};_bggg :=_bded +_bgfc -_beaa .Height ;if _bggg > 0{_bgfc -=_bggg ;};if _dea <=0||_bgfc <=0{return ;};if (_geab &7)==0{_adgb (_beaa ,_geab ,_bded ,_dea ,_bgfc ,_baga );}else {_gfgb (_beaa ,_geab ,_bded ,_dea ,_bgfc ,_baga );
|
|
};};type shift int ;func (_bdfd *Monochrome )AddPadding ()(_dga error ){if _bede :=((_bdfd .Width *_bdfd .Height )+7)>>3;len (_bdfd .Data )< _bede {return _f .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 (_bdfd .Data ),_bede );
|
|
};_bagd :=_bdfd .Width %8;if _bagd ==0{return nil ;};_dafb :=_bdfd .Width /8;_egbe :=_cb .NewReader (_bdfd .Data );_ddb :=make ([]byte ,_bdfd .Height *_bdfd .BytesPerLine );_fded :=_cb .NewWriterMSB (_ddb );_gccf :=make ([]byte ,_dafb );var (_gbeb int ;
|
|
_bced uint64 ;);for _gbeb =0;_gbeb < _bdfd .Height ;_gbeb ++{if _ ,_dga =_egbe .Read (_gccf );_dga !=nil {return _dga ;};if _ ,_dga =_fded .Write (_gccf );_dga !=nil {return _dga ;};if _bced ,_dga =_egbe .ReadBits (byte (_bagd ));_dga !=nil {return _dga ;
|
|
};if _dga =_fded .WriteByte (byte (_bced )<<uint (8-_bagd ));_dga !=nil {return _dga ;};};_bdfd .Data =_fded .Data ();return nil ;};func _bcbd (_ebbe _ce .Image ,_fcea Image ,_gbbcf _ce .Rectangle ){if _dcce ,_gegd :=_ebbe .(SMasker );_gegd &&_dcce .HasAlpha (){_fcea .(SMasker ).MakeAlpha ();
|
|
};switch _dagfd :=_ebbe .(type ){case Gray :_ddcfg (_dagfd ,_fcea .(NRGBA ),_gbbcf );case NRGBA :_fgbfd (_dagfd ,_fcea .(NRGBA ),_gbbcf );case *_ce .NYCbCrA :_ccee (_dagfd ,_fcea .(NRGBA ),_gbbcf );case CMYK :_debeea (_dagfd ,_fcea .(NRGBA ),_gbbcf );case RGBA :_gcba (_dagfd ,_fcea .(NRGBA ),_gbbcf );
|
|
case nrgba64 :_dbec (_dagfd ,_fcea .(NRGBA ),_gbbcf );default:_cbga (_ebbe ,_fcea ,_gbbcf );};};func _egaf (_egag nrgba64 ,_aacf RGBA ,_cfbg _ce .Rectangle ){for _abgc :=0;_abgc < _cfbg .Max .X ;_abgc ++{for _afbg :=0;_afbg < _cfbg .Max .Y ;_afbg ++{_fecg :=_egag .NRGBA64At (_abgc ,_afbg );
|
|
_aacf .SetRGBA (_abgc ,_afbg ,_degfa (_fecg ));};};};func (_edced *NRGBA16 )ColorModel ()_e .Model {return NRGBA16Model };func (_eeac *Gray2 )Set (x ,y int ,c _e .Color ){if x >=_eeac .Width ||y >=_eeac .Height {return ;};_edac :=Gray2Model .Convert (c ).(_e .Gray );
|
|
_agea :=y *_eeac .BytesPerLine ;_ebb :=_agea +(x >>2);_gcde :=_edac .Y >>6;_eeac .Data [_ebb ]=(_eeac .Data [_ebb ]&(^(0xc0>>uint (2*((x )&3)))))|(_gcde <<uint (6-2*(x &3)));};func (_fgfc *Gray4 )ColorAt (x ,y int )(_e .Color ,error ){return ColorAtGray4BPC (x ,y ,_fgfc .BytesPerLine ,_fgfc .Data ,_fgfc .Decode );
|
|
};func (_ece *CMYK32 )ColorAt (x ,y int )(_e .Color ,error ){return ColorAtCMYK (x ,y ,_ece .Width ,_ece .Data ,_ece .Decode );};func (_ccegg *NRGBA32 )Validate ()error {if len (_ccegg .Data )!=3*_ccegg .Width *_ccegg .Height {return _c .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 _cabab (_gfab _e .Gray ,_ffaf monochromeModel )_e .Gray {if _gfab .Y > uint8 (_ffaf ){return _e .Gray {Y :_cg .MaxUint8 };};return _e .Gray {};};func ColorAtGray1BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_e .Gray ,error ){_gaab :=y *bytesPerLine +x >>3;
|
|
if _gaab >=len (data ){return _e .Gray {},_f .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 );
|
|
};_fdff :=data [_gaab ]>>uint (7-(x &7))&1;if len (decode )==2{_fdff =uint8 (LinearInterpolate (float64 (_fdff ),0.0,1.0,decode [0],decode [1]))&1;};return _e .Gray {Y :_fdff *255},nil ;};func GrayHistogram (g Gray )(_adade [256]int ){switch _ddcg :=g .(type ){case Histogramer :return _ddcg .Histogram ();
|
|
case _ce .Image :_edaac :=_ddcg .Bounds ();for _bbfaf :=0;_bbfaf < _edaac .Max .X ;_bbfaf ++{for _bffe :=0;_bffe < _edaac .Max .Y ;_bffe ++{_adade [g .GrayAt (_bbfaf ,_bffe ).Y ]++;};};return _adade ;default:return [256]int {};};};type CMYK interface{CMYKAt (_aeb ,_gfge int )_e .CMYK ;
|
|
SetCMYK (_fgca ,_ccd int ,_agd _e .CMYK );};type NRGBA interface{NRGBAAt (_egcf ,_aab int )_e .NRGBA ;SetNRGBA (_addg ,_dcbf int ,_dfda _e .NRGBA );};var _ _ce .Image =&NRGBA16 {};func _aadg (_dbe ,_egg *Monochrome ,_ceg []byte ,_cae int )(_dfab error ){var (_cfa ,_deb ,_gfbc ,_abf ,_ebd ,_gfc ,_cgbb ,_bbd int ;
|
|
_dgd ,_ag ,_gdac ,_ecb uint32 ;_fgc ,_baf byte ;_gae uint16 ;);_cag :=make ([]byte ,4);_ggb :=make ([]byte ,4);for _gfbc =0;_gfbc < _dbe .Height -1;_gfbc ,_abf =_gfbc +2,_abf +1{_cfa =_gfbc *_dbe .BytesPerLine ;_deb =_abf *_egg .BytesPerLine ;for _ebd ,_gfc =0,0;
|
|
_ebd < _cae ;_ebd ,_gfc =_ebd +4,_gfc +1{for _cgbb =0;_cgbb < 4;_cgbb ++{_bbd =_cfa +_ebd +_cgbb ;if _bbd <=len (_dbe .Data )-1&&_bbd < _cfa +_dbe .BytesPerLine {_cag [_cgbb ]=_dbe .Data [_bbd ];}else {_cag [_cgbb ]=0x00;};_bbd =_cfa +_dbe .BytesPerLine +_ebd +_cgbb ;
|
|
if _bbd <=len (_dbe .Data )-1&&_bbd < _cfa +(2*_dbe .BytesPerLine ){_ggb [_cgbb ]=_dbe .Data [_bbd ];}else {_ggb [_cgbb ]=0x00;};};_dgd =_d .BigEndian .Uint32 (_cag );_ag =_d .BigEndian .Uint32 (_ggb );_gdac =_dgd &_ag ;_gdac |=_gdac <<1;_ecb =_dgd |_ag ;
|
|
_ecb &=_ecb <<1;_ag =_gdac &_ecb ;_ag &=0xaaaaaaaa;_dgd =_ag |(_ag <<7);_fgc =byte (_dgd >>24);_baf =byte ((_dgd >>8)&0xff);_bbd =_deb +_gfc ;if _bbd +1==len (_egg .Data )-1||_bbd +1>=_deb +_egg .BytesPerLine {if _dfab =_egg .setByte (_bbd ,_ceg [_fgc ]);
|
|
_dfab !=nil {return _f .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_bbd );};}else {_gae =(uint16 (_ceg [_fgc ])<<8)|uint16 (_ceg [_baf ]);if _dfab =_egg .setTwoBytes (_bbd ,_gae );_dfab !=nil {return _f .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",_bbd );
|
|
};_gfc ++;};};};return nil ;};func LinearInterpolate (x ,xmin ,xmax ,ymin ,ymax float64 )float64 {if _cg .Abs (xmax -xmin )< 0.000001{return ymin ;};_dbae :=ymin +(x -xmin )*(ymax -ymin )/(xmax -xmin );return _dbae ;};type monochromeModel uint8 ;func (_cbec *NRGBA32 )Set (x ,y int ,c _e .Color ){_dbed :=y *_cbec .Width +x ;
|
|
_ebcg :=3*_dbed ;if _ebcg +2>=len (_cbec .Data ){return ;};_ddee :=_e .NRGBAModel .Convert (c ).(_e .NRGBA );_cbec .setRGBA (_dbed ,_ddee );};func (_ebff *Gray16 )ColorAt (x ,y int )(_e .Color ,error ){return ColorAtGray16BPC (x ,y ,_ebff .BytesPerLine ,_ebff .Data ,_ebff .Decode );
|
|
};func init (){_agbb ()};func NewImage (width ,height ,bitsPerComponent ,colorComponents int ,data ,alpha []byte ,decode []float64 )(Image ,error ){_eecd :=NewImageBase (width ,height ,bitsPerComponent ,colorComponents ,data ,alpha ,decode );var _eccgd Image ;
|
|
switch colorComponents {case 1:switch bitsPerComponent {case 1:_eccgd =&Monochrome {ImageBase :_eecd ,ModelThreshold :0x0f};case 2:_eccgd =&Gray2 {ImageBase :_eecd };case 4:_eccgd =&Gray4 {ImageBase :_eecd };case 8:_eccgd =&Gray8 {ImageBase :_eecd };case 16:_eccgd =&Gray16 {ImageBase :_eecd };
|
|
};case 3:switch bitsPerComponent {case 4:_eccgd =&NRGBA16 {ImageBase :_eecd };case 8:_eccgd =&NRGBA32 {ImageBase :_eecd };case 16:_eccgd =&NRGBA64 {ImageBase :_eecd };};case 4:_eccgd =&CMYK32 {ImageBase :_eecd };};if _eccgd ==nil {return nil ,ErrInvalidImage ;
|
|
};return _eccgd ,nil ;};func _ec (_baa ,_cga *Monochrome )(_bb error ){_gea :=_cga .BytesPerLine ;_dd :=_baa .BytesPerLine ;_gce :=_cga .BytesPerLine *4-_baa .BytesPerLine ;var (_eca ,_gaa byte ;_ee uint32 ;_ffb ,_fbbf ,_aad ,_gf ,_fa ,_fdb ,_ef int ;);
|
|
for _aad =0;_aad < _cga .Height ;_aad ++{_ffb =_aad *_gea ;_fbbf =4*_aad *_dd ;for _gf =0;_gf < _gea ;_gf ++{_eca =_cga .Data [_ffb +_gf ];_ee =_gfb [_eca ];_fdb =_fbbf +_gf *4;if _gce !=0&&(_gf +1)*4> _baa .BytesPerLine {for _fa =_gce ;_fa > 0;_fa --{_gaa =byte ((_ee >>uint (_fa *8))&0xff);
|
|
_ef =_fdb +(_gce -_fa );if _bb =_baa .setByte (_ef ,_gaa );_bb !=nil {return _bb ;};};}else if _bb =_baa .setFourBytes (_fdb ,_ee );_bb !=nil {return _bb ;};if _bb =_baa .setFourBytes (_fbbf +_gf *4,_gfb [_cga .Data [_ffb +_gf ]]);_bb !=nil {return _bb ;
|
|
};};for _fa =1;_fa < 4;_fa ++{for _gf =0;_gf < _dd ;_gf ++{if _bb =_baa .setByte (_fbbf +_fa *_dd +_gf ,_baa .Data [_fbbf +_gf ]);_bb !=nil {return _bb ;};};};};return nil ;};func (_ccdg *Monochrome )Validate ()error {if len (_ccdg .Data )!=_ccdg .Height *_ccdg .BytesPerLine {return ErrInvalidImage ;
|
|
};return nil ;};func _dgbe (_fdbg _ce .Image )(Image ,error ){if _gacg ,_bcfc :=_fdbg .(*NRGBA64 );_bcfc {return _gacg .Copy (),nil ;};_gfag ,_beca ,_daef :=_faba (_fdbg ,2);_agec ,_dgc :=NewImage (_gfag .Max .X ,_gfag .Max .Y ,16,3,nil ,_daef ,nil );if _dgc !=nil {return nil ,_dgc ;
|
|
};_cbae (_fdbg ,_agec ,_gfag );if len (_daef )!=0&&!_beca {if _dfggf :=_egbb (_daef ,_agec );_dfggf !=nil {return nil ,_dfggf ;};};return _agec ,nil ;};func (_dcca *Gray2 )SetGray (x ,y int ,gray _e .Gray ){_fgaf :=_adce (gray );_feeb :=y *_dcca .BytesPerLine ;
|
|
_gfcd :=_feeb +(x >>2);if _gfcd >=len (_dcca .Data ){return ;};_bfcc :=_fgaf .Y >>6;_dcca .Data [_gfcd ]=(_dcca .Data [_gfcd ]&(^(0xc0>>uint (2*((x )&3)))))|(_bfcc <<uint (6-2*(x &3)));};func (_dddb *RGBA32 )Validate ()error {if len (_dddb .Data )!=3*_dddb .Width *_dddb .Height {return _c .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 (_egce *Gray16 )At (x ,y int )_e .Color {_abgg ,_ :=_egce .ColorAt (x ,y );return _abgg };func NextPowerOf2 (n uint )uint {if IsPowerOf2 (n ){return n ;};return 1<<(_dfbd (n )+1);};func _cbga (_bcd _ce .Image ,_dgfe Image ,_bfd _ce .Rectangle ){for _aae :=0;
|
|
_aae < _bfd .Max .X ;_aae ++{for _caaf :=0;_caaf < _bfd .Max .Y ;_caaf ++{_bafa :=_bcd .At (_aae ,_caaf );_dgfe .Set (_aae ,_caaf ,_bafa );};};};func (_daa *Monochrome )setGrayBit (_gdf ,_gegf int ){_daa .Data [_gdf ]|=0x80>>uint (_gegf &7)};func (_dff *Monochrome )clearBit (_cdce ,_ccae int ){_dff .Data [_cdce ]&=^(0x80>>uint (_ccae &7))};
|
|
var _ Gray =&Gray16 {};var _ _ce .Image =&RGBA32 {};func (_accgg *RGBA32 )At (x ,y int )_e .Color {_adb ,_ :=_accgg .ColorAt (x ,y );return _adb };func (_gbaf *NRGBA32 )setRGBA (_eeacg int ,_fdg _e .NRGBA ){_fbeg :=3*_eeacg ;_gbaf .Data [_fbeg ]=_fdg .R ;
|
|
_gbaf .Data [_fbeg +1]=_fdg .G ;_gbaf .Data [_fbeg +2]=_fdg .B ;if _eeacg < len (_gbaf .Alpha ){_gbaf .Alpha [_eeacg ]=_fdg .A ;};};func (_fgae *RGBA32 )ColorModel ()_e .Model {return _e .NRGBAModel };func (_gdef monochromeModel )Convert (c _e .Color )_e .Color {_cbcb :=_e .GrayModel .Convert (c ).(_e .Gray );
|
|
return _cabab (_cbcb ,_gdef );};func _degfa (_fdc _e .NRGBA64 )_e .RGBA {_gbe ,_gcd ,_fggd ,_egbg :=_fdc .RGBA ();return _e .RGBA {R :uint8 (_gbe >>8),G :uint8 (_gcd >>8),B :uint8 (_fggd >>8),A :uint8 (_egbg >>8)};};func ColorAtGray16BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_e .Gray16 ,error ){_gcaf :=(y *bytesPerLine /2+x )*2;
|
|
if _gcaf +1>=len (data ){return _e .Gray16 {},_f .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 );
|
|
};_ccagc :=uint16 (data [_gcaf ])<<8|uint16 (data [_gcaf +1]);if len (decode )==2{_ccagc =uint16 (uint64 (LinearInterpolate (float64 (_ccagc ),0,65535,decode [0],decode [1])));};return _e .Gray16 {Y :_ccagc },nil ;};var _ NRGBA =&NRGBA32 {};func _agbd (_agdc _e .Color )_e .Color {_ggg :=_e .GrayModel .Convert (_agdc ).(_e .Gray );
|
|
return _adce (_ggg );};func (_eadg *NRGBA16 )Set (x ,y int ,c _e .Color ){_dbebg :=y *_eadg .BytesPerLine +x *3/2;if _dbebg +1>=len (_eadg .Data ){return ;};_ggcd :=NRGBA16Model .Convert (c ).(_e .NRGBA );_eadg .setNRGBA (x ,y ,_dbebg ,_ggcd );};func (_bcgda *Monochrome )GrayAt (x ,y int )_e .Gray {_efd ,_ :=ColorAtGray1BPC (x ,y ,_bcgda .BytesPerLine ,_bcgda .Data ,_bcgda .Decode );
|
|
return _efd ;};func (_cgeec *Gray8 )Histogram ()(_bae [256]int ){for _gcac :=0;_gcac < len (_cgeec .Data );_gcac ++{_bae [_cgeec .Data [_gcac ]]++;};return _bae ;};var _ _ce .Image =&Gray2 {};func _fgbfd (_adab ,_acfb NRGBA ,_ccdf _ce .Rectangle ){for _bdee :=0;
|
|
_bdee < _ccdf .Max .X ;_bdee ++{for _bdeda :=0;_bdeda < _ccdf .Max .Y ;_bdeda ++{_acfb .SetNRGBA (_bdee ,_bdeda ,_adab .NRGBAAt (_bdee ,_bdeda ));};};};func _cedf (_fed CMYK ,_dagga RGBA ,_bcfa _ce .Rectangle ){for _ddca :=0;_ddca < _bcfa .Max .X ;_ddca ++{for _edbf :=0;
|
|
_edbf < _bcfa .Max .Y ;_edbf ++{_eaba :=_fed .CMYKAt (_ddca ,_edbf );_dagga .SetRGBA (_ddca ,_edbf ,_gdb (_eaba ));};};};func _ecde (_bdca RGBA ,_gbea Gray ,_cdag _ce .Rectangle ){for _fagfg :=0;_fagfg < _cdag .Max .X ;_fagfg ++{for _adcb :=0;_adcb < _cdag .Max .Y ;
|
|
_adcb ++{_eaff :=_efa (_bdca .RGBAAt (_fagfg ,_adcb ));_gbea .SetGray (_fagfg ,_adcb ,_eaff );};};};func (_dbgb *Monochrome )setGray (_ddad int ,_cdeb _e .Gray ,_eafc int ){if _cdeb .Y ==0{_dbgb .clearBit (_eafc ,_ddad );}else {_dbgb .setGrayBit (_eafc ,_ddad );
|
|
};};func _ccee (_gcff *_ce .NYCbCrA ,_fggf NRGBA ,_ebbf _ce .Rectangle ){for _gecfe :=0;_gecfe < _ebbf .Max .X ;_gecfe ++{for _fcaec :=0;_fcaec < _ebbf .Max .Y ;_fcaec ++{_cfece :=_gcff .NYCbCrAAt (_gecfe ,_fcaec );_fggf .SetNRGBA (_gecfe ,_fcaec ,_fbbg (_cfece ));
|
|
};};};type RasterOperator int ;func (_accg *NRGBA16 )Validate ()error {if len (_accg .Data )!=3*_accg .Width *_accg .Height /2{return _c .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 (_fgfgg *ImageBase )setTwoBytes (_feaeb int ,_efae uint16 )error {if _feaeb +1> len (_fgfgg .Data )-1{return _c .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");};_fgfgg .Data [_feaeb ]=byte ((_efae &0xff00)>>8);
|
|
_fgfgg .Data [_feaeb +1]=byte (_efae &0xff);return nil ;};func (_dade *Monochrome )setIndexedBit (_bbfa int ){_dade .Data [(_bbfa >>3)]|=0x80>>uint (_bbfa &7)};func (_fae *Gray16 )Histogram ()(_gfea [256]int ){for _dcfbd :=0;_dcfbd < _fae .Width ;_dcfbd ++{for _aaggb :=0;
|
|
_aaggb < _fae .Height ;_aaggb ++{_gfea [_fae .GrayAt (_dcfbd ,_aaggb ).Y ]++;};};return _gfea ;};func _dfd (_dafa NRGBA ,_dce CMYK ,_dgfc _ce .Rectangle ){for _cage :=0;_cage < _dgfc .Max .X ;_cage ++{for _fad :=0;_fad < _dgfc .Max .Y ;_fad ++{_aadgf :=_dafa .NRGBAAt (_cage ,_fad );
|
|
_dce .SetCMYK (_cage ,_fad ,_ffcf (_aadgf ));};};};func (_gdfb *Monochrome )copy ()*Monochrome {_fafa :=_eda (_gdfb .Width ,_gdfb .Height );_fafa .ModelThreshold =_gdfb .ModelThreshold ;_fafa .Data =make ([]byte ,len (_gdfb .Data ));copy (_fafa .Data ,_gdfb .Data );
|
|
if len (_gdfb .Decode )!=0{_fafa .Decode =make ([]float64 ,len (_gdfb .Decode ));copy (_fafa .Decode ,_gdfb .Decode );};if len (_gdfb .Alpha )!=0{_fafa .Alpha =make ([]byte ,len (_gdfb .Alpha ));copy (_fafa .Alpha ,_gdfb .Alpha );};return _fafa ;};var _ NRGBA =&NRGBA16 {};
|
|
var (_fdf =_aba ();_gfb =_dda ();_dae =_gca (););type NRGBA16 struct{ImageBase };func (_bebf *Monochrome )At (x ,y int )_e .Color {_bbge ,_ :=_bebf .ColorAt (x ,y );return _bbge };func (_afca *Gray8 )Bounds ()_ce .Rectangle {return _ce .Rectangle {Max :_ce .Point {X :_afca .Width ,Y :_afca .Height }};
|
|
};func _fbf (_cdcb *Monochrome ,_bdcc ,_efcfg ,_acaf ,_aebf int ,_ggbe RasterOperator ,_ccfd *Monochrome ,_efbg ,_eege int )error {var (_edaa bool ;_dffd bool ;_agee byte ;_cceg int ;_bcebf int ;_eaac int ;_addd int ;_feebb bool ;_gab int ;_aggf int ;_afgg int ;
|
|
_ceeg bool ;_gefe byte ;_fggg int ;_abdd int ;_dede int ;_agcc byte ;_ddcf int ;_feeae int ;_bead uint ;_gee uint ;_fgad byte ;_afdb shift ;_cacg bool ;_fbab bool ;_bcea ,_ceba int ;);if _efbg &7!=0{_feeae =8-(_efbg &7);};if _bdcc &7!=0{_bcebf =8-(_bdcc &7);
|
|
};if _feeae ==0&&_bcebf ==0{_fgad =_bcf [0];}else {if _bcebf > _feeae {_bead =uint (_bcebf -_feeae );}else {_bead =uint (8-(_feeae -_bcebf ));};_gee =8-_bead ;_fgad =_bcf [_bead ];};if (_bdcc &7)!=0{_edaa =true ;_cceg =8-(_bdcc &7);_agee =_bcf [_cceg ];
|
|
_eaac =_cdcb .BytesPerLine *_efcfg +(_bdcc >>3);_addd =_ccfd .BytesPerLine *_eege +(_efbg >>3);_ddcf =8-(_efbg &7);if _cceg > _ddcf {_afdb =_bcfe ;if _acaf >=_feeae {_cacg =true ;};}else {_afdb =_edae ;};};if _acaf < _cceg {_dffd =true ;_agee &=_eeacb [8-_cceg +_acaf ];
|
|
};if !_dffd {_gab =(_acaf -_cceg )>>3;if _gab !=0{_feebb =true ;_aggf =_cdcb .BytesPerLine *_efcfg +((_bdcc +_bcebf )>>3);_afgg =_ccfd .BytesPerLine *_eege +((_efbg +_bcebf )>>3);};};_fggg =(_bdcc +_acaf )&7;if !(_dffd ||_fggg ==0){_ceeg =true ;_gefe =_eeacb [_fggg ];
|
|
_abdd =_cdcb .BytesPerLine *_efcfg +((_bdcc +_bcebf )>>3)+_gab ;_dede =_ccfd .BytesPerLine *_eege +((_efbg +_bcebf )>>3)+_gab ;if _fggg > int (_gee ){_fbab =true ;};};switch _ggbe {case PixSrc :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;
|
|
if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );};}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],_agcc ,_agee );_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;
|
|
_bcea < _aebf ;_bcea ++{for _ceba =0;_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]=_agcc ;};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};
|
|
};if _ceeg {for _bcea =0;_bcea < _aebf ;_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],_agcc ,_gefe );_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;
|
|
};};case PixNotSrc :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );};}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],^_agcc ,_agee );
|
|
_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;_bcea < _aebf ;_bcea ++{for _ceba =0;_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]=^_agcc ;
|
|
};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};};if _ceeg {for _bcea =0;_bcea < _aebf ;_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],^_agcc ,_gefe );
|
|
_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;};};case PixSrcOrDst :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );};
|
|
}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],_agcc |_cdcb .Data [_eaac ],_agee );_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;_bcea < _aebf ;_bcea ++{for _ceba =0;
|
|
_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]|=_agcc ;};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};};if _ceeg {for _bcea =0;_bcea < _aebf ;
|
|
_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],_agcc |_cdcb .Data [_abdd ],_gefe );_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;
|
|
};};case PixSrcAndDst :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );};}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],_agcc &_cdcb .Data [_eaac ],_agee );
|
|
_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;_bcea < _aebf ;_bcea ++{for _ceba =0;_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]&=_agcc ;
|
|
};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};};if _ceeg {for _bcea =0;_bcea < _aebf ;_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],_agcc &_cdcb .Data [_abdd ],_gefe );
|
|
_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;};};case PixSrcXorDst :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );};
|
|
}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],_agcc ^_cdcb .Data [_eaac ],_agee );_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;_bcea < _aebf ;_bcea ++{for _ceba =0;
|
|
_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]^=_agcc ;};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};};if _ceeg {for _bcea =0;_bcea < _aebf ;
|
|
_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],_agcc ^_cdcb .Data [_abdd ],_gefe );_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;
|
|
};};case PixNotSrcOrDst :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );};}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],^_agcc |_cdcb .Data [_eaac ],_agee );
|
|
_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;_bcea < _aebf ;_bcea ++{for _ceba =0;_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]|=^_agcc ;
|
|
};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};};if _ceeg {for _bcea =0;_bcea < _aebf ;_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],^_agcc |_cdcb .Data [_abdd ],_gefe );
|
|
_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;};};case PixNotSrcAndDst :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );
|
|
};}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],^_agcc &_cdcb .Data [_eaac ],_agee );_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;_bcea < _aebf ;_bcea ++{for _ceba =0;
|
|
_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]&=^_agcc ;};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};};if _ceeg {for _bcea =0;_bcea < _aebf ;
|
|
_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],^_agcc &_cdcb .Data [_abdd ],_gefe );_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;
|
|
};};case PixSrcOrNotDst :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );};}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],_agcc |^_cdcb .Data [_eaac ],_agee );
|
|
_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;_bcea < _aebf ;_bcea ++{for _ceba =0;_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]=_agcc |^_cdcb .Data [_aggf +_ceba ];
|
|
};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};};if _ceeg {for _bcea =0;_bcea < _aebf ;_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],_agcc |^_cdcb .Data [_abdd ],_gefe );
|
|
_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;};};case PixSrcAndNotDst :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );
|
|
};}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],_agcc &^_cdcb .Data [_eaac ],_agee );_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;_bcea < _aebf ;_bcea ++{for _ceba =0;
|
|
_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]=_agcc &^_cdcb .Data [_aggf +_ceba ];};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};};if _ceeg {for _bcea =0;
|
|
_bcea < _aebf ;_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],_agcc &^_cdcb .Data [_abdd ],_gefe );_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;
|
|
};};case PixNotPixSrcOrDst :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );};}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],^(_agcc |_cdcb .Data [_eaac ]),_agee );
|
|
_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;_bcea < _aebf ;_bcea ++{for _ceba =0;_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]=^(_agcc |_cdcb .Data [_aggf +_ceba ]);
|
|
};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};};if _ceeg {for _bcea =0;_bcea < _aebf ;_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],^(_agcc |_cdcb .Data [_abdd ]),_gefe );
|
|
_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;};};case PixNotPixSrcAndDst :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );
|
|
};}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],^(_agcc &_cdcb .Data [_eaac ]),_agee );_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;_bcea < _aebf ;_bcea ++{for _ceba =0;
|
|
_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]=^(_agcc &_cdcb .Data [_aggf +_ceba ]);};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};};if _ceeg {for _bcea =0;
|
|
_bcea < _aebf ;_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],^(_agcc &_cdcb .Data [_abdd ]),_gefe );_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;
|
|
};};case PixNotPixSrcXorDst :if _edaa {for _bcea =0;_bcea < _aebf ;_bcea ++{if _afdb ==_bcfe {_agcc =_ccfd .Data [_addd ]<<_bead ;if _cacg {_agcc =_ffab (_agcc ,_ccfd .Data [_addd +1]>>_gee ,_fgad );};}else {_agcc =_ccfd .Data [_addd ]>>_gee ;};_cdcb .Data [_eaac ]=_ffab (_cdcb .Data [_eaac ],^(_agcc ^_cdcb .Data [_eaac ]),_agee );
|
|
_eaac +=_cdcb .BytesPerLine ;_addd +=_ccfd .BytesPerLine ;};};if _feebb {for _bcea =0;_bcea < _aebf ;_bcea ++{for _ceba =0;_ceba < _gab ;_ceba ++{_agcc =_ffab (_ccfd .Data [_afgg +_ceba ]<<_bead ,_ccfd .Data [_afgg +_ceba +1]>>_gee ,_fgad );_cdcb .Data [_aggf +_ceba ]=^(_agcc ^_cdcb .Data [_aggf +_ceba ]);
|
|
};_aggf +=_cdcb .BytesPerLine ;_afgg +=_ccfd .BytesPerLine ;};};if _ceeg {for _bcea =0;_bcea < _aebf ;_bcea ++{_agcc =_ccfd .Data [_dede ]<<_bead ;if _fbab {_agcc =_ffab (_agcc ,_ccfd .Data [_dede +1]>>_gee ,_fgad );};_cdcb .Data [_abdd ]=_ffab (_cdcb .Data [_abdd ],^(_agcc ^_cdcb .Data [_abdd ]),_gefe );
|
|
_abdd +=_cdcb .BytesPerLine ;_dede +=_ccfd .BytesPerLine ;};};default:_fb .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",_ggbe );
|
|
return _c .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 FromGoImage (i _ce .Image )(Image ,error ){switch _dafae :=i .(type ){case Image :return _dafae .Copy (),nil ;
|
|
case Gray :return GrayConverter .Convert (i );case *_ce .Gray16 :return Gray16Converter .Convert (i );case CMYK :return CMYKConverter .Convert (i );case *_ce .NRGBA64 :return NRGBA64Converter .Convert (i );default:return NRGBAConverter .Convert (i );};
|
|
};func _aba ()(_deg [256]uint16 ){for _df :=0;_df < 256;_df ++{if _df &0x01!=0{_deg [_df ]|=0x3;};if _df &0x02!=0{_deg [_df ]|=0xc;};if _df &0x04!=0{_deg [_df ]|=0x30;};if _df &0x08!=0{_deg [_df ]|=0xc0;};if _df &0x10!=0{_deg [_df ]|=0x300;};if _df &0x20!=0{_deg [_df ]|=0xc00;
|
|
};if _df &0x40!=0{_deg [_df ]|=0x3000;};if _df &0x80!=0{_deg [_df ]|=0xc000;};};return _deg ;};func (_aebg *Gray16 )Copy ()Image {return &Gray16 {ImageBase :_aebg .copy ()}};func (_bafe *Gray16 )GrayAt (x ,y int )_e .Gray {_feg ,_ :=_bafe .ColorAt (x ,y );
|
|
return _e .Gray {Y :uint8 (_feg .(_e .Gray16 ).Y >>8)};};func ImgToGray (i _ce .Image )*_ce .Gray {if _beabf ,_ccgc :=i .(*_ce .Gray );_ccgc {return _beabf ;};_ddfd :=i .Bounds ();_afbc :=_ce .NewGray (_ddfd );for _edde :=0;_edde < _ddfd .Max .X ;_edde ++{for _dgeg :=0;
|
|
_dgeg < _ddfd .Max .Y ;_dgeg ++{_fbdf :=i .At (_edde ,_dgeg );_afbc .Set (_edde ,_dgeg ,_fbdf );};};return _afbc ;};func _acbc (_bca _ce .Image )(Image ,error ){if _faab ,_dffe :=_bca .(*Gray2 );_dffe {return _faab .Copy (),nil ;};_bfea :=_bca .Bounds ();
|
|
_ffe ,_fcdg :=NewImage (_bfea .Max .X ,_bfea .Max .Y ,2,1,nil ,nil ,nil );if _fcdg !=nil {return nil ,_fcdg ;};_fdbb (_bca ,_ffe ,_bfea );return _ffe ,nil ;};var _ _ce .Image =&Gray8 {};var _ Gray =&Gray2 {};var ErrInvalidImage =_c .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 (_bdbc *Monochrome )Copy ()Image {return &Monochrome {ImageBase :_bdbc .ImageBase .copy (),ModelThreshold :_bdbc .ModelThreshold };};func _cbcf (_bag _e .CMYK )_e .NRGBA {_fgfa ,_gfcb ,_eec :=_e .CMYKToRGB (_bag .C ,_bag .M ,_bag .Y ,_bag .K );return _e .NRGBA {R :_fgfa ,G :_gfcb ,B :_eec ,A :0xff};
|
|
};func (_ddfa *Gray4 )ColorModel ()_e .Model {return Gray4Model };var _ Gray =&Gray4 {};func (_gdaccg *NRGBA64 )ColorAt (x ,y int )(_e .Color ,error ){return ColorAtNRGBA64 (x ,y ,_gdaccg .Width ,_gdaccg .Data ,_gdaccg .Alpha ,_gdaccg .Decode );};type Gray8 struct{ImageBase };
|
|
func _gaaf (_gge *Monochrome ,_bab int ,_fgf []byte )(_acb *Monochrome ,_cgba error ){const _cdd ="\u0072\u0065d\u0075\u0063\u0065R\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079";if _gge ==nil {return nil ,_c .New ("\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _bab < 1||_bab > 4{return nil ,_c .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 _gge .Height <=1{return nil ,_c .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");
|
|
};_acb =_eda (_gge .Width /2,_gge .Height /2);if _fgf ==nil {_fgf =_gga ();};_aagg :=_gbdc (_gge .BytesPerLine ,2*_acb .BytesPerLine );switch _bab {case 1:_cgba =_bdf (_gge ,_acb ,_fgf ,_aagg );case 2:_cgba =_gfbb (_gge ,_acb ,_fgf ,_aagg );case 3:_cgba =_aadg (_gge ,_acb ,_fgf ,_aagg );
|
|
case 4:_cgba =_bbg (_gge ,_acb ,_fgf ,_aagg );};if _cgba !=nil {return nil ,_cgba ;};return _acb ,nil ;};func (_ccaeb *ImageBase )setEightPartlyBytes (_aaeae ,_fcce int ,_dagg uint64 )(_dcgc error ){var (_cagdg byte ;_cbea int ;);for _ddfe :=1;_ddfe <=_fcce ;
|
|
_ddfe ++{_cbea =64-_ddfe *8;_cagdg =byte (_dagg >>uint (_cbea )&0xff);if _dcgc =_ccaeb .setByte (_aaeae +_ddfe -1,_cagdg );_dcgc !=nil {return _dcgc ;};};_eegc :=_ccaeb .BytesPerLine *8-_ccaeb .Width ;if _eegc ==0{return nil ;};_cbea -=8;_cagdg =byte (_dagg >>uint (_cbea )&0xff)<<uint (_eegc );
|
|
if _dcgc =_ccaeb .setByte (_aaeae +_fcce ,_cagdg );_dcgc !=nil {return _dcgc ;};return nil ;};type Gray2 struct{ImageBase };func (_gdfd *NRGBA64 )SetNRGBA64 (x ,y int ,c _e .NRGBA64 ){_cgae :=(y *_gdfd .Width +x )*2;_bafg :=_cgae *3;if _bafg +5>=len (_gdfd .Data ){return ;
|
|
};_gdfd .setNRGBA64 (_bafg ,c ,_cgae );};func (_eddf *NRGBA16 )Bounds ()_ce .Rectangle {return _ce .Rectangle {Max :_ce .Point {X :_eddf .Width ,Y :_eddf .Height }};};type Gray4 struct{ImageBase };func _gabb (_gege *_ce .NYCbCrA ,_efcd RGBA ,_bcfb _ce .Rectangle ){for _fgfe :=0;
|
|
_fgfe < _bcfb .Max .X ;_fgfe ++{for _ddbge :=0;_ddbge < _bcfb .Max .Y ;_ddbge ++{_fbec :=_gege .NYCbCrAAt (_fgfe ,_ddbge );_efcd .SetRGBA (_fgfe ,_ddbge ,_gdcd (_fbec ));};};};func _dfg (_eb int )[]uint {var _edbc []uint ;_fab :=_eb ;_ege :=_fab /8;if _ege !=0{for _fba :=0;
|
|
_fba < _ege ;_fba ++{_edbc =append (_edbc ,8);};_cfg :=_fab %8;_fab =0;if _cfg !=0{_fab =_cfg ;};};_dfgg :=_fab /4;if _dfgg !=0{for _bbed :=0;_bbed < _dfgg ;_bbed ++{_edbc =append (_edbc ,4);};_bad :=_fab %4;_fab =0;if _bad !=0{_fab =_bad ;};};_fcaf :=_fab /2;
|
|
if _fcaf !=0{for _gaac :=0;_gaac < _fcaf ;_gaac ++{_edbc =append (_edbc ,2);};};return _edbc ;};var _ Gray =&Gray8 {};func (_cfgdb *Gray8 )At (x ,y int )_e .Color {_dgad ,_ :=_cfgdb .ColorAt (x ,y );return _dgad };func ImgToBinary (i _ce .Image ,threshold uint8 )*_ce .Gray {switch _fbcf :=i .(type ){case *_ce .Gray :if _ffda (_fbcf ){return _fbcf ;
|
|
};return _fbbdg (_fbcf ,threshold );case *_ce .Gray16 :return _cfeab (_fbcf ,threshold );default:return _edega (_fbcf ,threshold );};};func (_becg *RGBA32 )Copy ()Image {return &RGBA32 {ImageBase :_becg .copy ()}};func (_eefc *NRGBA32 )ColorModel ()_e .Model {return _e .NRGBAModel };
|
|
func (_eccg *Gray4 )GrayAt (x ,y int )_e .Gray {_addfe ,_ :=ColorAtGray4BPC (x ,y ,_eccg .BytesPerLine ,_eccg .Data ,_eccg .Decode );return _addfe ;};func (_cdceg *ImageBase )Pix ()[]byte {return _cdceg .Data };func _bddf (_fff Gray ,_fggc NRGBA ,_efe _ce .Rectangle ){for _eegb :=0;
|
|
_eegb < _efe .Max .X ;_eegb ++{for _bdb :=0;_bdb < _efe .Max .Y ;_bdb ++{_caad :=_caac (_fggc .NRGBAAt (_eegb ,_bdb ));_fff .SetGray (_eegb ,_bdb ,_caad );};};};func (_aebd *ImageBase )HasAlpha ()bool {if _aebd .Alpha ==nil {return false ;};for _bgcg :=range _aebd .Alpha {if _aebd .Alpha [_bgcg ]!=0xff{return true ;
|
|
};};return false ;};func (_geb *CMYK32 )CMYKAt (x ,y int )_e .CMYK {_cfb ,_ :=ColorAtCMYK (x ,y ,_geb .Width ,_geb .Data ,_geb .Decode );return _cfb ;};var _ _ce .Image =&NRGBA32 {};func (_fdcf *RGBA32 )ColorAt (x ,y int )(_e .Color ,error ){return ColorAtRGBA32 (x ,y ,_fdcf .Width ,_fdcf .Data ,_fdcf .Alpha ,_fdcf .Decode );
|
|
};var _ _ce .Image =&Gray4 {};func _aecbf (_fafg _ce .Image )(Image ,error ){if _bfgcfb ,_gcg :=_fafg .(*NRGBA32 );_gcg {return _bfgcfb .Copy (),nil ;};_ddcfb ,_fbabg ,_acfd :=_faba (_fafg ,1);_agce ,_fdfbg :=NewImage (_ddcfb .Max .X ,_ddcfb .Max .Y ,8,3,nil ,_acfd ,nil );
|
|
if _fdfbg !=nil {return nil ,_fdfbg ;};_bcbd (_fafg ,_agce ,_ddcfb );if len (_acfd )!=0&&!_fbabg {if _fbgf :=_egbb (_acfd ,_agce );_fbgf !=nil {return nil ,_fbgf ;};};return _agce ,nil ;};func _eda (_cfgg ,_bc int )*Monochrome {return &Monochrome {ImageBase :NewImageBase (_cfgg ,_bc ,1,1,nil ,nil ,nil ),ModelThreshold :0x0f};
|
|
};func (_daac *NRGBA64 )At (x ,y int )_e .Color {_fdcg ,_ :=_daac .ColorAt (x ,y );return _fdcg };func (_dfb *ImageBase )setByte (_gadg int ,_bda byte )error {if _gadg > len (_dfb .Data )-1{return _c .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
};_dfb .Data [_gadg ]=_bda ;return nil ;};func _adce (_dffb _e .Gray )_e .Gray {_cef :=_dffb .Y >>6;_cef |=_cef <<2;_dffb .Y =_cef |_cef <<4;return _dffb ;};func IsGrayImgBlackAndWhite (i *_ce .Gray )bool {return _ffda (i )};var (_eeacb =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};
|
|
_bcf =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);func AutoThresholdTriangle (histogram [256]int )uint8 {var _gfde ,_eecea ,_dcgg ,_fdbf int ;for _bdcf :=0;_bdcf < len (histogram );_bdcf ++{if histogram [_bdcf ]> 0{_gfde =_bdcf ;break ;};};
|
|
if _gfde > 0{_gfde --;};for _ebcf :=255;_ebcf > 0;_ebcf --{if histogram [_ebcf ]> 0{_fdbf =_ebcf ;break ;};};if _fdbf < 255{_fdbf ++;};for _ceff :=0;_ceff < 256;_ceff ++{if histogram [_ceff ]> _eecea {_dcgg =_ceff ;_eecea =histogram [_ceff ];};};var _fccfd bool ;
|
|
if (_dcgg -_gfde )< (_fdbf -_dcgg ){_fccfd =true ;var _bcab int ;_aaad :=255;for _bcab < _aaad {_fega :=histogram [_bcab ];histogram [_bcab ]=histogram [_aaad ];histogram [_aaad ]=_fega ;_bcab ++;_aaad --;};_gfde =255-_fdbf ;_dcgg =255-_dcgg ;};if _gfde ==_dcgg {return uint8 (_gfde );
|
|
};_cgfg :=float64 (histogram [_dcgg ]);_gagd :=float64 (_gfde -_dcgg );_baag :=_cg .Sqrt (_cgfg *_cgfg +_gagd *_gagd );_cgfg /=_baag ;_gagd /=_baag ;_baag =_cgfg *float64 (_gfde )+_gagd *float64 (histogram [_gfde ]);_fdba :=_gfde ;var _ecbeg float64 ;for _ffbg :=_gfde +1;
|
|
_ffbg <=_dcgg ;_ffbg ++{_ceedf :=_cgfg *float64 (_ffbg )+_gagd *float64 (histogram [_ffbg ])-_baag ;if _ceedf > _ecbeg {_fdba =_ffbg ;_ecbeg =_ceedf ;};};_fdba --;if _fccfd {var _afcb int ;_gabc :=255;for _afcb < _gabc {_acfc :=histogram [_afcb ];histogram [_afcb ]=histogram [_gabc ];
|
|
histogram [_gabc ]=_acfc ;_afcb ++;_gabc --;};return uint8 (255-_fdba );};return uint8 (_fdba );};func InDelta (expected ,current ,delta float64 )bool {_afdc :=expected -current ;if _afdc <=-delta ||_afdc >=delta {return false ;};return true ;};func _caac (_ebe _e .NRGBA )_e .Gray {var _agded _e .NRGBA ;
|
|
if _ebe ==_agded {return _e .Gray {Y :0xff};};_cbe ,_ccf ,_eed ,_ :=_ebe .RGBA ();_dfgad :=(19595*_cbe +38470*_ccf +7471*_eed +1<<15)>>24;return _e .Gray {Y :uint8 (_dfgad )};};var _ Image =&Gray2 {};func (_dbbe *Gray8 )Validate ()error {if len (_dbbe .Data )!=_dbbe .Height *_dbbe .BytesPerLine {return ErrInvalidImage ;
|
|
};return nil ;};type NRGBA64 struct{ImageBase };func _egf (_eggf _e .RGBA )_e .CMYK {_ffcd ,_fbg ,_dgdf ,_abe :=_e .RGBToCMYK (_eggf .R ,_eggf .G ,_eggf .B );return _e .CMYK {C :_ffcd ,M :_fbg ,Y :_dgdf ,K :_abe };};func (_gbag *ImageBase )copy ()ImageBase {_dffga :=*_gbag ;
|
|
_dffga .Data =make ([]byte ,len (_gbag .Data ));copy (_dffga .Data ,_gbag .Data );return _dffga ;};func (_gbbba *NRGBA64 )Base ()*ImageBase {return &_gbbba .ImageBase };func IsPowerOf2 (n uint )bool {return n > 0&&(n &(n -1))==0};func (_baee *NRGBA32 )Bounds ()_ce .Rectangle {return _ce .Rectangle {Max :_ce .Point {X :_baee .Width ,Y :_baee .Height }};
|
|
};func (_gdcf *NRGBA16 )ColorAt (x ,y int )(_e .Color ,error ){return ColorAtNRGBA16 (x ,y ,_gdcf .Width ,_gdcf .BytesPerLine ,_gdcf .Data ,_gdcf .Alpha ,_gdcf .Decode );};func _aceg (_bfg _ce .Image )(Image ,error ){if _affb ,_abc :=_bfg .(*Gray4 );_abc {return _affb .Copy (),nil ;
|
|
};_ebc :=_bfg .Bounds ();_ggae ,_bcdf :=NewImage (_ebc .Max .X ,_ebc .Max .Y ,4,1,nil ,nil ,nil );if _bcdf !=nil {return nil ,_bcdf ;};_fdbb (_bfg ,_ggae ,_ebc );return _ggae ,nil ;};func _faaa (_bdbd *Monochrome ,_ecbe ,_cdeda ,_dgfa ,_fcg int ,_ggc RasterOperator ,_bdcg *Monochrome ,_cegg ,_aege int )error {if _bdbd ==nil {return _c .New ("\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");
|
|
};if _ggc ==PixDst {return nil ;};switch _ggc {case PixClr ,PixSet ,PixNotDst :_egca (_bdbd ,_ecbe ,_cdeda ,_dgfa ,_fcg ,_ggc );return nil ;};if _bdcg ==nil {_fb .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 _c .New ("\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _bcb :=_fdbc (_bdbd ,_ecbe ,_cdeda ,_dgfa ,_fcg ,_ggc ,_bdcg ,_cegg ,_aege );_bcb !=nil {return _bcb ;};return nil ;};func (_efdg *Monochrome )getBit (_egegf ,_cfgd int )uint8 {return _efdg .Data [_egegf +(_cfgd >>3)]>>uint (7-(_cfgd &7))&1;
|
|
};func _cd (_gg ,_cbg *Monochrome )(_af error ){_cee :=_cbg .BytesPerLine ;_ed :=_gg .BytesPerLine ;var (_bfe byte ;_ge uint16 ;_db ,_ea ,_fg ,_cgb ,_dbd int ;);for _fg =0;_fg < _cbg .Height ;_fg ++{_db =_fg *_cee ;_ea =2*_fg *_ed ;for _cgb =0;_cgb < _cee ;
|
|
_cgb ++{_bfe =_cbg .Data [_db +_cgb ];_ge =_fdf [_bfe ];_dbd =_ea +_cgb *2;if _gg .BytesPerLine !=_cbg .BytesPerLine *2&&(_cgb +1)*2> _gg .BytesPerLine {_af =_gg .setByte (_dbd ,byte (_ge >>8));}else {_af =_gg .setTwoBytes (_dbd ,_ge );};if _af !=nil {return _af ;
|
|
};};for _cgb =0;_cgb < _ed ;_cgb ++{_dbd =_ea +_ed +_cgb ;_bfe =_gg .Data [_ea +_cgb ];if _af =_gg .setByte (_dbd ,_bfe );_af !=nil {return _af ;};};};return nil ;};func (_gffe *CMYK32 )Set (x ,y int ,c _e .Color ){_bfa :=4*(y *_gffe .Width +x );if _bfa +3>=len (_gffe .Data ){return ;
|
|
};_fcc :=_e .CMYKModel .Convert (c ).(_e .CMYK );_gffe .Data [_bfa ]=_fcc .C ;_gffe .Data [_bfa +1]=_fcc .M ;_gffe .Data [_bfa +2]=_fcc .Y ;_gffe .Data [_bfa +3]=_fcc .K ;};func (_egbgd *NRGBA16 )Base ()*ImageBase {return &_egbgd .ImageBase };func (_cfdf *monochromeThresholdConverter )Convert (img _ce .Image )(Image ,error ){if _badc ,_eece :=img .(*Monochrome );
|
|
_eece {return _badc .Copy (),nil ;};_cfab :=img .Bounds ();_abeb ,_dddg :=NewImage (_cfab .Max .X ,_cfab .Max .Y ,1,1,nil ,nil ,nil );if _dddg !=nil {return nil ,_dddg ;};_abeb .(*Monochrome ).ModelThreshold =_cfdf .Threshold ;for _bdc :=0;_bdc < _cfab .Max .X ;
|
|
_bdc ++{for _aced :=0;_aced < _cfab .Max .Y ;_aced ++{_gfa :=img .At (_bdc ,_aced );_abeb .Set (_bdc ,_aced ,_gfa );};};return _abeb ,nil ;};type ColorConverter interface{Convert (_ged _ce .Image )(Image ,error );};func _agg (_cdeg _e .Gray )_e .Gray {_cdeg .Y >>=4;
|
|
_cdeg .Y |=_cdeg .Y <<4;return _cdeg };var _ Image =&Gray4 {};func (_bgeg *Gray2 )Base ()*ImageBase {return &_bgeg .ImageBase };func _gcba (_acea RGBA ,_dccd NRGBA ,_fbbc _ce .Rectangle ){for _dfcg :=0;_dfcg < _fbbc .Max .X ;_dfcg ++{for _bcgdb :=0;_bcgdb < _fbbc .Max .Y ;
|
|
_bcgdb ++{_bcbg :=_acea .RGBAAt (_dfcg ,_bcgdb );_dccd .SetNRGBA (_dfcg ,_bcgdb ,_bdfa (_bcbg ));};};};func _fddc (_cff CMYK ,_ecef Gray ,_ageg _ce .Rectangle ){for _adda :=0;_adda < _ageg .Max .X ;_adda ++{for _bfgc :=0;_bfgc < _ageg .Max .Y ;_bfgc ++{_egd :=_fcb (_cff .CMYKAt (_adda ,_bfgc ));
|
|
_ecef .SetGray (_adda ,_bfgc ,_egd );};};};func (_acac *Monochrome )setBit (_aegg ,_cfbb int ){_acac .Data [_aegg +(_cfbb >>3)]|=0x80>>uint (_cfbb &7);};func BytesPerLine (width ,bitsPerComponent ,colorComponents int )int {return ((width *bitsPerComponent )*colorComponents +7)>>3;
|
|
};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 _bgea (_gba _e .Gray )_e .NRGBA {return _e .NRGBA {R :_gba .Y ,G :_gba .Y ,B :_gba .Y ,A :0xff}};func _dbec (_bedd nrgba64 ,_dedef NRGBA ,_ggbd _ce .Rectangle ){for _bfbe :=0;
|
|
_bfbe < _ggbd .Max .X ;_bfbe ++{for _cbdf :=0;_cbdf < _ggbd .Max .Y ;_cbdf ++{_bbca :=_bedd .NRGBA64At (_bfbe ,_cbdf );_dedef .SetNRGBA (_bfbe ,_cbdf ,_eaefg (_bbca ));};};};func (_bceed *NRGBA16 )Copy ()Image {return &NRGBA16 {ImageBase :_bceed .copy ()}};
|
|
func (_bged *Monochrome )getBitAt (_ddf ,_bea int )bool {_dad :=_bea *_bged .BytesPerLine +(_ddf >>3);_dge :=_ddf &0x07;_fee :=uint (7-_dge );if _dad > len (_bged .Data )-1{return false ;};if (_bged .Data [_dad ]>>_fee )&0x01>=1{return true ;};return false ;
|
|
};func _cgef (_bddc _e .NRGBA )_e .Gray {_dbg ,_cbdb ,_dfag ,_ :=_bddc .RGBA ();_cbde :=(19595*_dbg +38470*_cbdb +7471*_dfag +1<<15)>>24;return _e .Gray {Y :uint8 (_cbde )};};func (_aaeb *NRGBA16 )NRGBAAt (x ,y int )_e .NRGBA {_cggc ,_ :=ColorAtNRGBA16 (x ,y ,_aaeb .Width ,_aaeb .BytesPerLine ,_aaeb .Data ,_aaeb .Alpha ,_aaeb .Decode );
|
|
return _cggc ;};func ColorAtNRGBA32 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_e .NRGBA ,error ){_ceegc :=y *width +x ;_dggf :=3*_ceegc ;if _dggf +2>=len (data ){return _e .NRGBA {},_f .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 );
|
|
};_eega :=uint8 (0xff);if alpha !=nil &&len (alpha )> _ceegc {_eega =alpha [_ceegc ];};_cbca ,_cggb ,_dddfa :=data [_dggf ],data [_dggf +1],data [_dggf +2];if len (decode )==6{_cbca =uint8 (uint32 (LinearInterpolate (float64 (_cbca ),0,255,decode [0],decode [1]))&0xff);
|
|
_cggb =uint8 (uint32 (LinearInterpolate (float64 (_cggb ),0,255,decode [2],decode [3]))&0xff);_dddfa =uint8 (uint32 (LinearInterpolate (float64 (_dddfa ),0,255,decode [4],decode [5]))&0xff);};return _e .NRGBA {R :_cbca ,G :_cggb ,B :_dddfa ,A :_eega },nil ;
|
|
};func ColorAtGray4BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_e .Gray ,error ){_caagc :=y *bytesPerLine +x >>1;if _caagc >=len (data ){return _e .Gray {},_f .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 );
|
|
};_fead :=data [_caagc ]>>uint (4-(x &1)*4)&0xf;if len (decode )==2{_fead =uint8 (uint32 (LinearInterpolate (float64 (_fead ),0,15,decode [0],decode [1]))&0xf);};return _e .Gray {Y :_fead *17&0xff},nil ;};func _degf (_bef ,_age CMYK ,_dcfb _ce .Rectangle ){for _gbb :=0;
|
|
_gbb < _dcfb .Max .X ;_gbb ++{for _add :=0;_add < _dcfb .Max .Y ;_add ++{_age .SetCMYK (_gbb ,_add ,_bef .CMYKAt (_gbb ,_add ));};};};func (_efff *ImageBase )setEightFullBytes (_ddc int ,_fccf uint64 )error {if _ddc +7> len (_efff .Data )-1{return _c .New ("\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
};_efff .Data [_ddc ]=byte ((_fccf &0xff00000000000000)>>56);_efff .Data [_ddc +1]=byte ((_fccf &0xff000000000000)>>48);_efff .Data [_ddc +2]=byte ((_fccf &0xff0000000000)>>40);_efff .Data [_ddc +3]=byte ((_fccf &0xff00000000)>>32);_efff .Data [_ddc +4]=byte ((_fccf &0xff000000)>>24);
|
|
_efff .Data [_ddc +5]=byte ((_fccf &0xff0000)>>16);_efff .Data [_ddc +6]=byte ((_fccf &0xff00)>>8);_efff .Data [_ddc +7]=byte (_fccf &0xff);return nil ;};func _eeege (_bgegb ,_acgga uint8 )uint8 {if _bgegb < _acgga {return 255;};return 0;};func ColorAtRGBA32 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_e .RGBA ,error ){_acfg :=y *width +x ;
|
|
_cbgag :=3*_acfg ;if _cbgag +2>=len (data ){return _e .RGBA {},_f .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 );
|
|
};_aded :=uint8 (0xff);if alpha !=nil &&len (alpha )> _acfg {_aded =alpha [_acfg ];};_fdaf ,_edfa ,_cfad :=data [_cbgag ],data [_cbgag +1],data [_cbgag +2];if len (decode )==6{_fdaf =uint8 (uint32 (LinearInterpolate (float64 (_fdaf ),0,255,decode [0],decode [1]))&0xff);
|
|
_edfa =uint8 (uint32 (LinearInterpolate (float64 (_edfa ),0,255,decode [2],decode [3]))&0xff);_cfad =uint8 (uint32 (LinearInterpolate (float64 (_cfad ),0,255,decode [4],decode [5]))&0xff);};return _e .RGBA {R :_fdaf ,G :_edfa ,B :_cfad ,A :_aded },nil ;
|
|
};var _ _ce .Image =&NRGBA64 {};func (_bcc *Monochrome )SetGray (x ,y int ,g _e .Gray ){_cfac :=y *_bcc .BytesPerLine +x >>3;if _cfac > len (_bcc .Data )-1{return ;};g =_cabab (g ,monochromeModel (_bcc .ModelThreshold ));_bcc .setGray (x ,g ,_cfac );};
|
|
func _fbbg (_baba _e .NYCbCrA )_e .NRGBA {_fdd :=int32 (_baba .Y )*0x10101;_eaef :=int32 (_baba .Cb )-128;_eac :=int32 (_baba .Cr )-128;_dbfg :=_fdd +91881*_eac ;if uint32 (_dbfg )&0xff000000==0{_dbfg >>=8;}else {_dbfg =^(_dbfg >>31)&0xffff;};_babaa :=_fdd -22554*_eaef -46802*_eac ;
|
|
if uint32 (_babaa )&0xff000000==0{_babaa >>=8;}else {_babaa =^(_babaa >>31)&0xffff;};_gcce :=_fdd +116130*_eaef ;if uint32 (_gcce )&0xff000000==0{_gcce >>=8;}else {_gcce =^(_gcce >>31)&0xffff;};return _e .NRGBA {R :uint8 (_dbfg >>8),G :uint8 (_babaa >>8),B :uint8 (_gcce >>8),A :_baba .A };
|
|
};func (_beeeb *ImageBase )MakeAlpha (){_beeeb .newAlpha ()};func _debeea (_eace CMYK ,_baac NRGBA ,_cgbbf _ce .Rectangle ){for _gadc :=0;_gadc < _cgbbf .Max .X ;_gadc ++{for _gace :=0;_gace < _cgbbf .Max .Y ;_gace ++{_ffccb :=_eace .CMYKAt (_gadc ,_gace );
|
|
_baac .SetNRGBA (_gadc ,_gace ,_cbcf (_ffccb ));};};};func (_dbaa *Monochrome )InverseData ()error {return _dbaa .RasterOperation (0,0,_dbaa .Width ,_dbaa .Height ,PixNotDst ,nil ,0,0);};func (_dggb *Gray16 )Bounds ()_ce .Rectangle {return _ce .Rectangle {Max :_ce .Point {X :_dggb .Width ,Y :_dggb .Height }};
|
|
};func _bbg (_bcgd ,_dcf *Monochrome ,_gfg []byte ,_acg int )(_fe error ){var (_dgb ,_afed ,_afd ,_dcc ,_ded ,_dccc ,_egb ,_edf int ;_beb ,_ffaa uint32 ;_faa ,_cde byte ;_cfgc uint16 ;);_efc :=make ([]byte ,4);_acd :=make ([]byte ,4);for _afd =0;_afd < _bcgd .Height -1;
|
|
_afd ,_dcc =_afd +2,_dcc +1{_dgb =_afd *_bcgd .BytesPerLine ;_afed =_dcc *_dcf .BytesPerLine ;for _ded ,_dccc =0,0;_ded < _acg ;_ded ,_dccc =_ded +4,_dccc +1{for _egb =0;_egb < 4;_egb ++{_edf =_dgb +_ded +_egb ;if _edf <=len (_bcgd .Data )-1&&_edf < _dgb +_bcgd .BytesPerLine {_efc [_egb ]=_bcgd .Data [_edf ];
|
|
}else {_efc [_egb ]=0x00;};_edf =_dgb +_bcgd .BytesPerLine +_ded +_egb ;if _edf <=len (_bcgd .Data )-1&&_edf < _dgb +(2*_bcgd .BytesPerLine ){_acd [_egb ]=_bcgd .Data [_edf ];}else {_acd [_egb ]=0x00;};};_beb =_d .BigEndian .Uint32 (_efc );_ffaa =_d .BigEndian .Uint32 (_acd );
|
|
_ffaa &=_beb ;_ffaa &=_ffaa <<1;_ffaa &=0xaaaaaaaa;_beb =_ffaa |(_ffaa <<7);_faa =byte (_beb >>24);_cde =byte ((_beb >>8)&0xff);_edf =_afed +_dccc ;if _edf +1==len (_dcf .Data )-1||_edf +1>=_afed +_dcf .BytesPerLine {_dcf .Data [_edf ]=_gfg [_faa ];if _fe =_dcf .setByte (_edf ,_gfg [_faa ]);
|
|
_fe !=nil {return _f .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_edf );};}else {_cfgc =(uint16 (_gfg [_faa ])<<8)|uint16 (_gfg [_cde ]);if _fe =_dcf .setTwoBytes (_edf ,_cfgc );_fe !=nil {return _f .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",_edf );
|
|
};_dccc ++;};};};return nil ;};func RasterOperation (dest *Monochrome ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Monochrome ,sx ,sy int )error {return _faaa (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func _dda ()(_ace [256]uint32 ){for _gd :=0;_gd < 256;
|
|
_gd ++{if _gd &0x01!=0{_ace [_gd ]|=0xf;};if _gd &0x02!=0{_ace [_gd ]|=0xf0;};if _gd &0x04!=0{_ace [_gd ]|=0xf00;};if _gd &0x08!=0{_ace [_gd ]|=0xf000;};if _gd &0x10!=0{_ace [_gd ]|=0xf0000;};if _gd &0x20!=0{_ace [_gd ]|=0xf00000;};if _gd &0x40!=0{_ace [_gd ]|=0xf000000;
|
|
};if _gd &0x80!=0{_ace [_gd ]|=0xf0000000;};};return _ace ;};func _bdfa (_gde _e .RGBA )_e .NRGBA {switch _gde .A {case 0xff:return _e .NRGBA {R :_gde .R ,G :_gde .G ,B :_gde .B ,A :0xff};case 0x00:return _e .NRGBA {};default:_gcae ,_ebfb ,_ffca ,_fcae :=_gde .RGBA ();
|
|
_gcae =(_gcae *0xffff)/_fcae ;_ebfb =(_ebfb *0xffff)/_fcae ;_ffca =(_ffca *0xffff)/_fcae ;return _e .NRGBA {R :uint8 (_gcae >>8),G :uint8 (_ebfb >>8),B :uint8 (_ffca >>8),A :uint8 (_fcae >>8)};};};func _ffcf (_afeg _e .NRGBA )_e .CMYK {_fdbda ,_bec ,_geg ,_ :=_afeg .RGBA ();
|
|
_edca ,_cgea ,_cddcc ,_daba :=_e .RGBToCMYK (uint8 (_fdbda >>8),uint8 (_bec >>8),uint8 (_geg >>8));return _e .CMYK {C :_edca ,M :_cgea ,Y :_cddcc ,K :_daba };};func _fbbdg (_cdac *_ce .Gray ,_gcfe uint8 )*_ce .Gray {_acfbc :=_cdac .Bounds ();_accb :=_ce .NewGray (_acfbc );
|
|
for _eaad :=0;_eaad < _acfbc .Dx ();_eaad ++{for _agegd :=0;_agegd < _acfbc .Dy ();_agegd ++{_fcff :=_cdac .GrayAt (_eaad ,_agegd );_accb .SetGray (_eaad ,_agegd ,_e .Gray {Y :_eeege (_fcff .Y ,_gcfe )});};};return _accb ;};func _eaa (_ddg _e .Gray )_e .CMYK {return _e .CMYK {K :0xff-_ddg .Y }};
|
|
func (_aed *Gray2 )GrayAt (x ,y int )_e .Gray {_ddacf ,_ :=ColorAtGray2BPC (x ,y ,_aed .BytesPerLine ,_aed .Data ,_aed .Decode );return _ddacf ;};func (_ecaa *NRGBA64 )NRGBA64At (x ,y int )_e .NRGBA64 {_bacf ,_ :=ColorAtNRGBA64 (x ,y ,_ecaa .Width ,_ecaa .Data ,_ecaa .Alpha ,_ecaa .Decode );
|
|
return _bacf ;};func (_eccf *RGBA32 )SetRGBA (x ,y int ,c _e .RGBA ){_gfd :=y *_eccf .Width +x ;_cfgea :=3*_gfd ;if _cfgea +2>=len (_eccf .Data ){return ;};_eccf .setRGBA (_gfd ,c );};func _fdbc (_dbef *Monochrome ,_acge ,_cac int ,_faga ,_daggf int ,_fgce RasterOperator ,_efgf *Monochrome ,_fagbg ,_dfe int )error {var _dbda ,_ddgda ,_cefd ,_bagg int ;
|
|
if _acge < 0{_fagbg -=_acge ;_faga +=_acge ;_acge =0;};if _fagbg < 0{_acge -=_fagbg ;_faga +=_fagbg ;_fagbg =0;};_dbda =_acge +_faga -_dbef .Width ;if _dbda > 0{_faga -=_dbda ;};_ddgda =_fagbg +_faga -_efgf .Width ;if _ddgda > 0{_faga -=_ddgda ;};if _cac < 0{_dfe -=_cac ;
|
|
_daggf +=_cac ;_cac =0;};if _dfe < 0{_cac -=_dfe ;_daggf +=_dfe ;_dfe =0;};_cefd =_cac +_daggf -_dbef .Height ;if _cefd > 0{_daggf -=_cefd ;};_bagg =_dfe +_daggf -_efgf .Height ;if _bagg > 0{_daggf -=_bagg ;};if _faga <=0||_daggf <=0{return nil ;};var _agf error ;
|
|
switch {case _acge &7==0&&_fagbg &7==0:_agf =_fagae (_dbef ,_acge ,_cac ,_faga ,_daggf ,_fgce ,_efgf ,_fagbg ,_dfe );case _acge &7==_fagbg &7:_agf =_abbb (_dbef ,_acge ,_cac ,_faga ,_daggf ,_fgce ,_efgf ,_fagbg ,_dfe );default:_agf =_fbf (_dbef ,_acge ,_cac ,_faga ,_daggf ,_fgce ,_efgf ,_fagbg ,_dfe );
|
|
};if _agf !=nil {return _agf ;};return nil ;};func ColorAtGray2BPC (x ,y ,bytesPerLine int ,data []byte ,decode []float64 )(_e .Gray ,error ){_cgf :=y *bytesPerLine +x >>2;if _cgf >=len (data ){return _e .Gray {},_f .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 );
|
|
};_bceb :=data [_cgf ]>>uint (6-(x &3)*2)&3;if len (decode )==2{_bceb =uint8 (uint32 (LinearInterpolate (float64 (_bceb ),0,3.0,decode [0],decode [1]))&3);};return _e .Gray {Y :_bceb *85},nil ;};func ColorAt (x ,y ,width ,bitsPerColor ,colorComponents ,bytesPerLine int ,data ,alpha []byte ,decode []float64 )(_e .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 ,_f .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 _dcef (_fgbf Gray ,_badf nrgba64 ,_dcd _ce .Rectangle ){for _cded :=0;_cded < _dcd .Max .X ;_cded ++{for _dccb :=0;_dccb < _dcd .Max .Y ;_dccb ++{_dbac :=_fbba (_badf .NRGBA64At (_cded ,_dccb ));_fgbf .SetGray (_cded ,_dccb ,_dbac );};};};type colorConverter struct{_dddf func (_gdgd _ce .Image )(Image ,error );
|
|
};func (_befd *NRGBA32 )NRGBAAt (x ,y int )_e .NRGBA {_adgc ,_ :=ColorAtNRGBA32 (x ,y ,_befd .Width ,_befd .Data ,_befd .Alpha ,_befd .Decode );return _adgc ;};func (_fgbg *Gray2 )Copy ()Image {return &Gray2 {ImageBase :_fgbg .copy ()}};func _aee (_caa *Monochrome ,_caf ...int )(_fgg *Monochrome ,_dfga error ){if _caa ==nil {return nil ,_c .New ("\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if len (_caf )==0{return nil ,_c .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");
|
|
};_dg :=_gga ();_fgg =_caa ;for _ ,_cbd :=range _caf {if _cbd <=0{break ;};_fgg ,_dfga =_gaaf (_fgg ,_cbd ,_dg );if _dfga !=nil {return nil ,_dfga ;};};return _fgg ,nil ;};func ColorAtNRGBA16 (x ,y ,width ,bytesPerLine int ,data ,alpha []byte ,decode []float64 )(_e .NRGBA ,error ){_cefe :=y *bytesPerLine +x *3/2;
|
|
if _cefe +1>=len (data ){return _e .NRGBA {},_fgde (x ,y );};const (_dafbd =0xf;_daeg =uint8 (0xff););_beag :=_daeg ;if alpha !=nil {_aefe :=y *BytesPerLine (width ,4,1);if _aefe < len (alpha ){if x %2==0{_beag =(alpha [_aefe ]>>uint (4))&_dafbd ;}else {_beag =alpha [_aefe ]&_dafbd ;
|
|
};_beag |=_beag <<4;};};var _egde ,_agcb ,_dedc uint8 ;if x *3%2==0{_egde =(data [_cefe ]>>uint (4))&_dafbd ;_agcb =data [_cefe ]&_dafbd ;_dedc =(data [_cefe +1]>>uint (4))&_dafbd ;}else {_egde =data [_cefe ]&_dafbd ;_agcb =(data [_cefe +1]>>uint (4))&_dafbd ;
|
|
_dedc =data [_cefe +1]&_dafbd ;};if len (decode )==6{_egde =uint8 (uint32 (LinearInterpolate (float64 (_egde ),0,15,decode [0],decode [1]))&0xf);_agcb =uint8 (uint32 (LinearInterpolate (float64 (_agcb ),0,15,decode [2],decode [3]))&0xf);_dedc =uint8 (uint32 (LinearInterpolate (float64 (_dedc ),0,15,decode [4],decode [5]))&0xf);
|
|
};return _e .NRGBA {R :(_egde <<4)|(_egde &0xf),G :(_agcb <<4)|(_agcb &0xf),B :(_dedc <<4)|(_dedc &0xf),A :_beag },nil ;};func _bfad (_ead _ce .Image )(Image ,error ){if _ccag ,_gec :=_ead .(*Gray8 );_gec {return _ccag .Copy (),nil ;};_ade :=_ead .Bounds ();
|
|
_efg ,_fgfcb :=NewImage (_ade .Max .X ,_ade .Max .Y ,8,1,nil ,nil ,nil );if _fgfcb !=nil {return nil ,_fgfcb ;};_fdbb (_ead ,_efg ,_ade );return _efg ,nil ;};func _fagae (_ddfef *Monochrome ,_acgg ,_gdaa ,_efdb ,_aegb int ,_gcbc RasterOperator ,_eeb *Monochrome ,_ddea ,_gdcgg int )error {var (_aeae byte ;
|
|
_eedf int ;_ggce int ;_ebad ,_debe int ;_cgdeb ,_eggdd int ;);_ceae :=_efdb >>3;_dcb :=_efdb &7;if _dcb > 0{_aeae =_eeacb [_dcb ];};_eedf =_eeb .BytesPerLine *_gdcgg +(_ddea >>3);_ggce =_ddfef .BytesPerLine *_gdaa +(_acgg >>3);switch _gcbc {case PixSrc :for _cgdeb =0;
|
|
_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]=_eeb .Data [_ebad ];_debe ++;_ebad ++;};if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],_eeb .Data [_ebad ],_aeae );
|
|
};};case PixNotSrc :for _cgdeb =0;_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]=^(_eeb .Data [_ebad ]);_debe ++;_ebad ++;};if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],^_eeb .Data [_ebad ],_aeae );
|
|
};};case PixSrcOrDst :for _cgdeb =0;_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]|=_eeb .Data [_ebad ];_debe ++;_ebad ++;};if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],_eeb .Data [_ebad ]|_ddfef .Data [_debe ],_aeae );
|
|
};};case PixSrcAndDst :for _cgdeb =0;_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]&=_eeb .Data [_ebad ];_debe ++;_ebad ++;};
|
|
if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],_eeb .Data [_ebad ]&_ddfef .Data [_debe ],_aeae );};};case PixSrcXorDst :for _cgdeb =0;_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;
|
|
for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]^=_eeb .Data [_ebad ];_debe ++;_ebad ++;};if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],_eeb .Data [_ebad ]^_ddfef .Data [_debe ],_aeae );};};case PixNotSrcOrDst :for _cgdeb =0;
|
|
_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]|=^(_eeb .Data [_ebad ]);_debe ++;_ebad ++;};if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],^(_eeb .Data [_ebad ])|_ddfef .Data [_debe ],_aeae );
|
|
};};case PixNotSrcAndDst :for _cgdeb =0;_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]&=^(_eeb .Data [_ebad ]);_debe ++;_ebad ++;
|
|
};if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],^(_eeb .Data [_ebad ])&_ddfef .Data [_debe ],_aeae );};};case PixSrcOrNotDst :for _cgdeb =0;_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;
|
|
for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]=_eeb .Data [_ebad ]|^(_ddfef .Data [_debe ]);_debe ++;_ebad ++;};if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],_eeb .Data [_ebad ]|^(_ddfef .Data [_debe ]),_aeae );};};case PixSrcAndNotDst :for _cgdeb =0;
|
|
_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]=_eeb .Data [_ebad ]&^(_ddfef .Data [_debe ]);_debe ++;_ebad ++;};if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],_eeb .Data [_ebad ]&^(_ddfef .Data [_debe ]),_aeae );
|
|
};};case PixNotPixSrcOrDst :for _cgdeb =0;_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]=^(_eeb .Data [_ebad ]|_ddfef .Data [_debe ]);
|
|
_debe ++;_ebad ++;};if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],^(_eeb .Data [_ebad ]|_ddfef .Data [_debe ]),_aeae );};};case PixNotPixSrcAndDst :for _cgdeb =0;_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;
|
|
for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]=^(_eeb .Data [_ebad ]&_ddfef .Data [_debe ]);_debe ++;_ebad ++;};if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],^(_eeb .Data [_ebad ]&_ddfef .Data [_debe ]),_aeae );};};case PixNotPixSrcXorDst :for _cgdeb =0;
|
|
_cgdeb < _aegb ;_cgdeb ++{_ebad =_eedf +_cgdeb *_eeb .BytesPerLine ;_debe =_ggce +_cgdeb *_ddfef .BytesPerLine ;for _eggdd =0;_eggdd < _ceae ;_eggdd ++{_ddfef .Data [_debe ]=^(_eeb .Data [_ebad ]^_ddfef .Data [_debe ]);_debe ++;_ebad ++;};if _dcb > 0{_ddfef .Data [_debe ]=_ffab (_ddfef .Data [_debe ],^(_eeb .Data [_ebad ]^_ddfef .Data [_debe ]),_aeae );
|
|
};};default:_fb .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",_gcbc );return _c .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 (_eeacba *NRGBA32 )At (x ,y int )_e .Color {_fdec ,_ :=_eeacba .ColorAt (x ,y );return _fdec };func (_decg *Gray2 )At (x ,y int )_e .Color {_deec ,_ :=_decg .ColorAt (x ,y );return _deec };func _bd (_be ,_cf *Monochrome )(_fgb error ){_edb :=_cf .BytesPerLine ;
|
|
_bg :=_be .BytesPerLine ;var _ecc ,_dbf ,_cab ,_ac ,_bbe int ;for _cab =0;_cab < _cf .Height ;_cab ++{_ecc =_cab *_edb ;_dbf =8*_cab *_bg ;for _ac =0;_ac < _edb ;_ac ++{if _fgb =_be .setEightBytes (_dbf +_ac *8,_dae [_cf .Data [_ecc +_ac ]]);_fgb !=nil {return _fgb ;
|
|
};};for _bbe =1;_bbe < 8;_bbe ++{for _ac =0;_ac < _bg ;_ac ++{if _fgb =_be .setByte (_dbf +_bbe *_bg +_ac ,_be .Data [_dbf +_ac ]);_fgb !=nil {return _fgb ;};};};};return nil ;};type RGBA32 struct{ImageBase };func (_ggab *Monochrome )ExpandBinary (factor int )(*Monochrome ,error ){if !IsPowerOf2 (uint (factor )){return nil ,_f .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 _ae (_ggab ,factor );};func (_efcf *CMYK32 )SetCMYK (x ,y int ,c _e .CMYK ){_egeg :=4*(y *_efcf .Width +x );if _egeg +3>=len (_efcf .Data ){return ;};_efcf .Data [_egeg ]=c .C ;_efcf .Data [_egeg +1]=c .M ;_efcf .Data [_egeg +2]=c .Y ;_efcf .Data [_egeg +3]=c .K ;
|
|
};func _ffab (_cfec ,_fbbd ,_eag byte )byte {return (_cfec &^(_eag ))|(_fbbd &_eag )};type nrgba64 interface{NRGBA64At (_cgfa ,_cbbb int )_e .NRGBA64 ;SetNRGBA64 (_faeb ,_bfbff int ,_eegcd _e .NRGBA64 );};var _ Image =&Gray8 {};func (_dfgd *NRGBA16 )At (x ,y int )_e .Color {_dbgba ,_ :=_dfgd .ColorAt (x ,y );
|
|
return _dbgba };var _bbgd [256]uint8 ;func (_ebfd *RGBA32 )Bounds ()_ce .Rectangle {return _ce .Rectangle {Max :_ce .Point {X :_ebfd .Width ,Y :_ebfd .Height }};};func _bdf (_edg ,_gdg *Monochrome ,_bge []byte ,_bce int )(_cfga error ){var (_afe ,_aec ,_afea ,_bdd ,_bac ,_gff ,_fda ,_cgda int ;
|
|
_acbg ,_abaf uint32 ;_dgf ,_bgb byte ;_cdg uint16 ;);_bfc :=make ([]byte ,4);_edef :=make ([]byte ,4);for _afea =0;_afea < _edg .Height -1;_afea ,_bdd =_afea +2,_bdd +1{_afe =_afea *_edg .BytesPerLine ;_aec =_bdd *_gdg .BytesPerLine ;for _bac ,_gff =0,0;
|
|
_bac < _bce ;_bac ,_gff =_bac +4,_gff +1{for _fda =0;_fda < 4;_fda ++{_cgda =_afe +_bac +_fda ;if _cgda <=len (_edg .Data )-1&&_cgda < _afe +_edg .BytesPerLine {_bfc [_fda ]=_edg .Data [_cgda ];}else {_bfc [_fda ]=0x00;};_cgda =_afe +_edg .BytesPerLine +_bac +_fda ;
|
|
if _cgda <=len (_edg .Data )-1&&_cgda < _afe +(2*_edg .BytesPerLine ){_edef [_fda ]=_edg .Data [_cgda ];}else {_edef [_fda ]=0x00;};};_acbg =_d .BigEndian .Uint32 (_bfc );_abaf =_d .BigEndian .Uint32 (_edef );_abaf |=_acbg ;_abaf |=_abaf <<1;_abaf &=0xaaaaaaaa;
|
|
_acbg =_abaf |(_abaf <<7);_dgf =byte (_acbg >>24);_bgb =byte ((_acbg >>8)&0xff);_cgda =_aec +_gff ;if _cgda +1==len (_gdg .Data )-1||_cgda +1>=_aec +_gdg .BytesPerLine {_gdg .Data [_cgda ]=_bge [_dgf ];}else {_cdg =(uint16 (_bge [_dgf ])<<8)|uint16 (_bge [_bgb ]);
|
|
if _cfga =_gdg .setTwoBytes (_cgda ,_cdg );_cfga !=nil {return _f .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",_cgda );
|
|
};_gff ++;};};};return nil ;};func (_dafe *Gray4 )Set (x ,y int ,c _e .Color ){if x >=_dafe .Width ||y >=_dafe .Height {return ;};_bace :=Gray4Model .Convert (c ).(_e .Gray );_dafe .setGray (x ,y ,_bace );};func _efa (_bfb _e .RGBA )_e .Gray {_ebed :=(19595*uint32 (_bfb .R )+38470*uint32 (_bfb .G )+7471*uint32 (_bfb .B )+1<<7)>>16;
|
|
return _e .Gray {Y :uint8 (_ebed )};};func (_bdce *Gray4 )Base ()*ImageBase {return &_bdce .ImageBase };func ScaleAlphaToMonochrome (data []byte ,width ,height int )([]byte ,error ){_fc :=BytesPerLine (width ,8,1);if len (data )< _fc *height {return nil ,nil ;
|
|
};_eg :=&Gray8 {NewImageBase (width ,height ,8,1,data ,nil ,nil )};_ga ,_b :=MonochromeConverter .Convert (_eg );if _b !=nil {return nil ,_b ;};return _ga .Base ().Data ,nil ;};func _ccgb (_dfec ,_efbb RGBA ,_ggd _ce .Rectangle ){for _bbbac :=0;_bbbac < _ggd .Max .X ;
|
|
_bbbac ++{for _gcca :=0;_gcca < _ggd .Max .Y ;_gcca ++{_efbb .SetRGBA (_bbbac ,_gcca ,_dfec .RGBAAt (_bbbac ,_gcca ));};};};func (_adadc *NRGBA64 )setNRGBA64 (_abcb int ,_bffc _e .NRGBA64 ,_dfff int ){_adadc .Data [_abcb ]=uint8 (_bffc .R >>8);_adadc .Data [_abcb +1]=uint8 (_bffc .R &0xff);
|
|
_adadc .Data [_abcb +2]=uint8 (_bffc .G >>8);_adadc .Data [_abcb +3]=uint8 (_bffc .G &0xff);_adadc .Data [_abcb +4]=uint8 (_bffc .B >>8);_adadc .Data [_abcb +5]=uint8 (_bffc .B &0xff);if _dfff +1< len (_adadc .Alpha ){_adadc .Alpha [_dfff ]=uint8 (_bffc .A >>8);
|
|
_adadc .Alpha [_dfff +1]=uint8 (_bffc .A &0xff);};};func _gadf (_fcee _e .Color )_e .Color {_aegee :=_e .NRGBAModel .Convert (_fcee ).(_e .NRGBA );return _cefc (_aegee );};var _ Image =&NRGBA64 {};func (_fdfb *Monochrome )Set (x ,y int ,c _e .Color ){_cdb :=y *_fdfb .BytesPerLine +x >>3;
|
|
if _cdb > len (_fdfb .Data )-1{return ;};_bfbg :=_fdfb .ColorModel ().Convert (c ).(_e .Gray );_fdfb .setGray (x ,_bfbg ,_cdb );};func (_acfa *ImageBase )getByte (_edfb int )(byte ,error ){if _edfb > len (_acfa .Data )-1||_edfb < 0{return 0,_f .Errorf ("\u0069\u006e\u0064\u0065x:\u0020\u0025\u0064\u0020\u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006eg\u0065",_edfb );
|
|
};return _acfa .Data [_edfb ],nil ;};func (_febd *Gray16 )ColorModel ()_e .Model {return _e .Gray16Model };var (Gray2Model =_e .ModelFunc (_agbd );Gray4Model =_e .ModelFunc (_ddbg );NRGBA16Model =_e .ModelFunc (_gadf ););func MonochromeModel (threshold uint8 )_e .Model {return monochromeModel (threshold )};
|
|
func (_cdf *NRGBA16 )setNRGBA (_eaae ,_fced ,_gdfbf int ,_ggaee _e .NRGBA ){if _eaae *3%2==0{_cdf .Data [_gdfbf ]=(_ggaee .R >>4)<<4|(_ggaee .G >>4);_cdf .Data [_gdfbf +1]=(_ggaee .B >>4)<<4|(_cdf .Data [_gdfbf +1]&0xf);}else {_cdf .Data [_gdfbf ]=(_cdf .Data [_gdfbf ]&0xf0)|(_ggaee .R >>4);
|
|
_cdf .Data [_gdfbf +1]=(_ggaee .G >>4)<<4|(_ggaee .B >>4);};if _cdf .Alpha !=nil {_bfeac :=_fced *BytesPerLine (_cdf .Width ,4,1);if _bfeac < len (_cdf .Alpha ){if _eaae %2==0{_cdf .Alpha [_bfeac ]=(_ggaee .A >>uint (4))<<uint (4)|(_cdf .Alpha [_gdfbf ]&0xf);
|
|
}else {_cdf .Alpha [_bfeac ]=(_cdf .Alpha [_bfeac ]&0xf0)|(_ggaee .A >>uint (4));};};};};func _ddcfg (_cdfg Gray ,_efde NRGBA ,_eefd _ce .Rectangle ){for _febe :=0;_febe < _eefd .Max .X ;_febe ++{for _abfc :=0;_abfc < _eefd .Max .Y ;_abfc ++{_fabb :=_cdfg .GrayAt (_febe ,_abfc );
|
|
_efde .SetNRGBA (_febe ,_abfc ,_bgea (_fabb ));};};};func _edfd (_gdgde _ce .Image ,_dfgb Image ,_fabba _ce .Rectangle ){if _dcag ,_aaa :=_gdgde .(SMasker );_aaa &&_dcag .HasAlpha (){_dfgb .(SMasker ).MakeAlpha ();};switch _faeg :=_gdgde .(type ){case Gray :_dcdd (_faeg ,_dfgb .(RGBA ),_fabba );
|
|
case NRGBA :_egdg (_faeg ,_dfgb .(RGBA ),_fabba );case *_ce .NYCbCrA :_gabb (_faeg ,_dfgb .(RGBA ),_fabba );case CMYK :_cedf (_faeg ,_dfgb .(RGBA ),_fabba );case RGBA :_ccgb (_faeg ,_dfgb .(RGBA ),_fabba );case nrgba64 :_egaf (_faeg ,_dfgb .(RGBA ),_fabba );
|
|
default:_cbga (_gdgde ,_dfgb ,_fabba );};};func _ddbg (_cdge _e .Color )_e .Color {_babg :=_e .GrayModel .Convert (_cdge ).(_e .Gray );return _agg (_babg );};func (_eeed *Monochrome )ColorAt (x ,y int )(_e .Color ,error ){return ColorAtGray1BPC (x ,y ,_eeed .BytesPerLine ,_eeed .Data ,_eeed .Decode );
|
|
};func (_fbag *RGBA32 )Base ()*ImageBase {return &_fbag .ImageBase };func (_dfc colorConverter )Convert (src _ce .Image )(Image ,error ){return _dfc ._dddf (src )};func (_cfdb *Monochrome )ReduceBinary (factor float64 )(*Monochrome ,error ){_agb :=_dfbd (uint (factor ));
|
|
if !IsPowerOf2 (uint (factor )){_agb ++;};_dcfc :=make ([]int ,_agb );for _cfe :=range _dcfc {_dcfc [_cfe ]=4;};_cfbf ,_caag :=_aee (_cfdb ,_dcfc ...);if _caag !=nil {return nil ,_caag ;};return _cfbf ,nil ;};func (_gdda *RGBA32 )RGBAAt (x ,y int )_e .RGBA {_adefc ,_ :=ColorAtRGBA32 (x ,y ,_gdda .Width ,_gdda .Data ,_gdda .Alpha ,_gdda .Decode );
|
|
return _adefc ;};type Histogramer interface{Histogram ()[256]int ;};type monochromeThresholdConverter struct{Threshold uint8 ;};var _ Gray =&Monochrome {};func _afad (_dgda _ce .Image )(Image ,error ){if _gag ,_fce :=_dgda .(*Monochrome );_fce {return _gag ,nil ;
|
|
};_agda :=_dgda .Bounds ();var _gaag Gray ;switch _dcfg :=_dgda .(type ){case Gray :_gaag =_dcfg ;case NRGBA :_gaag =&Gray8 {ImageBase :NewImageBase (_agda .Max .X ,_agda .Max .Y ,8,1,nil ,nil ,nil )};_bddf (_gaag ,_dcfg ,_agda );case nrgba64 :_gaag =&Gray8 {ImageBase :NewImageBase (_agda .Max .X ,_agda .Max .Y ,8,1,nil ,nil ,nil )};
|
|
_dcef (_gaag ,_dcfg ,_agda );default:_egc ,_fge :=GrayConverter .Convert (_dgda );if _fge !=nil {return nil ,_fge ;};_gaag =_egc .(Gray );};_gbbc ,_adae :=NewImage (_agda .Max .X ,_agda .Max .Y ,1,1,nil ,nil ,nil );if _adae !=nil {return nil ,_adae ;};
|
|
_dcfd :=_gbbc .(*Monochrome );_bgcf :=AutoThresholdTriangle (GrayHistogram (_gaag ));for _adf :=0;_adf < _agda .Max .X ;_adf ++{for _bee :=0;_bee < _agda .Max .Y ;_bee ++{_cebf :=_cabab (_gaag .GrayAt (_adf ,_bee ),monochromeModel (_bgcf ));_dcfd .SetGray (_adf ,_bee ,_cebf );
|
|
};};return _gbbc ,nil ;};var _ _ce .Image =&Monochrome {};func _aecb (_eab RGBA ,_afa CMYK ,_gdd _ce .Rectangle ){for _ebf :=0;_ebf < _gdd .Max .X ;_ebf ++{for _bdfc :=0;_bdfc < _gdd .Max .Y ;_bdfc ++{_fbc :=_eab .RGBAAt (_ebf ,_bdfc );_afa .SetCMYK (_ebf ,_bdfc ,_egf (_fbc ));
|
|
};};};func (_edaca *Gray8 )SetGray (x ,y int ,g _e .Gray ){_gefa :=y *_edaca .BytesPerLine +x ;if _gefa > len (_edaca .Data )-1{return ;};_edaca .Data [_gefa ]=g .Y ;};func (_ecca *Gray2 )ColorAt (x ,y int )(_e .Color ,error ){return ColorAtGray2BPC (x ,y ,_ecca .BytesPerLine ,_ecca .Data ,_ecca .Decode );
|
|
};func _bde (_badg ,_facf Gray ,_aaed _ce .Rectangle ){for _eedd :=0;_eedd < _aaed .Max .X ;_eedd ++{for _beda :=0;_beda < _aaed .Max .Y ;_beda ++{_facf .SetGray (_eedd ,_beda ,_badg .GrayAt (_eedd ,_beda ));};};};func (_deag *NRGBA64 )ColorModel ()_e .Model {return _e .NRGBA64Model };
|
|
func (_bfee *Gray8 )Base ()*ImageBase {return &_bfee .ImageBase };func _ecf (_fcd ,_ede int ,_afb []byte )*Monochrome {_begb :=_eda (_fcd ,_ede );_begb .Data =_afb ;return _begb ;};func _cbae (_degc _ce .Image ,_fbd Image ,_bfba _ce .Rectangle ){if _gbbg ,_acda :=_degc .(SMasker );
|
|
_acda &&_gbbg .HasAlpha (){_fbd .(SMasker ).MakeAlpha ();};_cbga (_degc ,_fbd ,_bfba );};func _gga ()(_cca []byte ){_cca =make ([]byte ,256);for _gcc :=0;_gcc < 256;_gcc ++{_eeg :=byte (_gcc );_cca [_eeg ]=(_eeg &0x01)|((_eeg &0x04)>>1)|((_eeg &0x10)>>2)|((_eeg &0x40)>>3)|((_eeg &0x02)<<3)|((_eeg &0x08)<<2)|((_eeg &0x20)<<1)|(_eeg &0x80);
|
|
};return _cca ;};type Gray interface{GrayAt (_ffaaf ,_efb int )_e .Gray ;SetGray (_gad ,_eaf int ,_aaea _e .Gray );};func (_bcdd *RGBA32 )setRGBA (_aegc int ,_ceggb _e .RGBA ){_adfa :=3*_aegc ;_bcdd .Data [_adfa ]=_ceggb .R ;_bcdd .Data [_adfa +1]=_ceggb .G ;
|
|
_bcdd .Data [_adfa +2]=_ceggb .B ;if _aegc < len (_bcdd .Alpha ){_bcdd .Alpha [_aegc ]=_ceggb .A ;};};func (_ccacb *NRGBA64 )Validate ()error {if len (_ccacb .Data )!=3*2*_ccacb .Width *_ccacb .Height {return _c .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 (_dgeb *ImageBase )setFourBytes (_ebae int ,_afga uint32 )error {if _ebae +3> len (_dgeb .Data )-1{return _f .Errorf ("\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_ebae );
|
|
};_dgeb .Data [_ebae ]=byte ((_afga &0xff000000)>>24);_dgeb .Data [_ebae +1]=byte ((_afga &0xff0000)>>16);_dgeb .Data [_ebae +2]=byte ((_afga &0xff00)>>8);_dgeb .Data [_ebae +3]=byte (_afga &0xff);return nil ;};func (_dgdgb *NRGBA64 )Set (x ,y int ,c _e .Color ){_cdec :=(y *_dgdgb .Width +x )*2;
|
|
_bbcb :=_cdec *3;if _bbcb +5>=len (_dgdgb .Data ){return ;};_baad :=_e .NRGBA64Model .Convert (c ).(_e .NRGBA64 );_dgdgb .setNRGBA64 (_bbcb ,_baad ,_cdec );};func _dfbd (_dfbc uint )uint {var _bgcgf uint ;for _dfbc !=0{_dfbc >>=1;_bgcgf ++;};return _bgcgf -1;
|
|
};type NRGBA32 struct{ImageBase };func (_eff *CMYK32 )Validate ()error {if len (_eff .Data )!=4*_eff .Width *_eff .Height {return _c .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 _ecab (_dbaaf _ce .Image )(Image ,error ){if _feea ,_dafg :=_dbaaf .(*Gray16 );_dafg {return _feea .Copy (),nil ;};_fagb :=_dbaaf .Bounds ();_degb ,_eafcd :=NewImage (_fagb .Max .X ,_fagb .Max .Y ,16,1,nil ,nil ,nil );if _eafcd !=nil {return nil ,_eafcd ;
|
|
};_fdbb (_dbaaf ,_degb ,_fagb );return _degb ,nil ;};func (_ggag *CMYK32 )ColorModel ()_e .Model {return _e .CMYKModel };func _geeg (_afgc uint8 )bool {if _afgc ==0||_afgc ==255{return true ;};return false ;};var _ Image =&NRGBA32 {};type ImageBase struct{Width ,Height int ;
|
|
BitsPerComponent ,ColorComponents int ;Data ,Alpha []byte ;Decode []float64 ;BytesPerLine int ;};func _cge (_cafd _e .Gray )_e .RGBA {return _e .RGBA {R :_cafd .Y ,G :_cafd .Y ,B :_cafd .Y ,A :0xff}};func (_dedg *Gray4 )Bounds ()_ce .Rectangle {return _ce .Rectangle {Max :_ce .Point {X :_dedg .Width ,Y :_dedg .Height }};
|
|
};func _gca ()(_edba [256]uint64 ){for _fde :=0;_fde < 256;_fde ++{if _fde &0x01!=0{_edba [_fde ]|=0xff;};if _fde &0x02!=0{_edba [_fde ]|=0xff00;};if _fde &0x04!=0{_edba [_fde ]|=0xff0000;};if _fde &0x08!=0{_edba [_fde ]|=0xff000000;};if _fde &0x10!=0{_edba [_fde ]|=0xff00000000;
|
|
};if _fde &0x20!=0{_edba [_fde ]|=0xff0000000000;};if _fde &0x40!=0{_edba [_fde ]|=0xff000000000000;};if _fde &0x80!=0{_edba [_fde ]|=0xff00000000000000;};};return _edba ;};func (_cddd *NRGBA32 )Base ()*ImageBase {return &_cddd .ImageBase };func _bbgeg (_fdac _ce .Image )(Image ,error ){if _bbdc ,_gdcde :=_fdac .(*RGBA32 );
|
|
_gdcde {return _bbdc .Copy (),nil ;};_gbef ,_debf ,_edcf :=_faba (_fdac ,1);_cdab :=&RGBA32 {ImageBase :NewImageBase (_gbef .Max .X ,_gbef .Max .Y ,8,3,nil ,_edcf ,nil )};_edfd (_fdac ,_cdab ,_gbef );if len (_edcf )!=0&&!_debf {if _gfba :=_egbb (_edcf ,_cdab );
|
|
_gfba !=nil {return nil ,_gfba ;};};return _cdab ,nil ;};func _faba (_acbgf _ce .Image ,_ccgf int )(_ce .Rectangle ,bool ,[]byte ){_egfa :=_acbgf .Bounds ();var (_feba bool ;_acdd []byte ;);switch _cdfd :=_acbgf .(type ){case SMasker :_feba =_cdfd .HasAlpha ();
|
|
case NRGBA ,RGBA ,*_ce .RGBA64 ,nrgba64 ,*_ce .NYCbCrA :_acdd =make ([]byte ,_egfa .Max .X *_egfa .Max .Y *_ccgf );case *_ce .Paletted :var _dggd bool ;for _ ,_bbef :=range _cdfd .Palette {_eecee ,_efac ,_bbede ,_dbbd :=_bbef .RGBA ();if _eecee ==0&&_efac ==0&&_bbede ==0&&_dbbd !=0{_dggd =true ;
|
|
break ;};};if _dggd {_acdd =make ([]byte ,_egfa .Max .X *_egfa .Max .Y *_ccgf );};};return _egfa ,_feba ,_acdd ;};func _ffa (_gaf *Monochrome ,_fbbfa ,_ggf int )(*Monochrome ,error ){if _gaf ==nil {return nil ,_c .New ("\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _fbbfa <=0||_ggf <=0{return nil ,_c .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 _fbbfa ==_ggf {if _fbbfa ==1{return _gaf .copy (),nil ;
|
|
};if _fbbfa ==2||_fbbfa ==4||_fbbfa ==8{_ab ,_cbb :=_ae (_gaf ,_fbbfa );if _cbb !=nil {return nil ,_cbb ;};return _ab ,nil ;};};_cc :=_fbbfa *_gaf .Width ;_dee :=_ggf *_gaf .Height ;_dbc :=_eda (_cc ,_dee );_ggff :=_dbc .BytesPerLine ;var (_ddd ,_fca ,_ceee ,_dbb ,_aag int ;
|
|
_bga byte ;_eae error ;);for _fca =0;_fca < _gaf .Height ;_fca ++{_ddd =_ggf *_fca *_ggff ;for _ceee =0;_ceee < _gaf .Width ;_ceee ++{if _beg :=_gaf .getBitAt (_ceee ,_fca );_beg {_aag =_fbbfa *_ceee ;for _dbb =0;_dbb < _fbbfa ;_dbb ++{_dbc .setIndexedBit (_ddd *8+_aag +_dbb );
|
|
};};};for _dbb =1;_dbb < _ggf ;_dbb ++{_abg :=_ddd +_dbb *_ggff ;for _gead :=0;_gead < _ggff ;_gead ++{if _bga ,_eae =_dbc .getByte (_ddd +_gead );_eae !=nil {return nil ,_eae ;};if _eae =_dbc .setByte (_abg +_gead ,_bga );_eae !=nil {return nil ,_eae ;
|
|
};};};};return _dbc ,nil ;};func (_fged *Monochrome )IsUnpadded ()bool {return (_fged .Width *_fged .Height )==len (_fged .Data )};func GetConverter (bitsPerComponent ,colorComponents int )(ColorConverter ,error ){switch colorComponents {case 1:switch bitsPerComponent {case 1:return MonochromeConverter ,nil ;
|
|
case 2:return Gray2Converter ,nil ;case 4:return Gray4Converter ,nil ;case 8:return GrayConverter ,nil ;case 16:return Gray16Converter ,nil ;};case 3:switch bitsPerComponent {case 4:return NRGBA16Converter ,nil ;case 8:return NRGBAConverter ,nil ;case 16:return NRGBA64Converter ,nil ;
|
|
};case 4:return CMYKConverter ,nil ;};return nil ,_f .Errorf ("\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0069\u006e\u0076\u0061l\u0069\u0064\u0020\u0063\u006f\u006c\u006f\u0072\u0043o\u006e\u0076\u0065\u0072\u0074\u0065\u0072\u0020\u0070\u0061\u0072\u0061\u006d\u0065t\u0065\u0072\u0073\u002e\u0020\u0042\u0069\u0074\u0073\u0050\u0065\u0072\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u003a\u0020\u0025\u0064\u002c\u0020\u0043\u006f\u006co\u0072\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006et\u0073\u003a \u0025\u0064",bitsPerComponent ,colorComponents );
|
|
};func (_gdc *CMYK32 )Bounds ()_ce .Rectangle {return _ce .Rectangle {Max :_ce .Point {X :_gdc .Width ,Y :_gdc .Height }};};func _agbb (){for _gccfb :=0;_gccfb < 256;_gccfb ++{_bbgd [_gccfb ]=uint8 (_gccfb &0x1)+(uint8 (_gccfb >>1)&0x1)+(uint8 (_gccfb >>2)&0x1)+(uint8 (_gccfb >>3)&0x1)+(uint8 (_gccfb >>4)&0x1)+(uint8 (_gccfb >>5)&0x1)+(uint8 (_gccfb >>6)&0x1)+(uint8 (_gccfb >>7)&0x1);
|
|
};};func (_bcdfb *NRGBA32 )Copy ()Image {return &NRGBA32 {ImageBase :_bcdfb .copy ()}};func (_caab *CMYK32 )Copy ()Image {return &CMYK32 {ImageBase :_caab .copy ()}};func (_gaef *Monochrome )Base ()*ImageBase {return &_gaef .ImageBase };func (_feb *Gray2 )ColorModel ()_e .Model {return Gray2Model };
|
|
func _gagf (_aebgc NRGBA ,_agae Gray ,_beba _ce .Rectangle ){for _fgfg :=0;_fgfg < _beba .Max .X ;_fgfg ++{for _bfcce :=0;_bfcce < _beba .Max .Y ;_bfcce ++{_dbeb :=_cgef (_aebgc .NRGBAAt (_fgfg ,_bfcce ));_agae .SetGray (_fgfg ,_bfcce ,_dbeb );};};};type SMasker interface{HasAlpha ()bool ;
|
|
GetAlpha ()[]byte ;MakeAlpha ();};func (_aea *Monochrome )ResolveDecode ()error {if len (_aea .Decode )!=2{return nil ;};if _aea .Decode [0]==1&&_aea .Decode [1]==0{if _addf :=_aea .InverseData ();_addf !=nil {return _addf ;};_aea .Decode =nil ;};return nil ;
|
|
};func (_cdfe *NRGBA64 )Bounds ()_ce .Rectangle {return _ce .Rectangle {Max :_ce .Point {X :_cdfe .Width ,Y :_cdfe .Height }};};func _egdg (_eadgb NRGBA ,_dgea RGBA ,_abegf _ce .Rectangle ){for _cdebe :=0;_cdebe < _abegf .Max .X ;_cdebe ++{for _aeeab :=0;
|
|
_aeeab < _abegf .Max .Y ;_aeeab ++{_edbcg :=_eadgb .NRGBAAt (_cdebe ,_aeeab );_dgea .SetRGBA (_cdebe ,_aeeab ,_bfaf (_edbcg ));};};};func (_cba *Gray16 )SetGray (x ,y int ,g _e .Gray ){_bgad :=(y *_cba .BytesPerLine /2+x )*2;if _bgad +1>=len (_cba .Data ){return ;
|
|
};_cba .Data [_bgad ]=g .Y ;_cba .Data [_bgad +1]=g .Y ;};func (_fcca *Monochrome )Bounds ()_ce .Rectangle {return _ce .Rectangle {Max :_ce .Point {X :_fcca .Width ,Y :_fcca .Height }};};func _gef (_bcee Gray ,_ffc CMYK ,_dbdfg _ce .Rectangle ){for _acbge :=0;
|
|
_acbge < _dbdfg .Max .X ;_acbge ++{for _faad :=0;_faad < _dbdfg .Max .Y ;_faad ++{_aga :=_bcee .GrayAt (_acbge ,_faad );_ffc .SetCMYK (_acbge ,_faad ,_eaa (_aga ));};};};func (_eadb *Gray16 )Base ()*ImageBase {return &_eadb .ImageBase };func _dcdd (_bbbd Gray ,_bgcb RGBA ,_dgcf _ce .Rectangle ){for _dccee :=0;
|
|
_dccee < _dgcf .Max .X ;_dccee ++{for _becad :=0;_becad < _dgcf .Max .Y ;_becad ++{_fbad :=_bbbd .GrayAt (_dccee ,_becad );_bgcb .SetRGBA (_dccee ,_becad ,_cge (_fbad ));};};};type Monochrome struct{ImageBase ;ModelThreshold uint8 ;};func (_dbde *NRGBA64 )Copy ()Image {return &NRGBA64 {ImageBase :_dbde .copy ()}};
|
|
func _fcb (_edgc _e .CMYK )_e .Gray {_abbc ,_fbaa ,_bgaf :=_e .CMYKToRGB (_edgc .C ,_edgc .M ,_edgc .Y ,_edgc .K );_ceec :=(19595*uint32 (_abbc )+38470*uint32 (_fbaa )+7471*uint32 (_bgaf )+1<<7)>>16;return _e .Gray {Y :uint8 (_ceec )};};func (_facd *ImageBase )GetAlpha ()[]byte {return _facd .Alpha };
|
|
func (_gdab *Gray4 )At (x ,y int )_e .Color {_cea ,_ :=_gdab .ColorAt (x ,y );return _cea };func _cefc (_fcdb _e .NRGBA )_e .NRGBA {_fcdb .R =_fcdb .R >>4|(_fcdb .R >>4)<<4;_fcdb .G =_fcdb .G >>4|(_fcdb .G >>4)<<4;_fcdb .B =_fcdb .B >>4|(_fcdb .B >>4)<<4;
|
|
return _fcdb ;};func _gdb (_gaee _e .CMYK )_e .RGBA {_cgc ,_adad ,_cgg :=_e .CMYKToRGB (_gaee .C ,_gaee .M ,_gaee .Y ,_gaee .K );return _e .RGBA {R :_cgc ,G :_adad ,B :_cgg ,A :0xff};};var _ Image =&CMYK32 {};func (_eggc *Monochrome )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Monochrome ,sx ,sy int )error {return _faaa (_eggc ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
};type Image interface{_g .Image ;Base ()*ImageBase ;Copy ()Image ;Pix ()[]byte ;ColorAt (_fbebg ,_cgad int )(_e .Color ,error );Validate ()error ;};func _ecdeg (_dcgb _ce .Image )(Image ,error ){if _bdaa ,_fbcd :=_dcgb .(*NRGBA16 );_fbcd {return _bdaa .Copy (),nil ;
|
|
};_gccea :=_dcgb .Bounds ();_fbce ,_gdfa :=NewImage (_gccea .Max .X ,_gccea .Max .Y ,4,3,nil ,nil ,nil );if _gdfa !=nil {return nil ,_gdfa ;};_bcbd (_dcgb ,_fbce ,_gccea );return _fbce ,nil ;};func _edega (_adadf _ce .Image ,_cdcbg uint8 )*_ce .Gray {_dbgd :=_adadf .Bounds ();
|
|
_gfeg :=_ce .NewGray (_dbgd );var (_gggf _e .Color ;_faca _e .Gray ;);for _ecbec :=0;_ecbec < _dbgd .Max .X ;_ecbec ++{for _bdfcc :=0;_bdfcc < _dbgd .Max .Y ;_bdfcc ++{_gggf =_adadf .At (_ecbec ,_bdfcc );_gfeg .Set (_ecbec ,_bdfcc ,_gggf );_faca =_gfeg .GrayAt (_ecbec ,_bdfcc );
|
|
_gfeg .SetGray (_ecbec ,_bdfcc ,_e .Gray {Y :_eeege (_faca .Y ,_cdcbg )});};};return _gfeg ;};func ColorAtNRGBA64 (x ,y ,width int ,data ,alpha []byte ,decode []float64 )(_e .NRGBA64 ,error ){_gcaa :=(y *width +x )*2;_fcda :=_gcaa *3;if _fcda +5>=len (data ){return _e .NRGBA64 {},_f .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 _bfcb =0xffff;_ecac :=uint16 (_bfcb );if alpha !=nil &&len (alpha )> _gcaa +1{_ecac =uint16 (alpha [_gcaa ])<<8|uint16 (alpha [_gcaa +1]);};_fabd :=uint16 (data [_fcda ])<<8|uint16 (data [_fcda +1]);_fcf :=uint16 (data [_fcda +2])<<8|uint16 (data [_fcda +3]);
|
|
_bagaa :=uint16 (data [_fcda +4])<<8|uint16 (data [_fcda +5]);if len (decode )==6{_fabd =uint16 (uint64 (LinearInterpolate (float64 (_fabd ),0,65535,decode [0],decode [1]))&_bfcb );_fcf =uint16 (uint64 (LinearInterpolate (float64 (_fcf ),0,65535,decode [2],decode [3]))&_bfcb );
|
|
_bagaa =uint16 (uint64 (LinearInterpolate (float64 (_bagaa ),0,65535,decode [4],decode [5]))&_bfcb );};return _e .NRGBA64 {R :_fabd ,G :_fcf ,B :_bagaa ,A :_ecac },nil ;};func _gdcd (_bgc _e .NYCbCrA )_e .RGBA {_fac ,_ddgb ,_fagf ,_bcdc :=_fbbg (_bgc ).RGBA ();
|
|
return _e .RGBA {R :uint8 (_fac >>8),G :uint8 (_ddgb >>8),B :uint8 (_fagf >>8),A :uint8 (_bcdc >>8)};};func _cfeab (_bdcd *_ce .Gray16 ,_dacb uint8 )*_ce .Gray {_aacc :=_bdcd .Bounds ();_cddb :=_ce .NewGray (_aacc );for _aecba :=0;_aecba < _aacc .Dx ();
|
|
_aecba ++{for _fdgb :=0;_fdgb < _aacc .Dy ();_fdgb ++{_eabg :=_bdcd .Gray16At (_aecba ,_fdgb );_cddb .SetGray (_aecba ,_fdgb ,_e .Gray {Y :_eeege (uint8 (_eabg .Y /256),_dacb )});};};return _cddb ;};func (_ddac *Gray2 )Validate ()error {if len (_ddac .Data )!=_ddac .Height *_ddac .BytesPerLine {return ErrInvalidImage ;
|
|
};return nil ;};func (_edce *Monochrome )ScaleLow (width ,height int )(*Monochrome ,error ){if width < 0||height < 0{return nil ,_c .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");
|
|
};_caed :=_eda (width ,height );_faac :=make ([]int ,height );_eaaf :=make ([]int ,width );_afg :=float64 (_edce .Width )/float64 (width );_afff :=float64 (_edce .Height )/float64 (height );for _dgg :=0;_dgg < height ;_dgg ++{_faac [_dgg ]=int (_cg .Min (_afff *float64 (_dgg )+0.5,float64 (_edce .Height -1)));
|
|
};for _faf :=0;_faf < width ;_faf ++{_eaaf [_faf ]=int (_cg .Min (_afg *float64 (_faf )+0.5,float64 (_edce .Width -1)));};_ffcac :=-1;_bff :=byte (0);for _bbf :=0;_bbf < height ;_bbf ++{_ggaa :=_faac [_bbf ]*_edce .BytesPerLine ;_cda :=_bbf *_caed .BytesPerLine ;
|
|
for _ccc :=0;_ccc < width ;_ccc ++{_ccb :=_eaaf [_ccc ];if _ccb !=_ffcac {_bff =_edce .getBit (_ggaa ,_ccb );if _bff !=0{_caed .setBit (_cda ,_ccc );};_ffcac =_ccb ;}else {if _bff !=0{_caed .setBit (_cda ,_ccc );};};};};return _caed ,nil ;};var _ Image =&Monochrome {};
|
|
func _egbb (_adceb []byte ,_faff Image )error {_acdga :=true ;for _feaa :=0;_feaa < len (_adceb );_feaa ++{if _adceb [_feaa ]!=0xff{_acdga =false ;break ;};};if _acdga {switch _efdf :=_faff .(type ){case *NRGBA32 :_efdf .Alpha =nil ;case *NRGBA64 :_efdf .Alpha =nil ;
|
|
default:return _f .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",_faff );
|
|
};};return nil ;};func _adgb (_bgcca *Monochrome ,_gfgd ,_ecda int ,_geac ,_dccbg int ,_fcgb RasterOperator ){var (_ccff int ;_gdbg byte ;_bafd ,_cdcc int ;_cedag int ;);_cedae :=_geac >>3;_bfgcf :=_geac &7;if _bfgcf > 0{_gdbg =_eeacb [_bfgcf ];};_ccff =_bgcca .BytesPerLine *_ecda +(_gfgd >>3);
|
|
switch _fcgb {case PixClr :for _bafd =0;_bafd < _dccbg ;_bafd ++{_cedag =_ccff +_bafd *_bgcca .BytesPerLine ;for _cdcc =0;_cdcc < _cedae ;_cdcc ++{_bgcca .Data [_cedag ]=0x0;_cedag ++;};if _bfgcf > 0{_bgcca .Data [_cedag ]=_ffab (_bgcca .Data [_cedag ],0x0,_gdbg );
|
|
};};case PixSet :for _bafd =0;_bafd < _dccbg ;_bafd ++{_cedag =_ccff +_bafd *_bgcca .BytesPerLine ;for _cdcc =0;_cdcc < _cedae ;_cdcc ++{_bgcca .Data [_cedag ]=0xff;_cedag ++;};if _bfgcf > 0{_bgcca .Data [_cedag ]=_ffab (_bgcca .Data [_cedag ],0xff,_gdbg );
|
|
};};case PixNotDst :for _bafd =0;_bafd < _dccbg ;_bafd ++{_cedag =_ccff +_bafd *_bgcca .BytesPerLine ;for _cdcc =0;_cdcc < _cedae ;_cdcc ++{_bgcca .Data [_cedag ]=^_bgcca .Data [_cedag ];_cedag ++;};if _bfgcf > 0{_bgcca .Data [_cedag ]=_ffab (_bgcca .Data [_cedag ],^_bgcca .Data [_cedag ],_gdbg );
|
|
};};};};func ColorAtNRGBA (x ,y ,width ,bytesPerLine ,bitsPerColor int ,data ,alpha []byte ,decode []float64 )(_e .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 ,_f .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 (_beab *Gray2 )Bounds ()_ce .Rectangle {return _ce .Rectangle {Max :_ce .Point {X :_beab .Width ,Y :_beab .Height }};};func MonochromeThresholdConverter (threshold uint8 )ColorConverter {return &monochromeThresholdConverter {Threshold :threshold };
|
|
};var _ RGBA =&RGBA32 {};func _bfaf (_edfg _e .NRGBA )_e .RGBA {_cec ,_ccg ,_gegc ,_abbf :=_edfg .RGBA ();return _e .RGBA {R :uint8 (_cec >>8),G :uint8 (_ccg >>8),B :uint8 (_gegc >>8),A :uint8 (_abbf >>8)};};func _eaefg (_eceb _e .NRGBA64 )_e .NRGBA {return _e .NRGBA {R :uint8 (_eceb .R >>8),G :uint8 (_eceb .G >>8),B :uint8 (_eceb .B >>8),A :uint8 (_eceb .A >>8)};
|
|
};func (_cefea *NRGBA32 )SetNRGBA (x ,y int ,c _e .NRGBA ){_adec :=y *_cefea .Width +x ;_bcbb :=3*_adec ;if _bcbb +2>=len (_cefea .Data ){return ;};_cefea .setRGBA (_adec ,c );};func _fgde (_dfbf int ,_ebfa int )error {return _f .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",_dfbf ,_ebfa );
|
|
}; |