diff --git a/src/proc/rotation-filter.cpp b/src/proc/rotation-filter.cpp index ead0e5d068..cb9e1976d2 100644 --- a/src/proc/rotation-filter.cpp +++ b/src/proc/rotation-filter.cpp @@ -100,16 +100,16 @@ namespace librealsense { case 1: { rotate_frame< 1 >( static_cast< uint8_t * >( const_cast< void * >( tgt.get_data() ) ), static_cast< const uint8_t * >( src.get_data() ), - src.get_height(), - src.get_width() ); + src.get_width(), + src.get_height() ); break; } case 2: { rotate_frame< 2 >( static_cast< uint8_t * >( const_cast< void * >( tgt.get_data() ) ), static_cast< const uint8_t * >( src.get_data() ) , - src.get_height(), - src.get_width() ); + src.get_width(), + src.get_height()); break; } @@ -181,39 +181,41 @@ namespace librealsense { } template< size_t SIZE > - void rotation_filter::rotate_frame( uint8_t * const out, const uint8_t * source, int height, int width ) + void rotation_filter::rotate_frame( uint8_t * const out, const uint8_t * source, int width, int height ) { if( _value != 90 && _value != -90 && _value != 180 ) { throw std::invalid_argument( "Invalid rotation angle. Only 90, -90, and 180 degrees are supported." ); } - int width_in = ( _value == 90 || _value == -90 ) ? height : width; //else rotation angle is 180 - int height_in = ( _value == 90 || _value == -90 ) ? width : height; //else rotation angle is 180 + // Define output dimensions + int width_out = ( _value == 180 ) ? width : height; + int height_out = ( _value == 180 ) ? height : width; - int width_out = ( _value == 90 || _value == -90 ) ? _rotated_width : _rotated_height; //else rotation angle is 180 - int height_out = ( _value == 90 || _value == -90 ) ? _rotated_height : _rotated_width; //else rotation angle is 180 - - for( int i = 0; i < width_in; ++i ) + // Perform rotation + for( int i = 0; i < height; ++i ) { - for( int j = 0; j < height_in; ++j ) + for( int j = 0; j < width; ++j ) { - size_t src_index = ( i * height_in + j ) * SIZE; - size_t out_index; + // Calculate source index + size_t src_index = ( i * width + j ) * SIZE; + // Determine output index based on rotation angle + size_t out_index; if( _value == 90 ) { - out_index = ( j * width_out + ( width_out - i - 1 ) ) * SIZE; + out_index = ( j * height + ( height - i - 1 ) ) * SIZE; } else if( _value == -90 ) { - out_index = ( ( height_out - j - 1 ) * width_out + i ) * SIZE; + out_index = ( ( width - j - 1 ) * height + i ) * SIZE; } - else - { // 180 degrees - out_index = ( ( height_out - i - 1 ) * width_out + ( width_out - j - 1 ) ) * SIZE; + else // 180 degrees + { + out_index = ( ( height - i - 1 ) * width + ( width - j - 1 ) ) * SIZE; } + // Copy pixel data from source to destination std::memcpy( &out[out_index], &source[src_index], SIZE ); } } diff --git a/src/proc/rotation-filter.h b/src/proc/rotation-filter.h index 31bf65c99d..f5a542e21d 100644 --- a/src/proc/rotation-filter.h +++ b/src/proc/rotation-filter.h @@ -19,7 +19,7 @@ namespace librealsense rs2::frame prepare_target_frame(const rs2::frame& f, const rs2::frame_source& source, rs2_extension tgt_type); template< size_t SIZE > - void rotate_frame( uint8_t * const out, const uint8_t * source, int height, int width ); + void rotate_frame( uint8_t * const out, const uint8_t * source, int width, int height ); rs2::frame process_frame(const rs2::frame_source& source, const rs2::frame& f) override;