void Render() { if (resized) { Resize(); resized = false; } d2dDeviceContext.BeginDraw(); d2dDeviceContext.Clear(Color4.White); d2dDeviceContext.PushAxisAlignedClip(new RectangleF(5, 5, Child.Width - 10, Child.Height - 10), AntialiasMode.Aliased); d2dDeviceContext.Transform = Matrix3x2.Translation(Child.Width / 2f / Scale + Translation.X, Child.Height / 2f / Scale + Translation.Y) * Matrix3x2.Scaling(Scale); d2dDeviceContext.AntialiasMode = AntialiasMode.Aliased; d2dDeviceContext.DrawLine(new Vector2(0, int.MinValue), new Vector2(0, int.MaxValue), RasterDrawBrush, 1 / Scale); d2dDeviceContext.DrawLine(new Vector2(int.MinValue, 0), new Vector2(int.MaxValue, 0), RasterDrawBrush, 1 / Scale); d2dDeviceContext.AntialiasMode = AntialiasMode.PerPrimitive; RenderGeometry(); d2dDeviceContext.Transform = Matrix3x2.Identity; d2dDeviceContext.PopAxisAlignedClip(); d2dDeviceContext.EndDraw(); swapChain.Present(0, PresentFlags.None); }
public void BeginDraw(Windows.Foundation.Rect updateRect) { // Express target area as a native RECT type. var updateRectNative = new Rectangle { Left = (int)updateRect.Left, Top = (int)updateRect.Top, Right = (int)updateRect.Right, Bottom = (int)updateRect.Bottom }; // Query for ISurfaceImageSourceNative interface. using (var sisNative = ComObject.QueryInterface <ISurfaceImageSourceNative>(this)) { // Begin drawing - returns a target surface and an offset to use as the top left origin when drawing. try { RawPoint offset; using (var surface = sisNative.BeginDraw(updateRectNative, out offset)) { // Create render target. using (var bitmap = new Bitmap1(d2dContext, surface)) { // Set context's render target. d2dContext.Target = bitmap; } // Begin drawing using D2D context. d2dContext.BeginDraw(); // Apply a clip and transform to constrain updates to the target update area. // This is required to ensure coordinates within the target surface remain // consistent by taking into account the offset returned by BeginDraw, and // can also improve performance by optimizing the area that is drawn by D2D. // Apps should always account for the offset output parameter returned by // BeginDraw, since it may not match the passed updateRect input parameter's location. d2dContext.PushAxisAlignedClip( new RectangleF( (offset.X), (offset.Y), (offset.X + (float)updateRect.Width), (offset.Y + (float)updateRect.Height) ), AntialiasMode.Aliased ); d2dContext.Transform = Matrix3x2.Translation(offset.X, offset.Y); } } catch (SharpDXException ex) { if (ex.ResultCode == SharpDX.DXGI.ResultCode.DeviceRemoved || ex.ResultCode == SharpDX.DXGI.ResultCode.DeviceReset) { // If the device has been removed or reset, attempt to recreate it and continue drawing. CreateDeviceResources(); BeginDraw(updateRect); } else { throw; } } } }