Ejemplo n.º 1
0
            public ProcessorResult <List <float> > AddWholePath(List <float> path, float spacing, PathPointLayout layout)
            {
                if (path.Count == 0)
                {
                    throw new Exception("Path has no points!");
                }

                SplineInterpolator = new DistanceBasedInterpolator(layout, spacing, splitCount, true, true);

                var iterpolatedPoints = SplineInterpolator.Add(true, true, new Spline(layout.ChannelMask, path), new Spline(layout.ChannelMask));

                return(iterpolatedPoints);
            }
        /// <summary>
        /// Transform accumulated pointer input to ink geometry
        /// </summary>
        /// <returns>Tuple containing added data (Item1) and predicted or preliminary data (Item2)</returns>
        /// <remarks>Passes accumulated path segment (from PathProducer) through remaining stages of
        /// the raster ink pipeline - Smoother, SplineProducer & SplineInterpolator</remarks>
        public ProcessorResult <List <float> > GetPath()
        {
            var smoothPath = mSmoothingFilter.Add(mPathSegment.IsFirst, mPathSegment.IsLast, mPathSegment.AccumulatedAddition, mPathSegment.LastPrediction);

            var spline = SplineProducer.Add(mPathSegment.IsFirst, mPathSegment.IsLast, smoothPath.Addition, smoothPath.Prediction);

            var points = SplineInterpolator.Add(mPathSegment.IsFirst, mPathSegment.IsLast, spline.Addition, spline.Prediction);

            mPathSegment.Reset();
            mPointerDataUpdateCount = 0;

            return(points);
        }
Ejemplo n.º 3
0
        private UnaryPixelOp MakeUop()
        {
            UnaryPixelOp op;

            byte[][] transferCurves;
            int      entries;

            switch (Data.Mode)
            {
            case ColorTransferMode.Rgb:
                UnaryPixelOps.ChannelCurve cc = new UnaryPixelOps.ChannelCurve();
                transferCurves = new byte[][] { cc.CurveR, cc.CurveG, cc.CurveB };
                entries        = 256;
                op             = cc;
                break;

            case ColorTransferMode.Luminosity:
                UnaryPixelOps.LuminosityCurve lc = new UnaryPixelOps.LuminosityCurve();
                transferCurves = new byte[][] { lc.Curve };
                entries        = 256;
                op             = lc;
                break;

            default:
                throw new InvalidEnumArgumentException();
            }


            int channels = transferCurves.Length;

            for (int channel = 0; channel < channels; channel++)
            {
                SortedList <int, int> channelControlPoints = Data.ControlPoints[channel];
                IList <int>           xa           = channelControlPoints.Keys;
                IList <int>           ya           = channelControlPoints.Values;
                SplineInterpolator    interpolator = new SplineInterpolator();
                int length = channelControlPoints.Count;

                for (int i = 0; i < length; i++)
                {
                    interpolator.Add(xa[i], ya[i]);
                }

                for (int i = 0; i < entries; i++)
                {
                    transferCurves[channel][i] = Utility.ClampToByte(interpolator.Interpolate(i));
                }
            }

            return(op);
        }
		private UnaryPixelOp MakeUop (SortedList<int, int>[] controlPoints, ColorTransferMode mode)
		{
			UnaryPixelOp op;
			byte[][] transferCurves;
			int entries;

			switch (mode) {
				case ColorTransferMode.Rgb:
					var cc = new ChannelCurveOp ();
					transferCurves = new byte[][] { cc.CurveR, cc.CurveG, cc.CurveB };
					entries = 256;
					op = cc;
					break;

				case ColorTransferMode.Luminosity:
					var lc = new LuminosityCurveOp ();
					transferCurves = new byte[][] { lc.Curve };
					entries = 256;
					op = lc;
					break;

				default:
					throw new InvalidEnumArgumentException ();
			}


			int channels = transferCurves.Length;

			for (int channel = 0; channel < channels; channel++) {
				var channelControlPoints = controlPoints[channel];
				var xa = channelControlPoints.Keys;
				var ya = channelControlPoints.Values;
				SplineInterpolator interpolator = new SplineInterpolator ();
				int length = channelControlPoints.Count;

				for (int i = 0; i < length; i++) {
					interpolator.Add (xa[i], ya[i]);
				}

				for (int i = 0; i < entries; i++) {
					transferCurves[channel][i] = Utility.ClampToByte (interpolator.Interpolate (i));
				}
			}

			return op;
		}
