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( );
}
}
}