@@ -41,9 +41,9 @@ enum DiffuseDirection {
4141 Forward ,
4242 Backward ,
4343}
44- fn diffuse < T : Copy > ( im : & Vec < T > , enc_map : & Vec < f64 > , direction : DiffuseDirection ) -> Vec < T >
44+ fn diffuse < T : Copy > ( im : & Vec < T > , enc_map : & Vec < f64 > , direction : DiffuseDirection , chunk_size : usize ) -> Vec < T >
4545{
46- let enc_map = enc_map
46+ let enc_map = enc_map[ ..im . len ( ) /chunk_size ]
4747 . iter ( )
4848 . map ( |& x| x. to_bits ( ) )
4949 . collect ( ) ;
@@ -55,16 +55,22 @@ fn diffuse<T: Copy>(im: &Vec<T>, enc_map: &Vec<f64>, direction: DiffuseDirection
5555 match direction {
5656 DiffuseDirection :: Forward => {
5757 for & index in & indices {
58- diffuse_pixels. push ( im[ index] ) ;
58+ for i in 0 ..chunk_size {
59+ let index = index * chunk_size + i;
60+ diffuse_pixels. push ( im[ index] ) ;
61+ }
5962 }
6063 } ,
6164 DiffuseDirection :: Backward => {
62- let mut lookup: Vec < usize > = vec ! [ 0 ; im. len( ) ] ;
65+ let mut lookup: Vec < usize > = vec ! [ 0 ; im. len( ) / chunk_size ] ;
6366 for ( i, & index) in indices. iter ( ) . enumerate ( ) {
6467 lookup[ index] = i;
6568 }
6669 for & index in & lookup {
67- diffuse_pixels. push ( im[ index] ) ;
70+ for i in 0 ..chunk_size {
71+ let index = index * chunk_size + i;
72+ diffuse_pixels. push ( im[ index] ) ;
73+ }
6874 }
6975 } ,
7076 }
@@ -73,24 +79,25 @@ fn diffuse<T: Copy>(im: &Vec<T>, enc_map: &Vec<f64>, direction: DiffuseDirection
7379 diffuse_pixels
7480}
7581
76- pub fn encode ( im : & Vec < u8 > , x0 : f64 ) -> Vec < u8 > {
82+ // C: channel size, e.g. 3 for RGB
83+ pub fn encode < const C : usize > ( im : & Vec < u8 > , x0 : f64 ) -> Vec < u8 > {
7784 let enc_map = generate_map ( LogisticMapOptions {
7885 x : x0,
7986 r : R ,
8087 size : im. len ( ) ,
8188 } ) ;
8289
83- let im = diffuse ( & im, & enc_map, DiffuseDirection :: Forward ) ;
90+ let im = diffuse ( & im, & enc_map, DiffuseDirection :: Forward , C ) ;
8491 confuse_xor ( & im, & enc_map)
8592}
8693
87- pub fn decode ( im : & Vec < u8 > , x0 : f64 ) -> Vec < u8 > {
94+ pub fn decode < const C : usize > ( im : & Vec < u8 > , x0 : f64 ) -> Vec < u8 > {
8895 let enc_map = generate_map ( LogisticMapOptions {
8996 x : x0,
9097 r : R ,
9198 size : im. len ( ) ,
9299 } ) ;
93100
94101 let im = confuse_xor ( & im, & enc_map) ;
95- diffuse ( & im, & enc_map, DiffuseDirection :: Backward )
102+ diffuse ( & im, & enc_map, DiffuseDirection :: Backward , C )
96103}
0 commit comments