示例#1
0
        public void Render()
        {
            // Note: there ought to be a more efficient way to do this, as this is
            // critical. However, after much searching, the only way I found to
            // convert a Wic bitmap to a BitmapImage was by serializing to/from
            // a memory stream.

            if (!isRendering &&
                GraphicsHandler != null &&
                GraphicsHandler.Control != null)
            {
                isRendering = true;
                GraphicsHandler.BeginDrawing();
                Callback.OnPaint(Widget, new PaintEventArgs(graphics, Widget.Bounds));                 // renders into the bitmap
                GraphicsHandler.EndDrawing();
                var bitmap = GraphicsHandler.Image;
                if (bitmap != null)
                {
                    var bitmapHandler   = bitmap.Handler as BitmapHandler;
                    var bitmapObject    = bitmapHandler.Control;
                    var size            = bitmapObject.Size;
                    var writeableBitmap = new WriteableBitmap(size.Width, size.Height);

                    // Get a pointer to the bitmap pixels
                    unsafe
                    {
                        byte *ptr = null;
                        ((IBufferByteAccess)writeableBitmap.PixelBuffer).Buffer(out ptr);
                        var len    = size.Width * size.Height;
                        var pixels = new SharpDX.ColorBGRA[len];
                        fixed(SharpDX.ColorBGRA *pixelsPtr = &pixels[0])
                        {
                            bitmapObject.CopyPixels(pixels);
                            CopyMemory((IntPtr)ptr, (IntPtr)pixelsPtr, (uint)len * 4);
                        }
                    }
                    Control.Source = writeableBitmap;
                }
                isRendering = false;
            }
        }