public VectorInkStroke(Stroke stroke, Wacom.Ink.Geometry.VectorBrush vectorBrush, PipelineData pipelineData)
        {
            Id = stroke.Id;
            PathPointProperties ppp = stroke.Style.PathPointProperties;

            Color = MediaColor.FromArgb(
                ppp.Alpha.HasValue ? (byte)(ppp.Alpha * 255.0f) : byte.MinValue,
                ppp.Red.HasValue ? (byte)(ppp.Red * 255.0f) : byte.MinValue,
                ppp.Green.HasValue ? (byte)(ppp.Green * 255.0f) : byte.MinValue,
                ppp.Blue.HasValue ? (byte)(ppp.Blue * 255.0f) : byte.MinValue);

            Spline             = stroke.Spline;
            Layout             = stroke.Layout;
            VectorBrush        = vectorBrush;
            Polygon            = PolygonUtil.ConvertPolygon(pipelineData.Merged.Addition);
            SimplPoly          = pipelineData.Merged.Addition;
            SensorDataOffset   = stroke.SensorDataOffset;
            SensorDataMappings = stroke.SensorDataMappings;
            SensorDataId       = stroke.SensorDataId;

            Attributes attribs = new Attributes(Color);

            if (ppp.Size.HasValue)
            {
                attribs.Size = ppp.Size.Value;
            }

            Constants = attribs;
        }
        public void UpdateSpline(Spline newSpline)
        {
            var result = mInkBuilder.AddWholePath(newSpline, Layout, VectorBrush);

            Spline    = newSpline;
            SimplPoly = result.Merged.Addition;
            Polygon   = PolygonUtil.ConvertPolygon(SimplPoly);
        }
        private void OnSpatialModelStrokeAdded(object sender, IInkStroke stroke)
        {
            VectorSplineInkBuilder inkBuilder = new VectorSplineInkBuilder();
            var result = inkBuilder.AddWholePath(stroke.Spline, stroke.Layout, stroke.VectorBrush);

            var vectStroke = (VectorInkStroke)stroke;

            vectStroke.SimplPoly = result.Merged.Addition;
            vectStroke.Polygon   = PolygonUtil.ConvertPolygon(vectStroke.SimplPoly);


            lock (mDryStrokeLock)
            {
                mDryStrokes.Add(vectStroke);
            }
        }
Example #4
0
        protected override void RenderNewStrokeSegment()
        {
            ProcessorResult <List <PolygonVertices> > result;

            lock (mInkBuilderLock)
            {
                if (mInkBuilder.HasNewPoints)
                {
                    result = mInkBuilder.GetPolygons();
                    if (result.Addition == null || result.Prediction == null)
                    {
                        return;
                    }
                }
                else
                {
                    return;
                }
            }

            PolygonUtil.ConvertPolygon(result.Addition, mAddedPolygon);
            PolygonUtil.ConvertPolygon(result.Prediction, mPredictedPolygon);

            // Draw the added stroke
            mRenderingContext.SetTarget(mCurrentStrokeLayer);
            Rect addedStrokeRect = mRenderingContext.FillPolygon(mAddedPolygon, BrushColor, Wacom.Ink.Rendering.BlendMode.Max);

            // Measure the predicted stroke
            Rect predictedStrokeRect = mRenderingContext.MeasurePolygonBounds(mPredictedPolygon);

            // Calculate the  rect for this frame
            Rect updateRect = mDirtyRectManager.GetUpdateRect(addedStrokeRect, predictedStrokeRect);

            // Draw the predicted stroke
            mRenderingContext.SetTarget(mPrelimPathLayer);
            mRenderingContext.DrawLayerAtPoint(mCurrentStrokeLayer, updateRect, new Point(updateRect.X, updateRect.Y), Wacom.Ink.Rendering.BlendMode.Copy);
            mRenderingContext.FillPolygon(mPredictedPolygon, BrushColor, Wacom.Ink.Rendering.BlendMode.Max);

            // 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), Wacom.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), Wacom.Ink.Rendering.BlendMode.SourceOver);
        }
Example #5
0
        protected override void StoreCurrentStroke(string pointerDeviceType)
        {
            var polygons       = mInkBuilder.PolygonSimplifier.AllData;
            var mergedPolygons = PolygonUtils.MergePolygons(polygons);

            Wacom.Ink.Rendering.Polygon polygon = PolygonUtil.ConvertPolygon(mergedPolygons);

            mDryStrokes.Add(new DryStroke {
                mPolygon = polygon, mColor = BrushColor
            });

            mRenderingContext.SetTarget(mAllStrokesLayer);
            mRenderingContext.DrawLayer(mCurrentStrokeLayer, null, Wacom.Ink.Rendering.BlendMode.SourceOver);

            mRenderingContext.SetTarget(mCurrentStrokeLayer);
            mRenderingContext.ClearColor(Colors.Transparent);

            mDirtyRectManager.Reset();
            mSerializer.EncodeCurrentStroke(pointerDeviceType, mInkBuilder, BrushColor);
        }
Example #6
0
        private DryStroke CreateDryStrokeFromVectorBrush(DecodedVectorInkBuilder decodedVectorInkBuilder, Wacom.Ink.Serialization.Model.VectorBrush vectorBrush, Stroke stroke)
        {
            Wacom.Ink.Geometry.VectorBrush vb;

            if (vectorBrush.BrushPolygons.Count > 0)
            {
                vb = new Wacom.Ink.Geometry.VectorBrush(vectorBrush.BrushPolygons.ToArray());
            }
            else if (vectorBrush.BrushPrototypeURIs.Count > 0)
            {
                List <BrushPolygon> brushPolygons = new List <BrushPolygon>(vectorBrush.BrushPrototypeURIs.Count);

                foreach (var uri in vectorBrush.BrushPrototypeURIs)
                {
                    brushPolygons.Add(new BrushPolygon(uri.MinScale, ShapeUriResolver.ResolveShape(uri.ShapeUri)));
                }

                vb = new Wacom.Ink.Geometry.VectorBrush(brushPolygons.ToArray());
            }
            else
            {
                throw new ArgumentException("Missing vector brush information! Expected BrushPolygons, BrushPolyhedrons or BrushPrototypeURIs.");
            }
            var result = decodedVectorInkBuilder.AddWholePath(stroke.Spline, stroke.Layout, vb);
            var ppp    = stroke.Style.PathPointProperties;

            DryStroke dryStroke = new DryStroke
            {
                mPolygon = PolygonUtil.ConvertPolygon(result.Addition),
                mColor   = MediaColor.FromArgb(
                    ppp.Alpha.HasValue ? (byte)(ppp.Alpha * 255.0f) : byte.MinValue,
                    ppp.Red.HasValue ? (byte)(ppp.Red * 255.0f) : byte.MinValue,
                    ppp.Green.HasValue ? (byte)(ppp.Green * 255.0f) : byte.MinValue,
                    ppp.Blue.HasValue ? (byte)(ppp.Blue * 255.0f) : byte.MinValue)
            };

            return(dryStroke);
        }