private static void DoCubicForwardDifferencing(Point[] controlPoints, double leftParameter, double rightParameter, double inverseErrorTolerance, List <Point> resultPolyline, List <double> resultParameters) { double num1 = controlPoints[1].X - controlPoints[0].X; double num2 = controlPoints[1].Y - controlPoints[0].Y; double num3 = controlPoints[2].X - controlPoints[1].X; double num4 = controlPoints[2].Y - controlPoints[1].Y; double num5 = controlPoints[3].X - controlPoints[2].X; double num6 = controlPoints[3].Y - controlPoints[2].Y; double num7 = num3 - num1; double num8 = num4 - num2; double num9 = num5 - num3; double num10 = num6 - num4; double num11 = num9 - num7; double num12 = num10 - num8; Vector vector = controlPoints[3] - controlPoints[0]; double length = vector.Length; double num13 = length < FloatingPointArithmetic.DistanceTolerance ? Math.Max(0.0, Math.Max(VectorUtilities.Distance(controlPoints[1], controlPoints[0]), VectorUtilities.Distance(controlPoints[2], controlPoints[0]))) : Math.Max(0.0, Math.Max(Math.Abs((num7 * vector.Y - num8 * vector.X) / length), Math.Abs((num9 * vector.Y - num10 * vector.X) / length))); uint num14 = 0U; if (num13 > 0.0) { double d = num13 * inverseErrorTolerance; num14 = d < (double)int.MaxValue ? BezierCurveFlattener.Log4UnsignedInt32((uint)(d + 0.5)) : BezierCurveFlattener.Log4Double(d); } int exp1 = -(int)num14; int exp2 = exp1 + exp1; int exp3 = exp2 + exp1; double num15 = FloatingPointArithmetic.DoubleFromMantissaAndExponent(3.0 * num7, exp2); double num16 = FloatingPointArithmetic.DoubleFromMantissaAndExponent(3.0 * num8, exp2); double num17 = FloatingPointArithmetic.DoubleFromMantissaAndExponent(6.0 * num11, exp3); double num18 = FloatingPointArithmetic.DoubleFromMantissaAndExponent(6.0 * num12, exp3); double num19 = FloatingPointArithmetic.DoubleFromMantissaAndExponent(3.0 * num1, exp1) + num15 + 1.0 / 6.0 * num17; double num20 = FloatingPointArithmetic.DoubleFromMantissaAndExponent(3.0 * num2, exp1) + num16 + 1.0 / 6.0 * num18; double num21 = 2.0 * num15 + num17; double num22 = 2.0 * num16 + num18; double x = controlPoints[0].X; double y = controlPoints[0].Y; Point point = new Point(0.0, 0.0); int num23 = 1 << (int)num14; double num24 = num23 > 0 ? (rightParameter - leftParameter) / (double)num23 : 0.0; double num25 = leftParameter; for (int index = 1; index < num23; ++index) { x += num19; y += num20; point.X = x; point.Y = y; resultPolyline.Add(point); num25 += num24; resultParameters.Add(num25); num19 += num21; num20 += num22; num21 += num17; num22 += num18; } }