static void VNGThreaded( Image& target, const GenericImage<P>& source, const DebayerInstance& instance ) { int target_w = source.Width(); int target_h = source.Height(); target.AllocateData( target_w, target_h, 3, ColorSpace::RGB ); target.Status().Initialize( "VNG debayering", target_h-4 ); int numberOfThreads = Thread::NumberOfThreads( target_h-4, 1 ); int rowsPerThread = (target_h - 4)/numberOfThreads; AbstractImage::ThreadData data( target, target_h-4 ); ReferenceArray<VNGThread<P> > threads; for ( int i = 0, j = 1; i < numberOfThreads; ++i, ++j ) threads.Add( new VNGThread<P>( data, target, source, instance, i*rowsPerThread + 2, (j < numberOfThreads) ? j*rowsPerThread + 2 : target_h-2 ) ); AbstractImage::RunThreads( threads, data ); threads.Destroy(); // copy top and bottom two rows from the adjecent ones for ( int col = 0; col < target_w; col++ ) for ( int i = 0; i < 3; i++ ) { target.Pixel( col, 0, i ) = target.Pixel( col, 1, i ) = target.Pixel( col, 2, i ); target.Pixel( col, target_h-1, i ) = target.Pixel( col, target_h-2, i ) = target.Pixel( col, target_h-3, i ); } target.Status() = data.status; }
static void SuperPixelThreaded( Image& target, const GenericImage<P>& source, const DebayerInstance& instance ) { int target_w = source.Width() >> 1; int target_h = source.Height() >> 1; target.AllocateData( target_w, target_h, 3, ColorSpace::RGB ); target.Status().Initialize( "SuperPixel debayering", target_h ); int numberOfThreads = Thread::NumberOfThreads( target_h, 1 ); int rowsPerThread = target_h/numberOfThreads; AbstractImage::ThreadData data( target, target_h ); ReferenceArray<SuperPixelThread<P> > threads; for ( int i = 0, j = 1; i < numberOfThreads; ++i, ++j ) threads.Add( new SuperPixelThread<P>( data, target, source, instance, i*rowsPerThread, (j < numberOfThreads) ? j*rowsPerThread : target_h ) ); AbstractImage::RunThreads( threads, data ); threads.Destroy(); target.Status() = data.status; }