AForge.Video.Kinect.KinectDepthCamera.HandleDataReceived C# (CSharp) Method

HandleDataReceived() private method

private HandleDataReceived ( IntPtr device, IntPtr depthData, UInt32 timestamp ) : void
device System.IntPtr
depthData System.IntPtr
timestamp System.UInt32
return void
        private void HandleDataReceived( IntPtr device, IntPtr depthData, UInt32 timestamp )
        {
            int width  = depthModeInfo.Width;
            int height = depthModeInfo.Height;

            Bitmap image = null;
            BitmapData data = null;

            try
            {
                image = new Bitmap( width, height, ( !provideOriginalDepthImage ) ?
                    PixelFormat.Format24bppRgb : PixelFormat.Format16bppGrayScale );

                data = image.LockBits( new Rectangle( 0, 0, width, height ),
                    ImageLockMode.ReadWrite, image.PixelFormat );

                unsafe
                {
                    ushort* src = (ushort*) imageBuffer.ToPointer( );

                    if ( !provideOriginalDepthImage )
                    {
                        // color the depth image into white->red->yellow->green->cyan->blue->black gradient
                        byte* dst = (byte*) data.Scan0.ToPointer( );
                        int offset = data.Stride - width * 3;
                        byte red, green, blue;

                        for ( int y = 0; y < height; y++ )
                        {
                            for ( int x = 0; x < width; x++, src++, dst += 3 )
                            {
                                ushort pval = gamma[*src];
                                ushort lb 	= (ushort) ( pval & 0xff );

                                switch ( pval >> 8 )
                                {
                                    case 0: // white to red
                                        red = 255;
                                        green = (byte) ( 255 - lb );
                                        blue = (byte) ( 255 - lb );
                                        break;
                                    case 1: // red to yellow
                                        red = 255;
                                        green = (byte) lb;
                                        blue = 0;
                                        break;
                                    case 2: // yellow to green
                                        red = (byte) ( 255 - lb );
                                        green = 255;
                                        blue = 0;
                                        break;
                                    case 3: // green to cyan
                                        red = 0;
                                        green = 255;
                                        blue = (byte) lb;
                                        break;
                                    case 4: // cyan to blue
                                        red = 0;
                                        green = (byte) ( 255 - lb );
                                        blue = 255;
                                        break;
                                    case 5: // blue to black
                                        red = 0;
                                        green = 0;
                                        blue = (byte) ( 255 - lb );
                                        break;
                                    default:
                                        red = green = blue = 0;
                                        break;
                                }

                                dst[2] = red;
                                dst[1] = green;
                                dst[0] = blue;
                            }
                            dst += offset;
                        }
                    }
                    else
                    {
                        // copy original depth image
                        ushort* dst = (ushort*) data.Scan0.ToPointer( );
                        int offset = ( data.Stride >> 1 ) - width;

                        if ( offset == 0 )
                        {
                            SystemTools.CopyUnmanagedMemory( (byte*) dst, (byte*) src, height * width * 2 );
                        }
                        else
                        {
                            for ( int y = 0; y < height; y++ )
                            {
                                SystemTools.CopyUnmanagedMemory( (byte*) dst, (byte*) src, width * 2 );

                                dst += width;
                                src += width;
                                dst += offset;
                            }
                        }
                    }
                }

                image.UnlockBits( data );
                framesReceived++;
                bytesReceived += (int) depthModeInfo.Bytes;
            }
            catch ( Exception ex )
            {
                if ( VideoSourceError != null )
                {
                    VideoSourceError( this, new VideoSourceErrorEventArgs( ex.Message ) );
                }

                if ( image != null )
                {
                    if ( data != null )
                    {
                        image.UnlockBits( data );
                    }
                    image.Dispose( );
                    image = null;
                }
            }

            if ( image != null )
            {
                if ( NewFrame != null )
                {
                    NewFrame( this, new NewFrameEventArgs( image ) );
                }
                image.Dispose( );
            }
        }
    }