internal static SvgAngle Parse(StringPtr ptr) { var begin = ptr.Index; ptr.AdvanceNumber(); if (begin == ptr.Index) { throw new ArgumentException(nameof(ptr)); } var value = float.Parse(ptr.Target.Substring(begin, ptr.Index - begin), System.Globalization.CultureInfo.InvariantCulture); if (ptr.Index != ptr.Target.Length) { var unit = ptr.String; if (unit.StartsWith("deg")) { ptr += 3; return(new SvgAngle(SvgAngleType.Degree, value)); } if (unit.StartsWith("rad")) { ptr += 3; return(new SvgAngle(SvgAngleType.Radian, value)); } if (unit.StartsWith("grad")) { ptr += 4; return(new SvgAngle(SvgAngleType.Grade, value)); } } return(new SvgAngle(SvgAngleType.Degree, value)); }
private float?ParseNumber(StringPtr ptr) { var begin = ptr.Index; ptr.AdvanceNumber(); if (begin == ptr.Index) { return(null); } var numberText = ptr.Target.Substring(begin, ptr.Index - begin); return(float.Parse(numberText, System.Globalization.CultureInfo.InvariantCulture)); }
internal static bool TryParse(string numberText, float min, float max, out SvgNumber result) { var ptr = new StringPtr(numberText); ptr.AdvanceNumber(); if (ptr.Index != numberText.Length) { result = 0.0F; return(false); } result = Math.Min(Math.Max(float.Parse(numberText), min), max); return(true); }
internal static bool TryParse(string numberText, out SvgNumber result) { var ptr = new StringPtr(numberText); ptr.AdvanceNumber(); if (ptr.Index != numberText.Length) { result = 0.0F; return(false); } result = float.Parse(numberText, System.Globalization.CultureInfo.InvariantCulture); return(true); }
internal static bool TryParse(string lengthText, bool presentation, out SvgLength result) { var ptr = new StringPtr(lengthText); ptr.AdvanceNumber(); var value = float.Parse(lengthText.Substring(0, ptr.Index), System.Globalization.CultureInfo.InvariantCulture); if (ptr.Index != lengthText.Length) { var unit = lengthText.Substring(ptr.Index); if (presentation) { unit = unit.ToLower(); } switch (unit) { case "%": result = new SvgLength(SvgLengthType.Percentage, value); break; case "em": result = new SvgLength(SvgLengthType.Ems, value); break; case "ex": result = new SvgLength(SvgLengthType.Exs, value); break; case "px": result = new SvgLength(SvgLengthType.Pixel, value); break; case "cm": result = new SvgLength(SvgLengthType.Centimeter, value); break; case "mm": result = new SvgLength(SvgLengthType.Millimeter, value); break; case "in": result = new SvgLength(SvgLengthType.Inch, value); break; case "pt": result = new SvgLength(SvgLengthType.Point, value); break; case "pc": result = new SvgLength(SvgLengthType.Pica, value); break; default: result = null; return(false); } return(true); } result = new SvgLength(SvgLengthType.Number, value); return(true); }
internal static SvgAngle ParseInCss(string angleText) { var ptr = new StringPtr(angleText); ptr.AdvanceNumber(); var value = float.Parse(angleText.Substring(0, ptr.Index), System.Globalization.CultureInfo.InvariantCulture); if (ptr.Index != angleText.Length) { var unit = angleText.Substring(ptr.Index).ToLower(); switch (unit) { case "deg": return(new SvgAngle(SvgAngleType.Degree, value)); case "rad": return(new SvgAngle(SvgAngleType.Radian, value)); case "grad": return(new SvgAngle(SvgAngleType.Grade, value)); } throw new ArgumentException(nameof(angleText)); } return(new SvgAngle(SvgAngleType.Degree, value)); }