示例#1
0
        private void ParseSkewY(StringPtr ptr)
        {
            if (ptr.String.StartsWith("skewY"))
            {
                ptr += 5;

                ptr.AdvanceWhiteSpace();
                if (ptr.Char == '(')
                {
                    ++ptr;
                    ptr.AdvanceWhiteSpace();

                    var angle = ParseNumber(ptr).Value;
                    this.ParseCommaOrWhitespace(ptr);

                    ptr.AdvanceWhiteSpace();
                    if (ptr.Char == ')')
                    {
                        ++ptr;
                        this.Transforms.Add(SvgTransform.CreateSkewY(angle));
                        return;
                    }
                }
                throw new ArgumentException("transformData");
            }
        }
示例#2
0
        private void ParseRotate(StringPtr ptr)
        {
            if (ptr.String.StartsWith("rotate"))
            {
                ptr += 6;

                ptr.AdvanceWhiteSpace();
                if (ptr.Char == '(')
                {
                    ++ptr;
                    ptr.AdvanceWhiteSpace();

                    var r = ParseNumber(ptr).Value;

                    var current = ptr.Index;
                    this.ParseCommaOrWhitespace(ptr);

                    var cx = ParseNumber(ptr);
                    if (cx.HasValue)
                    {
                        this.ParseCommaOrWhitespace(ptr);

                        var cy = ParseNumber(ptr).Value;
                        this.ParseCommaOrWhitespace(ptr);

                        ptr.AdvanceWhiteSpace();
                        if (ptr.Char == ')')
                        {
                            ++ptr;
                            this.Transforms.Add(SvgTransform.CreateRotate(r, cx.Value, cy));
                            return;
                        }
                    }
                    else
                    {
                        ptr.Index = current;

                        ptr.AdvanceWhiteSpace();
                        if (ptr.Char == ')')
                        {
                            ++ptr;
                            this.Transforms.Add(SvgTransform.CreateRotate(r));
                            return;
                        }
                    }
                }
                throw new ArgumentException("transformData");
            }
        }
		private SvgPathSegmentParser(string pathData)
		{
			this.Segments = new Collection<SvgPathSegment>();

			var ptr = new StringPtr(pathData);
			ptr.AdvanceWhiteSpace();
			this.ParseMoveToDrawToCommandGroups(ptr);
		}
示例#4
0
		private SvgTransformParser(string pathData)
		{
			this.Transforms = new Collection<SvgTransform>();

			var ptr = new StringPtr(pathData);
			ptr.AdvanceWhiteSpace();
			this.ParseTransforms(ptr);
		}
示例#5
0
        private void ParseTranslate(StringPtr ptr)
        {
            if (ptr.String.StartsWith("translate"))
            {
                ptr += 9;

                ptr.AdvanceWhiteSpace();
                if (ptr.Char == '(')
                {
                    ++ptr;
                    ptr.AdvanceWhiteSpace();

                    var tx = ParseNumber(ptr).Value;

                    var current = ptr.Index;
                    this.ParseCommaOrWhitespace(ptr);

                    var ty = ParseNumber(ptr);
                    if (ty.HasValue)
                    {
                        this.ParseCommaOrWhitespace(ptr);

                        ptr.AdvanceWhiteSpace();
                        if (ptr.Char == ')')
                        {
                            ++ptr;
                            this.Transforms.Add(SvgTransform.CreateTranslate(tx, ty.Value));
                            return;
                        }
                    }
                    else
                    {
                        ptr.Index = current;

                        ptr.AdvanceWhiteSpace();
                        if (ptr.Char == ')')
                        {
                            ++ptr;
                            this.Transforms.Add(SvgTransform.CreateTranslate(tx, 0.0F));
                            return;
                        }
                    }
                }
                throw new ArgumentException("transformData");
            }
        }
示例#6
0
        private SvgTransformParser(string pathData)
        {
            this.Transforms = new Collection <SvgTransform>();

            var ptr = new StringPtr(pathData);

            ptr.AdvanceWhiteSpace();
            this.ParseTransforms(ptr);
        }
示例#7
0
        private void ParseMatrix(StringPtr ptr)
        {
            if (ptr.String.StartsWith("matrix"))
            {
                ptr += 6;

                ptr.AdvanceWhiteSpace();
                if (ptr.Char == '(')
                {
                    ++ptr;
                    ptr.AdvanceWhiteSpace();

                    var a = ParseNumber(ptr).Value;
                    this.ParseCommaOrWhitespace(ptr);

                    var b = ParseNumber(ptr).Value;
                    this.ParseCommaOrWhitespace(ptr);

                    var c = ParseNumber(ptr).Value;
                    this.ParseCommaOrWhitespace(ptr);

                    var d = ParseNumber(ptr).Value;
                    this.ParseCommaOrWhitespace(ptr);

                    var e = ParseNumber(ptr).Value;
                    this.ParseCommaOrWhitespace(ptr);

                    var f = ParseNumber(ptr).Value;
                    this.ParseCommaOrWhitespace(ptr);

                    ptr.AdvanceWhiteSpace();
                    if (ptr.Char == ')')
                    {
                        ++ptr;
                        this.Transforms.Add(SvgTransform.CreateMatrix(new SvgMatrix(a, b, c, d, e, f)));
                        return;
                    }
                }
                throw new ArgumentException("transformData");
            }
        }
