Line data Source code
1 : /** 2 : * \file OutPointerFilter.hxx 3 : */ 4 : 5 : #include "OutPointerFilter.h" 6 : 7 : #include <cstring> 8 : 9 : namespace ATK 10 : { 11 : template<typename DataType> 12 96 : OutPointerFilter<DataType>::OutPointerFilter(DataType* array, int channels, gsl::index size, bool interleaved) 13 96 : :TypedBaseFilter<DataType>(static_cast<int>(interleaved?size:channels), 0), array(array), mysize(interleaved?channels:size), channels(static_cast<int>(interleaved?size:channels)), interleaved(interleaved) 14 : { 15 96 : } 16 : 17 : template<typename DataType> 18 9 : void OutPointerFilter<DataType>::set_pointer(DataType* array, gsl::index size) 19 : { 20 9 : this->array = array; 21 9 : mysize = size; 22 9 : offset = 0; 23 9 : } 24 : 25 : template<typename DataType> 26 175 : void OutPointerFilter<DataType>::process_impl(gsl::index size) const 27 : { 28 175 : if(!interleaved) 29 : { 30 173 : auto i = std::min(size, mysize - offset); 31 173 : if (mysize < offset) 32 : { 33 2 : i = 0; 34 : } 35 350 : for(gsl::index j = 0; j < channels; ++j) 36 : { 37 177 : memcpy(reinterpret_cast<void*>(&array[offset + (j * mysize)]), reinterpret_cast<const void*>(converted_inputs[j]), static_cast<size_t>(i) * sizeof(DataType)); 38 : } 39 : } 40 : else 41 : { 42 12 : for(gsl::index i = 0; i < size && (i + offset < mysize); ++i) 43 : { 44 30 : for(gsl::index j = 0; j < channels; ++j) 45 : { 46 20 : array[channels * offset + (j + i * channels)] = converted_inputs[j][i]; 47 : } 48 : } 49 : } 50 : 51 175 : offset += size; 52 175 : } 53 : }