protected override void RenderNewStrokeSegment() { ProcessorResult <List <float> > result; lock (mInkBuilderLock) { if (mInkBuilder.HasNewPoints) { result = mInkBuilder.GetPath(); } else { return; } } uint channelMask = (uint)mInkBuilder.SplineInterpolator.InterpolatedSplineLayout.ChannelMask; mAddedInterpolatedSpline.Assign(result.Addition, channelMask); mPredictedInterpolatedSpline.Assign(result.Prediction, channelMask); ParticleBrush brush = mInkBuilder.Brush; // Draw the added stroke mRenderingContext.SetTarget(mCurrentStrokeLayer); mDrawStrokeResult = mRenderingContext.DrawParticleStroke(mAddedInterpolatedSpline, mStrokeConstants, brush, Ink.Rendering.BlendMode.SourceOver, mDrawStrokeResult.RandomGeneratorSeed); // Measure the predicted stroke Rect predictedStrokeRect = mRenderingContext.MeasureParticleStrokeBounds(mPredictedInterpolatedSpline, mStrokeConstants, brush.Scattering); // Calculate the update rect for this frame Rect updateRect = mDirtyRectManager.GetUpdateRect(mDrawStrokeResult.DirtyRect, predictedStrokeRect); // Draw the predicted stroke mRenderingContext.SetTarget(mPrelimPathLayer); mRenderingContext.DrawLayerAtPoint(mCurrentStrokeLayer, updateRect, new Point(updateRect.X, updateRect.Y), Ink.Rendering.BlendMode.Copy); mRenderingContext.DrawParticleStroke(mPredictedInterpolatedSpline, mStrokeConstants, brush, Ink.Rendering.BlendMode.SourceOver, mDrawStrokeResult.RandomGeneratorSeed); // Reconstruct the scene under the current stroke (only within the updated rect) mRenderingContext.SetTarget(mSceneLayer, updateRect); mRenderingContext.ClearColor(BackgroundColor); mRenderingContext.DrawLayerAtPoint(mAllStrokesLayer, updateRect, new Point(updateRect.X, updateRect.Y), Ink.Rendering.BlendMode.SourceOver); // Blend the current stroke on top (only within the updated rect) mRenderingContext.DrawLayerAtPoint(mPrelimPathLayer, updateRect, new Point(updateRect.X, updateRect.Y), Ink.Rendering.BlendMode.SourceOver); }
/// <summary> /// Handles brush-specific parts of drawing a new stroke segment /// </summary> /// <param name="updateRect">returns bounding rectangle of area requiring update</param> public override void DoRenderNewStrokeSegment(out Rect updateRect) { var result = mActiveTool.Path; uint channelMask = (uint)RasterInkBuilder.SplineInterpolator.InterpolatedSplineLayout.ChannelMask; mAddedInterpolatedSpline.Assign(result.Addition, channelMask); mPredictedInterpolatedSpline.Assign(result.Prediction, channelMask); // Draw the added stroke mRenderer.RenderingContext.SetTarget(mRenderer.CurrentStrokeLayer); mDrawStrokeResult = mRenderer.RenderingContext.DrawParticleStroke(mAddedInterpolatedSpline, mStrokeConstants, mActiveTool.Brush, Ink.Rendering.BlendMode.SourceOver, mDrawStrokeResult.RandomGeneratorSeed); // Measure the predicted stroke Rect predictedStrokeRect = mRenderer.RenderingContext.MeasureParticleStrokeBounds(mPredictedInterpolatedSpline, mStrokeConstants, mActiveTool.Brush.Scattering); // Calculate the update rect for this frame updateRect = mRenderer.DirtyRectManager.GetUpdateRect(mDrawStrokeResult.DirtyRect, predictedStrokeRect); // Draw the predicted stroke mRenderer.RenderingContext.SetTarget(mRenderer.PrelimPathLayer); mRenderer.RenderingContext.DrawLayerAtPoint(mRenderer.CurrentStrokeLayer, updateRect, new Point(updateRect.X, updateRect.Y), Ink.Rendering.BlendMode.Copy); mRenderer.RenderingContext.DrawParticleStroke(mPredictedInterpolatedSpline, mStrokeConstants, mActiveTool.Brush, Ink.Rendering.BlendMode.SourceOver, mDrawStrokeResult.RandomGeneratorSeed); }