Ejemplo n.º 5
0
        /// <summary>
        /// Transform accumulated pointer input to ink geometry
        /// </summary>
        /// <param name="defaultSize">Default size for SplineInterpolator and BrushApplier</param>
        /// <param name="defaultScale">Default Scale for BrushApplier</param>
        /// <param name="defaultOffset">Default Offset for BrushApplier</param>
        /// <param name="defaultRotation">Default Rotation for BrushApplier</param>
        /// <returns>Tuple containing added data (Item1) and predicted or preliminary data (Item2)</returns>
        /// <remarks>Passes accumulated path segment (from PathProducer) through remaining stages of
        /// the vector ink pipeline - Smoother, SplineProducer, SplineInterpolator, BrushApplier, ConvexHullChainProducer,
        /// PolygonMerger and PolygonSimplifier</remarks>
        public ProcessorResult <List <PolygonVertices> > GetPolygons()
        {
            var smoothPath = mSmoothingFilter.Add(mPathSegment.IsFirst, mPathSegment.IsLast, mPathSegment.AccumulatedAddition, mPathSegment.LastPrediction);

            var spline = SplineProducer.Add(mPathSegment.IsFirst, mPathSegment.IsLast, smoothPath.Addition, smoothPath.Prediction);

            var points = SplineInterpolator.Add(mPathSegment.IsFirst, mPathSegment.IsLast, spline.Addition, spline.Prediction);

            var polys = BrushApplier.Add(mPathSegment.IsFirst, mPathSegment.IsLast, points.Addition, points.Prediction);

            var hulls = ConvexHullChainProducer.Add(mPathSegment.IsFirst, mPathSegment.IsLast, polys.Addition, polys.Prediction);

            var merged = mPolygonMerger.Add(mPathSegment.IsFirst, mPathSegment.IsLast, hulls.Addition, hulls.Prediction);

            var simplified = PolygonSimplifier.Add(mPathSegment.IsFirst, mPathSegment.IsLast, merged.Addition, merged.Prediction);

            mPathSegment.Reset();

            return(simplified);
        }
Ejemplo n.º 6
0
        private void DrawSpline(Context g)
        {
            var infos = GetDrawingInfos();

            foreach (var controlPoints in ControlPoints)
            {
                int points = controlPoints.Count;
                SplineInterpolator interpolator = new SplineInterpolator();
                IList <int>        xa           = controlPoints.Keys;
                IList <int>        ya           = controlPoints.Values;
                PointD[]           line         = new PointD[size];

                for (int i = 0; i < points; i++)
                {
                    interpolator.Add(xa[i], ya[i]);
                }

                for (int i = 0; i < line.Length; i++)
                {
                    line[i].X = (float)i;
                    line[i].Y = (float)(Utility.Clamp(size - 1 - interpolator.Interpolate(i), 0, size - 1));
                }

                g.LineWidth = 2;
                g.LineJoin  = LineJoin.Round;

                g.MoveTo(line[0]);
                for (int i = 1; i < line.Length; i++)
                {
                    g.LineTo(line[i]);
                }

                infos.MoveNext();
                var info = infos.Current;

                g.SetSourceColor(info.Color);
                g.LineWidth = info.IsActive ? 2 : 1;
                g.Stroke();
            }
        }
Ejemplo n.º 7
0
        protected override void DrawGeometry(StreamGeometryContext context)
        {
            var interpolator = new SplineInterpolator();

            foreach (var lineConnector in Connectors)
            {
                interpolator.Add(lineConnector.PosPoint.X, lineConnector.PosPoint.Y);
            }

            var start = Connectors.Min(x => x.PosPoint.X);
            var end   = Connectors.Max(x => x.PosPoint.X);

            var step   = Math.Sign(end - start);
            var firstY = interpolator.Interpolate(start);

            context.BeginFigure(new Point(start, firstY), true, false);
            start += step;

            for (var x = start; x <= end; x += step)
            {
                var y = interpolator.Interpolate(x);
                context.LineTo(new Point(x, y), true, true);
            }
        }
Ejemplo n.º 8
0
        private UnaryPixelOp MakeUop()
        {
            UnaryPixelOp uopRet;
            byte[][] transferCurves;
            int entries;

            switch (colorTransferMode)
            {
                case ColorTransferMode.Rgb:
                    UnaryPixelOps.ChannelCurve cc = new UnaryPixelOps.ChannelCurve();
                    transferCurves = new byte[][] { cc.CurveR, cc.CurveG, cc.CurveB };
                    entries = 256;
                    uopRet = cc;
                    break;

                case ColorTransferMode.Luminosity:
                    UnaryPixelOps.LuminosityCurve lc = new UnaryPixelOps.LuminosityCurve();
                    transferCurves = new byte[][] { lc.Curve };
                    entries = 256;
                    uopRet = lc;
                    break;

                default:
                    throw new InvalidEnumArgumentException();
            }

            
            int channels = transferCurves.Length;

            for (int channel = 0; channel < channels; ++channel)
            {
                SortedList<int, int> channelControlPoints = controlPoints[channel];
                IList<int> xa = channelControlPoints.Keys;
                IList<int> ya = channelControlPoints.Values;
                SplineInterpolator interpolator = new SplineInterpolator();
                int length = channelControlPoints.Count;

                for (int i = 0; i < length; ++i)
                {
                    interpolator.Add(xa[i], ya[i]);
                }

                for (int i = 0; i < entries; ++i)
                {
                    transferCurves[channel][i] = Utility.ClampToByte(interpolator.Interpolate(i));
                }
            }

            return uopRet;
        }