if (is_conic_curve()) { // Conics are 3 points, with the weight in p3. float w = p3.x; p3 = p2; // Duplicate the endpoint for shared code that also runs on cubics. if (is_non_triangular_conic_curve()) { // Convert the points to a trapeziodal hull that circumcscribes the conic. float2 p1w = p1 * w; float T = .51; // Bias outward a bit to ensure we cover the outermost samples. float2 c1 = mix(p0, p1w, T); float2 c2 = mix(p2, p1w, T); float iw = 1 / mix(1, w, T); p2 = c2 * iw; p1 = c1 * iw; } } // Translate the points to v0..3 where v0=0. float2 v1 = p1 - p0; float2 v2 = p2 - p0; float2 v3 = p3 - p0; // Reorder the points so v2 bisects v1 and v3. if (sign(cross_length_2d(v2, v1)) == sign(cross_length_2d(v2, v3))) { float2 tmp = p2; if (sign(cross_length_2d(v1, v2)) != sign(cross_length_2d(v1, v3))) { p2 = p1; // swap(p2, p1) p1 = tmp; } else { p2 = p3; // swap(p2, p3) p3 = tmp; } }