/// <summary> /// This is the standard RenderMessageHandler callback, posted via PostRender() /// and Resize(). This wraps RenderMessageHandlerCore and emits an ETW events /// to trace its execution. /// </summary> internal object RenderMessageHandler(object arg) { try { _isRendering = true; //_screen.Clear(); if (_invokeOnRenderCallbacks != null) { int callbackLoopCount = 0; int count = _invokeOnRenderCallbacks.Count; while (count > 0) { callbackLoopCount++; if (callbackLoopCount > 153) { throw new InvalidOperationException("infinite loop"); } InvokeOnRenderCallback[] callbacks; lock (_invokeOnRenderCallbacks) { count = _invokeOnRenderCallbacks.Count; callbacks = new InvokeOnRenderCallback[count]; _invokeOnRenderCallbacks.CopyTo(callbacks); _invokeOnRenderCallbacks.Clear(); } for (int i = 0; i < count; i++) { callbacks[i].DoWork(); } count = _invokeOnRenderCallbacks.Count; } } DrawingContext dc = new DrawingContext(_screen); /* The dirty rectange MUST be read after the InvokeOnRender callbacks are * complete, as they can trigger layout changes or invalidate controls * which are expected to be redrawn. */ int x = _dirtyX0; int y = _dirtyY0; int w = _dirtyX1 - _dirtyX0; int h = _dirtyY1 - _dirtyY0; _dirtyX0 = _screenW; _dirtyY0 = _screenH; _dirtyX1 = _dirtyY1 = 0; try { if (w > 0 && h > 0) { // // This is the big Render! // // We've now updated layout and the updated scene will be // rendered. dc.PushClippingRectangle(x, y, w, h); _target.RenderRecursive(dc); dc.PopClippingRectangle(); } } finally { dc.Close(); if (w > 0 && h > 0) { _screen.Flush(x, y, w, h); } } } finally { _currentRenderOp = null; _isRendering = false; } return null; }
/// <summary> /// This is the standard RenderMessageHandler callback, posted via PostRender() /// and Resize(). This wraps RenderMessageHandlerCore and emits an ETW events /// to trace its execution. /// </summary> internal object RenderMessageHandler(object arg) { try { _isRendering = true; //_screen.Clear(); if (_invokeOnRenderCallbacks != null) { int callbackLoopCount = 0; int count = _invokeOnRenderCallbacks.Count; while (count > 0) { callbackLoopCount++; if (callbackLoopCount > 153) { throw new InvalidOperationException("infinite loop"); } InvokeOnRenderCallback[] callbacks; lock (_invokeOnRenderCallbacks) { count = _invokeOnRenderCallbacks.Count; callbacks = new InvokeOnRenderCallback[count]; _invokeOnRenderCallbacks.CopyTo(callbacks); _invokeOnRenderCallbacks.Clear(); } for (int i = 0; i < count; i++) { callbacks[i].DoWork(); } count = _invokeOnRenderCallbacks.Count; } } DrawingContext dc = new DrawingContext(_screen); /* The dirty rectange MUST be read after the InvokeOnRender callbacks are * complete, as they can trigger layout changes or invalidate controls * which are expected to be redrawn. */ int x = _dirtyX0; int y = _dirtyY0; int w = _dirtyX1 - _dirtyX0; int h = _dirtyY1 - _dirtyY0; _dirtyX0 = _screenW; _dirtyY0 = _screenH; _dirtyX1 = _dirtyY1 = 0; try { if (w > 0 && h > 0) { // // This is the big Render! // // We've now updated layout and the updated scene will be // rendered. dc.PushClippingRectangle(x, y, w, h); _target.RenderRecursive(dc); dc.PopClippingRectangle(); } } finally { dc.Close(); if (w > 0 && h > 0) { _screen.Flush(x, y, w, h); } } } finally { _currentRenderOp = null; _isRendering = false; } return(null); }