Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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);
        }