@@ -49,10 +49,9 @@ macro_rules! ycbcr_image_avx2 {
4949 }
5050
5151 let [ y_buffer, cb_buffer, cr_buffer, _] = buffers;
52- // if spare capacity is less than self.width(), slicing will fail here
53- let mut y_buffer = & mut y_buffer. spare_capacity_mut( ) [ ..self . width( ) as usize ] ;
54- let mut cb_buffer = & mut cb_buffer. spare_capacity_mut( ) [ ..self . width( ) as usize ] ;
55- let mut cr_buffer = & mut cr_buffer. spare_capacity_mut( ) [ ..self . width( ) as usize ] ;
52+ y_buffer. reserve( self . width( ) as usize ) ;
53+ cb_buffer. reserve( self . width( ) as usize ) ;
54+ cr_buffer. reserve( self . width( ) as usize ) ;
5655
5756 let ymulr = _mm256_set1_epi32( 19595 ) ;
5857 let ymulg = _mm256_set1_epi32( 38470 ) ;
@@ -85,11 +84,7 @@ macro_rules! ycbcr_image_avx2 {
8584 let y: [ i32 ; 8 ] = avx_as_i32_array( y) ;
8685 let mut y: [ u8 ; 8 ] = y. map( |x| x as u8 ) ;
8786 y. reverse( ) ;
88-
89- for ( in_byte, out_byte) in y. iter( ) . copied( ) . zip( y_buffer[ ..8 ] . iter_mut( ) ) {
90- out_byte. write( in_byte) ;
91- }
92- y_buffer = & mut y_buffer[ 8 ..] ;
87+ y_buffer. extend_from_slice( & y) ;
9388
9489 let cbr = _mm256_mullo_epi32( cbmulr, r) ;
9590 let cbg = _mm256_mullo_epi32( cbmulg, g) ;
@@ -102,11 +97,7 @@ macro_rules! ycbcr_image_avx2 {
10297 let cb: [ i32 ; 8 ] = avx_as_i32_array( cb) ;
10398 let mut cb: [ u8 ; 8 ] = cb. map( |x| x as u8 ) ;
10499 cb. reverse( ) ;
105-
106- for ( in_byte, out_byte) in cb. iter( ) . copied( ) . zip( cb_buffer[ ..8 ] . iter_mut( ) ) {
107- out_byte. write( in_byte) ;
108- }
109- cb_buffer = & mut cb_buffer[ 8 ..] ;
100+ cb_buffer. extend_from_slice( & cb) ;
110101
111102 let crr = _mm256_mullo_epi32( crmulr, r) ;
112103 let crg = _mm256_mullo_epi32( crmulg, g) ;
@@ -119,38 +110,16 @@ macro_rules! ycbcr_image_avx2 {
119110 let cr: [ i32 ; 8 ] = avx_as_i32_array( cr) ;
120111 let mut cr: [ u8 ; 8 ] = cr. map( |x| x as u8 ) ;
121112 cr. reverse( ) ;
122-
123- for ( in_byte, out_byte) in cr. iter( ) . copied( ) . zip( cr_buffer[ ..8 ] . iter_mut( ) ) {
124- out_byte. write( in_byte) ;
125- }
126- cr_buffer = & mut cr_buffer[ 8 ..] ;
113+ cr_buffer. extend_from_slice( & cr) ;
127114 }
128115
129116 for _ in 0 ..self . width( ) % 8 {
130117 let ( y, cb, cr) = rgb_to_ycbcr( data[ $o1] , data[ $o2] , data[ $o3] ) ;
131-
132118 data = & data[ $num_colors..] ;
133119
134- y_buffer[ 0 ] . write( y) ;
135- y_buffer = & mut y_buffer[ 1 ..] ;
136-
137- cb_buffer[ 0 ] . write( cb) ;
138- cb_buffer = & mut cb_buffer[ 1 ..] ;
139-
140- cr_buffer[ 0 ] . write( cr) ;
141- cr_buffer = & mut cr_buffer[ 1 ..] ;
142- }
143-
144- // SAFETY: We know the buffers are long enough,
145- // otherwise `buffer.spare_capacity_mut()[..self.width()]` above would panic,
146- // and we've just filled these with data.
147- //
148- // We do this at the end so that if the above code panics, and the panic is caught,
149- // the vectors will not have their length inflated yet and uninit memory will not be exposed
150- unsafe {
151- buffers[ 0 ] . set_len( buffers[ 0 ] . len( ) + self . width( ) as usize ) ;
152- buffers[ 1 ] . set_len( buffers[ 1 ] . len( ) + self . width( ) as usize ) ;
153- buffers[ 2 ] . set_len( buffers[ 2 ] . len( ) + self . width( ) as usize ) ;
120+ y_buffer. push( y) ;
121+ cb_buffer. push( cb) ;
122+ cr_buffer. push( cr) ;
154123 }
155124 }
156125 }
0 commit comments