示例#8
0
		private void ParseMatrix(StringPtr ptr)
		{
			if (ptr.String.StartsWith("matrix"))
			{
				ptr += 6;

				ptr.AdvanceWhiteSpace();
				if (ptr.Char == '(')
				{
					++ptr;
					ptr.AdvanceWhiteSpace();

					var a = ParseNumber(ptr).Value;
					this.ParseCommaOrWhitespace(ptr);

					var b = ParseNumber(ptr).Value;
					this.ParseCommaOrWhitespace(ptr);

					var c = ParseNumber(ptr).Value;
					this.ParseCommaOrWhitespace(ptr);

					var d = ParseNumber(ptr).Value;
					this.ParseCommaOrWhitespace(ptr);

					var e = ParseNumber(ptr).Value;
					this.ParseCommaOrWhitespace(ptr);

					var f = ParseNumber(ptr).Value;
					this.ParseCommaOrWhitespace(ptr);

					ptr.AdvanceWhiteSpace();
					if (ptr.Char == ')')
					{
						++ptr;
						this.Transforms.Add(SvgTransform.CreateMatrix(new SvgMatrix(a, b, c, d, e, f)));
						return;
					}
				}
				throw new ArgumentException("transformData");
			}
		}
示例#9
0
 private bool ParseCommaOrWhitespace(StringPtr ptr)
 {
     if (ptr.IsWhitespace())
     {
         ++ptr;
         ptr.AdvanceWhiteSpace();
         if (ptr.Char == ',')
         {
             ++ptr;
         }
         ptr.AdvanceWhiteSpace();
         return(true);
     }
     else if (ptr.Char == ',')
     {
         ++ptr;
         ptr.AdvanceWhiteSpace();
         return(true);
     }
     return(false);
 }
示例#10
0
		private bool ParseDrawToCommands(StringPtr ptr)
		{
			if (this.ParseDrawToCommand(ptr))
			{
				var current = ptr.Index;
				ptr.AdvanceWhiteSpace();
				if (!ptr.IsEnd)
				{
					if (!this.ParseDrawToCommands(ptr))
					{
						ptr.Index = current;
					}
				}
				return true;
			}
			return false;
		}
示例#11
0
		private void ParseRotate(StringPtr ptr)
		{
			if (ptr.String.StartsWith("rotate"))
			{
				ptr += 6;

				ptr.AdvanceWhiteSpace();
				if (ptr.Char == '(')
				{
					++ptr;
					ptr.AdvanceWhiteSpace();

					var r = ParseNumber(ptr).Value;

					var current = ptr.Index;
					this.ParseCommaOrWhitespace(ptr);

					var cx = ParseNumber(ptr);
					if (cx.HasValue)
					{
						this.ParseCommaOrWhitespace(ptr);

						var cy = ParseNumber(ptr).Value;
						this.ParseCommaOrWhitespace(ptr);

						ptr.AdvanceWhiteSpace();
						if (ptr.Char == ')')
						{
							++ptr;
							this.Transforms.Add(SvgTransform.CreateRotate(r, cx.Value, cy));
							return;
						}
					}
					else
					{
						ptr.Index = current;

						ptr.AdvanceWhiteSpace();
						if (ptr.Char == ')')
						{
							++ptr;
							this.Transforms.Add(SvgTransform.CreateRotate(r));
							return;
						}
					}
				}
				throw new ArgumentException("transformData");
			}
		}
示例#12
0
		private void ParseHorizontalLineTo(StringPtr ptr)
		{
			var abs = ptr.Char == 'H';
			++ptr;
			ptr.AdvanceWhiteSpace();
			this.ParseHorizontalLineToArgumentSequence(ptr, abs);
		}
示例#13
0
		private void ParseCurveTo(StringPtr ptr)
		{
			var abs = ptr.Char == 'C';
			++ptr;
			ptr.AdvanceWhiteSpace();
			this.ParseCurveToArgumentSequence(ptr, abs);
		}
示例#14
0
		private void ParseSmoothQuadraticBezierCurveTo(StringPtr ptr)
		{
			var abs = ptr.Char == 'T';
			++ptr;
			ptr.AdvanceWhiteSpace();
			this.ParseSmoothQuadraticBezierCurveToArgumentSequence(ptr, abs);
		}
示例#15
0
		private static RgbColor ParseColorFunc(string color)
		{
			var ptr = new StringPtr(color);
			ptr.AdvanceWhiteSpace();

			var s1 = ptr.Index;
			ptr.AdvanceInteger();
			if (ptr.Index == s1) throw new ArgumentException(nameof(color));
			var r = byte.Parse(color.Substring(s1, ptr.Index - s1));

			var percentage = false;
			if (ptr.Char == '%')
			{
				percentage = true;
				++ptr;
			}

			ptr.AdvanceWhiteSpace();
			if (ptr.Char != ',') throw new ArgumentException(nameof(color));
			++ptr;
			ptr.AdvanceWhiteSpace();

			var s2 = ptr.Index;
			ptr.AdvanceInteger();
			if (ptr.Index == s2) throw new ArgumentException(nameof(color));
			var g = byte.Parse(color.Substring(s2, ptr.Index - s2));

			if (percentage)
			{
				if (ptr.Char != '%') throw new ArgumentException(nameof(color));
				++ptr;
			}

			ptr.AdvanceWhiteSpace();
			if (ptr.Char != ',') throw new ArgumentException(nameof(color));
			++ptr;
			ptr.AdvanceWhiteSpace();

			var s3 = ptr.Index;
			ptr.AdvanceInteger();
			if (ptr.Index == s3) throw new ArgumentException(nameof(color));
			var b = byte.Parse(color.Substring(s3, ptr.Index - s3));

			if (percentage)
			{
				if (ptr.Char != '%') throw new ArgumentException(nameof(color));
				++ptr;
			}

			ptr.AdvanceWhiteSpace();

			if (ptr.Char != ')') throw new ArgumentException(nameof(color));

			return percentage
				? new RgbColor((byte)(255.0F * r / 100.0F), (byte)(255.0F * g / 100.0F), (byte)(255.0F * b / 100.0F))
				: new RgbColor(r, g, b);
		}
示例#16
0
		private void ParseTranslate(StringPtr ptr)
		{
			if (ptr.String.StartsWith("translate"))
			{
				ptr += 9;

				ptr.AdvanceWhiteSpace();
				if (ptr.Char == '(')
				{
					++ptr;
					ptr.AdvanceWhiteSpace();

					var tx = ParseNumber(ptr).Value;

					var current = ptr.Index;
					this.ParseCommaOrWhitespace(ptr);

					var ty = ParseNumber(ptr);
					if (ty.HasValue)
					{
						this.ParseCommaOrWhitespace(ptr);

						ptr.AdvanceWhiteSpace();
						if (ptr.Char == ')')
						{
							++ptr;
							this.Transforms.Add(SvgTransform.CreateTranslate(tx, ty.Value));
							return;
						}
					}
					else
					{
						ptr.Index = current;

						ptr.AdvanceWhiteSpace();
						if (ptr.Char == ')')
						{
							++ptr;
							this.Transforms.Add(SvgTransform.CreateTranslate(tx, 0.0F));
							return;
						}
					}
				}
				throw new ArgumentException("transformData");
			}
		}
示例#17
0
		private void ParseMoveToDrawToCommandGroup(StringPtr ptr)
		{
			this.ParseMoveTo(ptr);
			ptr.AdvanceWhiteSpace();
			if (!ptr.IsEnd) this.ParseDrawToCommands(ptr);
		}
示例#18
0
		private bool ParseCommaOrWhitespace(StringPtr ptr)
		{
			if (ptr.IsWhitespace())
			{
				++ptr;
				ptr.AdvanceWhiteSpace();
				if (ptr.Char == ',') ++ptr;
				ptr.AdvanceWhiteSpace();
				return true;
			}
			else if (ptr.Char == ',')
			{
				++ptr;
				ptr.AdvanceWhiteSpace();
				return true;
			}
			return false;
		}
示例#19
0
		private void ParseQllipticalArc(StringPtr ptr)
		{
			var abs = ptr.Char == 'A';
			++ptr;
			ptr.AdvanceWhiteSpace();
			this.ParseQllipticalArcArgumentSequence(ptr, abs);
		}
示例#20
0
		private void ParseSkewY(StringPtr ptr)
		{
			if (ptr.String.StartsWith("skewY"))
			{
				ptr += 5;

				ptr.AdvanceWhiteSpace();
				if (ptr.Char == '(')
				{
					++ptr;
					ptr.AdvanceWhiteSpace();

					var angle = ParseNumber(ptr).Value;
					this.ParseCommaOrWhitespace(ptr);

					ptr.AdvanceWhiteSpace();
					if (ptr.Char == ')')
					{
						++ptr;
						this.Transforms.Add(SvgTransform.CreateSkewY(angle));
						return;
					}
				}
				throw new ArgumentException("transformData");
			}
		}
示例#21
0
		private void ParseMoveTo(StringPtr ptr)
		{
			if (char.ToLower(ptr.Char) == 'm')
			{
				var abs = ptr.Char == 'M';
				++ptr;
				ptr.AdvanceWhiteSpace();
				this.ParseMoveToArgumentSequence(ptr, abs);
				return;
			}
			throw new ArgumentException("pathData");
		}