Created
September 21, 2020 03:53
-
-
Save ctrlcctrlv/82042e64a27753fa69a0ffbb0cc64fbe to your computer and use it in GitHub Desktop.
raphlinus/spiro transpiled by c2rust
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #![allow(dead_code, mutable_transmutes, non_camel_case_types, non_snake_case, | |
| non_upper_case_globals, unused_assignments, unused_mut)] | |
| #![register_tool(c2rust)] | |
| #![feature(register_tool)] | |
| #[derive(Copy, Clone)] | |
| #[repr(C)] | |
| pub struct _bezctx { | |
| pub moveto: Option<unsafe extern "C" fn(_: *mut bezctx, _: libc::c_double, | |
| _: libc::c_double, _: libc::c_int) | |
| -> ()>, | |
| pub lineto: Option<unsafe extern "C" fn(_: *mut bezctx, _: libc::c_double, | |
| _: libc::c_double) -> ()>, | |
| pub quadto: Option<unsafe extern "C" fn(_: *mut bezctx, _: libc::c_double, | |
| _: libc::c_double, | |
| _: libc::c_double, | |
| _: libc::c_double) -> ()>, | |
| pub curveto: Option<unsafe extern "C" fn(_: *mut bezctx, | |
| _: libc::c_double, | |
| _: libc::c_double, | |
| _: libc::c_double, | |
| _: libc::c_double, | |
| _: libc::c_double, | |
| _: libc::c_double) -> ()>, | |
| pub mark_knot: Option<unsafe extern "C" fn(_: *mut bezctx, _: libc::c_int) | |
| -> ()>, | |
| } | |
| pub type bezctx = _bezctx; | |
| /* | |
| ppedit - A pattern plate editor for Spiro splines. | |
| Copyright (C) 2007 Raph Levien | |
| Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
| http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
| <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
| option. This file may not be copied, modified, or distributed | |
| except according to those terms. | |
| */ | |
| #[no_mangle] | |
| pub unsafe extern "C" fn bezctx_moveto(mut bc: *mut bezctx, | |
| mut x: libc::c_double, | |
| mut y: libc::c_double, | |
| mut is_open: libc::c_int) { | |
| (*bc).moveto.expect("non-null function pointer")(bc, x, y, is_open); | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn bezctx_lineto(mut bc: *mut bezctx, | |
| mut x: libc::c_double, | |
| mut y: libc::c_double) { | |
| (*bc).lineto.expect("non-null function pointer")(bc, x, y); | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn bezctx_quadto(mut bc: *mut bezctx, | |
| mut x1: libc::c_double, | |
| mut y1: libc::c_double, | |
| mut x2: libc::c_double, | |
| mut y2: libc::c_double) { | |
| (*bc).quadto.expect("non-null function pointer")(bc, x1, y1, x2, y2); | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn bezctx_curveto(mut bc: *mut bezctx, | |
| mut x1: libc::c_double, | |
| mut y1: libc::c_double, | |
| mut x2: libc::c_double, | |
| mut y2: libc::c_double, | |
| mut x3: libc::c_double, | |
| mut y3: libc::c_double) { | |
| (*bc).curveto.expect("non-null function pointer")(bc, x1, y1, x2, y2, x3, | |
| y3); | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn bezctx_mark_knot(mut bc: *mut bezctx, | |
| mut knot_idx: libc::c_int) { | |
| if (*bc).mark_knot.is_some() { | |
| (*bc).mark_knot.expect("non-null function pointer")(bc, knot_idx); | |
| }; | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #![allow(dead_code, mutable_transmutes, non_camel_case_types, non_snake_case, | |
| non_upper_case_globals, unused_assignments, unused_mut)] | |
| #![register_tool(c2rust)] | |
| #![feature(extern_types, main, register_tool)] | |
| extern "C" { | |
| pub type _bezctx; | |
| #[no_mangle] | |
| fn atan2(_: libc::c_double, _: libc::c_double) -> libc::c_double; | |
| #[no_mangle] | |
| fn cos(_: libc::c_double) -> libc::c_double; | |
| #[no_mangle] | |
| fn sin(_: libc::c_double) -> libc::c_double; | |
| #[no_mangle] | |
| fn hypot(_: libc::c_double, _: libc::c_double) -> libc::c_double; | |
| #[no_mangle] | |
| fn fabs(_: libc::c_double) -> libc::c_double; | |
| #[no_mangle] | |
| fn floor(_: libc::c_double) -> libc::c_double; | |
| #[no_mangle] | |
| fn malloc(_: libc::c_ulong) -> *mut libc::c_void; | |
| #[no_mangle] | |
| fn free(__ptr: *mut libc::c_void); | |
| #[no_mangle] | |
| fn memcpy(_: *mut libc::c_void, _: *const libc::c_void, _: libc::c_ulong) | |
| -> *mut libc::c_void; | |
| #[no_mangle] | |
| fn bezctx_moveto(bc: *mut bezctx, x: libc::c_double, y: libc::c_double, | |
| is_open: libc::c_int); | |
| #[no_mangle] | |
| fn bezctx_lineto(bc: *mut bezctx, x: libc::c_double, y: libc::c_double); | |
| #[no_mangle] | |
| fn bezctx_curveto(bc: *mut bezctx, x1: libc::c_double, y1: libc::c_double, | |
| x2: libc::c_double, y2: libc::c_double, | |
| x3: libc::c_double, y3: libc::c_double); | |
| #[no_mangle] | |
| fn bezctx_mark_knot(bc: *mut bezctx, knot_idx: libc::c_int); | |
| #[no_mangle] | |
| fn printf(_: *const libc::c_char, _: ...) -> libc::c_int; | |
| #[no_mangle] | |
| fn gettimeofday(__tv: *mut timeval, __tz: *mut libc::c_void) | |
| -> libc::c_int; | |
| } | |
| pub type __time_t = libc::c_long; | |
| pub type __suseconds_t = libc::c_long; | |
| #[derive(Copy, Clone)] | |
| #[repr(C)] | |
| pub struct timeval { | |
| pub tv_sec: __time_t, | |
| pub tv_usec: __suseconds_t, | |
| } | |
| pub type bezctx = _bezctx; | |
| #[derive(Copy, Clone)] | |
| #[repr(C)] | |
| pub struct spiro_cp { | |
| pub x: libc::c_double, | |
| pub y: libc::c_double, | |
| pub ty: libc::c_char, | |
| } | |
| /* | |
| ppedit - A pattern plate editor for Spiro splines. | |
| Copyright (C) 2007 Raph Levien | |
| Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
| http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
| <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
| option. This file may not be copied, modified, or distributed | |
| except according to those terms. | |
| */ | |
| /* C implementation of third-order polynomial spirals. */ | |
| #[derive(Copy, Clone)] | |
| #[repr(C)] | |
| pub struct spiro_seg_s { | |
| pub x: libc::c_double, | |
| pub y: libc::c_double, | |
| pub ty: libc::c_char, | |
| pub bend_th: libc::c_double, | |
| pub ks: [libc::c_double; 4], | |
| pub seg_ch: libc::c_double, | |
| pub seg_th: libc::c_double, | |
| pub l: libc::c_double, | |
| } | |
| pub type spiro_seg = spiro_seg_s; | |
| #[derive(Copy, Clone)] | |
| #[repr(C)] | |
| pub struct bandmat { | |
| pub a: [libc::c_double; 11], | |
| pub al: [libc::c_double; 5], | |
| } | |
| #[derive(Copy, Clone)] | |
| #[repr(C)] | |
| pub struct timezone { | |
| pub tz_minuteswest: libc::c_int, | |
| pub tz_dsttime: libc::c_int, | |
| } | |
| #[no_mangle] | |
| pub static mut n: libc::c_int = 4 as libc::c_int; | |
| /* Integrate polynomial spiral curve over range -.5 .. .5. */ | |
| #[no_mangle] | |
| pub unsafe extern "C" fn integrate_spiro(mut ks: *const libc::c_double, | |
| mut xy: *mut libc::c_double) { | |
| let mut th1: libc::c_double = *ks.offset(0 as libc::c_int as isize); | |
| let mut th2: libc::c_double = | |
| 0.5f64 * *ks.offset(1 as libc::c_int as isize); | |
| let mut th3: libc::c_double = | |
| 1.0f64 / 6 as libc::c_int as libc::c_double * | |
| *ks.offset(2 as libc::c_int as isize); | |
| let mut th4: libc::c_double = | |
| 1.0f64 / 24 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| let mut x: libc::c_double = 0.; | |
| let mut y: libc::c_double = 0.; | |
| let mut ds: libc::c_double = 1.0f64 / n as libc::c_double; | |
| let mut ds2: libc::c_double = ds * ds; | |
| let mut ds3: libc::c_double = ds2 * ds; | |
| let mut k0: libc::c_double = *ks.offset(0 as libc::c_int as isize) * ds; | |
| let mut k1: libc::c_double = *ks.offset(1 as libc::c_int as isize) * ds; | |
| let mut k2: libc::c_double = *ks.offset(2 as libc::c_int as isize) * ds; | |
| let mut k3: libc::c_double = *ks.offset(3 as libc::c_int as isize) * ds; | |
| let mut i: libc::c_int = 0; | |
| let mut s: libc::c_double = 0.5f64 * ds - 0.5f64; | |
| x = 0 as libc::c_int as libc::c_double; | |
| y = 0 as libc::c_int as libc::c_double; | |
| i = 0 as libc::c_int; | |
| while i < n { | |
| let mut u: libc::c_double = 0.; | |
| let mut v: libc::c_double = 0.; | |
| let mut km0: libc::c_double = 0.; | |
| let mut km1: libc::c_double = 0.; | |
| let mut km2: libc::c_double = 0.; | |
| let mut km3: libc::c_double = 0.; | |
| if n == 1 as libc::c_int { | |
| km0 = k0; | |
| km1 = k1 * ds; | |
| km2 = k2 * ds2 | |
| } else { | |
| km0 = | |
| ((1.0f64 / 6 as libc::c_int as libc::c_double * k3 * s + | |
| 0.5f64 * k2) * s + k1) * s + k0; | |
| km1 = ((0.5f64 * k3 * s + k2) * s + k1) * ds; | |
| km2 = (k3 * s + k2) * ds2 | |
| } | |
| km3 = k3 * ds3; | |
| let mut t1_1: libc::c_double = km0; | |
| let mut t1_2: libc::c_double = 0.5f64 * km1; | |
| let mut t1_3: libc::c_double = | |
| 1.0f64 / 6 as libc::c_int as libc::c_double * km2; | |
| let mut t1_4: libc::c_double = | |
| 1.0f64 / 24 as libc::c_int as libc::c_double * km3; | |
| let mut t2_2: libc::c_double = t1_1 * t1_1; | |
| let mut t2_3: libc::c_double = | |
| 2 as libc::c_int as libc::c_double * (t1_1 * t1_2); | |
| let mut t2_4: libc::c_double = | |
| 2 as libc::c_int as libc::c_double * (t1_1 * t1_3) + t1_2 * t1_2; | |
| let mut t2_5: libc::c_double = | |
| 2 as libc::c_int as libc::c_double * (t1_1 * t1_4 + t1_2 * t1_3); | |
| let mut t2_6: libc::c_double = | |
| 2 as libc::c_int as libc::c_double * (t1_2 * t1_4) + t1_3 * t1_3; | |
| let mut t2_7: libc::c_double = | |
| 2 as libc::c_int as libc::c_double * (t1_3 * t1_4); | |
| let mut t2_8: libc::c_double = t1_4 * t1_4; | |
| let mut t3_4: libc::c_double = t2_2 * t1_2 + t2_3 * t1_1; | |
| let mut t3_6: libc::c_double = | |
| t2_2 * t1_4 + t2_3 * t1_3 + t2_4 * t1_2 + t2_5 * t1_1; | |
| let mut t3_8: libc::c_double = | |
| t2_4 * t1_4 + t2_5 * t1_3 + t2_6 * t1_2 + t2_7 * t1_1; | |
| let mut t3_10: libc::c_double = | |
| t2_6 * t1_4 + t2_7 * t1_3 + t2_8 * t1_2; | |
| let mut t4_4: libc::c_double = t2_2 * t2_2; | |
| let mut t4_5: libc::c_double = | |
| 2 as libc::c_int as libc::c_double * (t2_2 * t2_3); | |
| let mut t4_6: libc::c_double = | |
| 2 as libc::c_int as libc::c_double * (t2_2 * t2_4) + t2_3 * t2_3; | |
| let mut t4_7: libc::c_double = | |
| 2 as libc::c_int as libc::c_double * (t2_2 * t2_5 + t2_3 * t2_4); | |
| let mut t4_8: libc::c_double = | |
| 2 as libc::c_int as libc::c_double * (t2_2 * t2_6 + t2_3 * t2_5) + | |
| t2_4 * t2_4; | |
| let mut t4_9: libc::c_double = | |
| 2 as libc::c_int as libc::c_double * | |
| (t2_2 * t2_7 + t2_3 * t2_6 + t2_4 * t2_5); | |
| let mut t4_10: libc::c_double = | |
| 2 as libc::c_int as libc::c_double * | |
| (t2_2 * t2_8 + t2_3 * t2_7 + t2_4 * t2_6) + t2_5 * t2_5; | |
| let mut t5_6: libc::c_double = t4_4 * t1_2 + t4_5 * t1_1; | |
| let mut t5_8: libc::c_double = | |
| t4_4 * t1_4 + t4_5 * t1_3 + t4_6 * t1_2 + t4_7 * t1_1; | |
| let mut t5_10: libc::c_double = | |
| t4_6 * t1_4 + t4_7 * t1_3 + t4_8 * t1_2 + t4_9 * t1_1; | |
| let mut t6_6: libc::c_double = t4_4 * t2_2; | |
| let mut t6_7: libc::c_double = t4_4 * t2_3 + t4_5 * t2_2; | |
| let mut t6_8: libc::c_double = | |
| t4_4 * t2_4 + t4_5 * t2_3 + t4_6 * t2_2; | |
| let mut t6_9: libc::c_double = | |
| t4_4 * t2_5 + t4_5 * t2_4 + t4_6 * t2_3 + t4_7 * t2_2; | |
| let mut t6_10: libc::c_double = | |
| t4_4 * t2_6 + t4_5 * t2_5 + t4_6 * t2_4 + t4_7 * t2_3 + | |
| t4_8 * t2_2; | |
| let mut t7_8: libc::c_double = t6_6 * t1_2 + t6_7 * t1_1; | |
| let mut t7_10: libc::c_double = | |
| t6_6 * t1_4 + t6_7 * t1_3 + t6_8 * t1_2 + t6_9 * t1_1; | |
| let mut t8_8: libc::c_double = t6_6 * t2_2; | |
| let mut t8_9: libc::c_double = t6_6 * t2_3 + t6_7 * t2_2; | |
| let mut t8_10: libc::c_double = | |
| t6_6 * t2_4 + t6_7 * t2_3 + t6_8 * t2_2; | |
| let mut t9_10: libc::c_double = t8_8 * t1_2 + t8_9 * t1_1; | |
| let mut t10_10: libc::c_double = t8_8 * t2_2; | |
| u = 1 as libc::c_int as libc::c_double; | |
| v = 0 as libc::c_int as libc::c_double; | |
| v += | |
| 1.0f64 / 12 as libc::c_int as libc::c_double * t1_2 + | |
| 1.0f64 / 80 as libc::c_int as libc::c_double * t1_4; | |
| u -= | |
| 1.0f64 / 24 as libc::c_int as libc::c_double * t2_2 + | |
| 1.0f64 / 160 as libc::c_int as libc::c_double * t2_4 + | |
| 1.0f64 / 896 as libc::c_int as libc::c_double * t2_6 + | |
| 1.0f64 / 4608 as libc::c_int as libc::c_double * t2_8; | |
| v -= | |
| 1.0f64 / 480 as libc::c_int as libc::c_double * t3_4 + | |
| 1.0f64 / 2688 as libc::c_int as libc::c_double * t3_6 + | |
| 1.0f64 / 13824 as libc::c_int as libc::c_double * t3_8 + | |
| 1.0f64 / 67584 as libc::c_int as libc::c_double * t3_10; | |
| u += | |
| 1.0f64 / 1920 as libc::c_int as libc::c_double * t4_4 + | |
| 1.0f64 / 10752 as libc::c_int as libc::c_double * t4_6 + | |
| 1.0f64 / 55296 as libc::c_int as libc::c_double * t4_8 + | |
| 1.0f64 / 270336 as libc::c_int as libc::c_double * t4_10; | |
| v += | |
| 1.0f64 / 53760 as libc::c_int as libc::c_double * t5_6 + | |
| 1.0f64 / 276480 as libc::c_int as libc::c_double * t5_8 + | |
| 1.0f64 / 1.35168e+06f64 * t5_10; | |
| u -= | |
| 1.0f64 / 322560 as libc::c_int as libc::c_double * t6_6 + | |
| 1.0f64 / 1.65888e+06f64 * t6_8 + | |
| 1.0f64 / 8.11008e+06f64 * t6_10; | |
| v -= 1.0f64 / 1.16122e+07f64 * t7_8 + 1.0f64 / 5.67706e+07f64 * t7_10; | |
| u += 1.0f64 / 9.28973e+07f64 * t8_8 + 1.0f64 / 4.54164e+08f64 * t8_10; | |
| v += 1.0f64 / 4.08748e+09f64 * t9_10; | |
| u -= 1.0f64 / 4.08748e+10f64 * t10_10; | |
| if n == 1 as libc::c_int { | |
| x = u; | |
| y = v | |
| } else { | |
| let mut th: libc::c_double = | |
| (((th4 * s + th3) * s + th2) * s + th1) * s; | |
| let mut cth: libc::c_double = cos(th); | |
| let mut sth: libc::c_double = sin(th); | |
| x += cth * u - sth * v; | |
| y += cth * v + sth * u; | |
| s += ds | |
| } | |
| i += 1 | |
| } | |
| *xy.offset(0 as libc::c_int as isize) = x * ds; | |
| *xy.offset(1 as libc::c_int as isize) = y * ds; | |
| } | |
| unsafe extern "C" fn compute_ends(mut ks: *const libc::c_double, | |
| mut ends: *mut [libc::c_double; 4], | |
| mut seg_ch: libc::c_double) | |
| -> libc::c_double { | |
| let mut xy: [libc::c_double; 2] = [0.; 2]; | |
| let mut ch: libc::c_double = 0.; | |
| let mut th: libc::c_double = 0.; | |
| let mut l: libc::c_double = 0.; | |
| let mut l2: libc::c_double = 0.; | |
| let mut l3: libc::c_double = 0.; | |
| let mut th_even: libc::c_double = 0.; | |
| let mut th_odd: libc::c_double = 0.; | |
| let mut k0_even: libc::c_double = 0.; | |
| let mut k0_odd: libc::c_double = 0.; | |
| let mut k1_even: libc::c_double = 0.; | |
| let mut k1_odd: libc::c_double = 0.; | |
| let mut k2_even: libc::c_double = 0.; | |
| let mut k2_odd: libc::c_double = 0.; | |
| integrate_spiro(ks, xy.as_mut_ptr()); | |
| ch = hypot(xy[0 as libc::c_int as usize], xy[1 as libc::c_int as usize]); | |
| th = atan2(xy[1 as libc::c_int as usize], xy[0 as libc::c_int as usize]); | |
| l = ch / seg_ch; | |
| th_even = | |
| 0.5f64 * *ks.offset(0 as libc::c_int as isize) + | |
| 1.0f64 / 48 as libc::c_int as libc::c_double * | |
| *ks.offset(2 as libc::c_int as isize); | |
| th_odd = | |
| 0.125f64 * *ks.offset(1 as libc::c_int as isize) + | |
| 1.0f64 / 384 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize) - th; | |
| (*ends.offset(0 as libc::c_int as isize))[0 as libc::c_int as usize] = | |
| th_even - th_odd; | |
| (*ends.offset(1 as libc::c_int as isize))[0 as libc::c_int as usize] = | |
| th_even + th_odd; | |
| k0_even = | |
| l * | |
| (*ks.offset(0 as libc::c_int as isize) + | |
| 0.125f64 * *ks.offset(2 as libc::c_int as isize)); | |
| k0_odd = | |
| l * | |
| (0.5f64 * *ks.offset(1 as libc::c_int as isize) + | |
| 1.0f64 / 48 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize)); | |
| (*ends.offset(0 as libc::c_int as isize))[1 as libc::c_int as usize] = | |
| k0_even - k0_odd; | |
| (*ends.offset(1 as libc::c_int as isize))[1 as libc::c_int as usize] = | |
| k0_even + k0_odd; | |
| l2 = l * l; | |
| k1_even = | |
| l2 * | |
| (*ks.offset(1 as libc::c_int as isize) + | |
| 0.125f64 * *ks.offset(3 as libc::c_int as isize)); | |
| k1_odd = l2 * 0.5f64 * *ks.offset(2 as libc::c_int as isize); | |
| (*ends.offset(0 as libc::c_int as isize))[2 as libc::c_int as usize] = | |
| k1_even - k1_odd; | |
| (*ends.offset(1 as libc::c_int as isize))[2 as libc::c_int as usize] = | |
| k1_even + k1_odd; | |
| l3 = l2 * l; | |
| k2_even = l3 * *ks.offset(2 as libc::c_int as isize); | |
| k2_odd = l3 * 0.5f64 * *ks.offset(3 as libc::c_int as isize); | |
| (*ends.offset(0 as libc::c_int as isize))[3 as libc::c_int as usize] = | |
| k2_even - k2_odd; | |
| (*ends.offset(1 as libc::c_int as isize))[3 as libc::c_int as usize] = | |
| k2_even + k2_odd; | |
| return l; | |
| } | |
| unsafe extern "C" fn compute_pderivs(mut s: *const spiro_seg, | |
| mut ends: *mut [libc::c_double; 4], | |
| mut derivs: | |
| *mut [[libc::c_double; 4]; 2], | |
| mut jinc: libc::c_int) { | |
| let mut recip_d: libc::c_double = 2e6f64; | |
| let mut delta: libc::c_double = 1.0f64 / recip_d; | |
| let mut try_ks: [libc::c_double; 4] = [0.; 4]; | |
| let mut try_ends: [[libc::c_double; 4]; 2] = [[0.; 4]; 2]; | |
| let mut i: libc::c_int = 0; | |
| let mut j: libc::c_int = 0; | |
| let mut k: libc::c_int = 0; | |
| compute_ends((*s).ks.as_ptr(), ends, (*s).seg_ch); | |
| i = 0 as libc::c_int; | |
| while i < jinc { | |
| j = 0 as libc::c_int; | |
| while j < 4 as libc::c_int { | |
| try_ks[j as usize] = (*s).ks[j as usize]; | |
| j += 1 | |
| } | |
| try_ks[i as usize] += delta; | |
| compute_ends(try_ks.as_mut_ptr() as *const libc::c_double, | |
| try_ends.as_mut_ptr(), (*s).seg_ch); | |
| k = 0 as libc::c_int; | |
| while k < 2 as libc::c_int { | |
| j = 0 as libc::c_int; | |
| while j < 4 as libc::c_int { | |
| (*derivs.offset(j as isize))[k as usize][i as usize] = | |
| recip_d * | |
| (try_ends[k as usize][j as usize] - | |
| (*ends.offset(k as isize))[j as usize]); | |
| j += 1 | |
| } | |
| k += 1 | |
| } | |
| i += 1 | |
| }; | |
| } | |
| unsafe extern "C" fn mod_2pi(mut th: libc::c_double) -> libc::c_double { | |
| let mut u: libc::c_double = | |
| th / (2 as libc::c_int as libc::c_double * 3.14159265358979323846f64); | |
| return 2 as libc::c_int as libc::c_double * 3.14159265358979323846f64 * | |
| (u - floor(u + 0.5f64)); | |
| } | |
| unsafe extern "C" fn setup_path(mut src: *const spiro_cp, | |
| mut n_0: libc::c_int) -> *mut spiro_seg { | |
| let mut n_seg: libc::c_int = | |
| if (*src.offset(0 as libc::c_int as isize)).ty as libc::c_int == | |
| '{' as i32 { | |
| (n_0) - 1 as libc::c_int | |
| } else { n_0 }; | |
| let mut r: *mut spiro_seg = | |
| malloc(((n_seg + 1 as libc::c_int) as | |
| libc::c_ulong).wrapping_mul(::std::mem::size_of::<spiro_seg>() | |
| as libc::c_ulong)) as | |
| *mut spiro_seg; | |
| let mut i: libc::c_int = 0; | |
| let mut ilast: libc::c_int = 0; | |
| i = 0 as libc::c_int; | |
| while i < n_seg { | |
| (*r.offset(i as isize)).x = (*src.offset(i as isize)).x; | |
| (*r.offset(i as isize)).y = (*src.offset(i as isize)).y; | |
| (*r.offset(i as isize)).ty = (*src.offset(i as isize)).ty; | |
| (*r.offset(i as isize)).ks[0 as libc::c_int as usize] = 0.0f64; | |
| (*r.offset(i as isize)).ks[1 as libc::c_int as usize] = 0.0f64; | |
| (*r.offset(i as isize)).ks[2 as libc::c_int as usize] = 0.0f64; | |
| (*r.offset(i as isize)).ks[3 as libc::c_int as usize] = 0.0f64; | |
| i += 1 | |
| } | |
| (*r.offset(n_seg as isize)).x = (*src.offset((n_seg % n_0) as isize)).x; | |
| (*r.offset(n_seg as isize)).y = (*src.offset((n_seg % n_0) as isize)).y; | |
| (*r.offset(n_seg as isize)).ty = (*src.offset((n_seg % n_0) as isize)).ty; | |
| i = 0 as libc::c_int; | |
| while i < n_seg { | |
| let mut dx: libc::c_double = | |
| (*r.offset((i + 1 as libc::c_int) as isize)).x - | |
| (*r.offset(i as isize)).x; | |
| let mut dy: libc::c_double = | |
| (*r.offset((i + 1 as libc::c_int) as isize)).y - | |
| (*r.offset(i as isize)).y; | |
| (*r.offset(i as isize)).seg_ch = hypot(dx, dy); | |
| (*r.offset(i as isize)).seg_th = atan2(dy, dx); | |
| i += 1 | |
| } | |
| ilast = n_seg - 1 as libc::c_int; | |
| i = 0 as libc::c_int; | |
| while i < n_seg { | |
| if (*r.offset(i as isize)).ty as libc::c_int == '{' as i32 || | |
| (*r.offset(i as isize)).ty as libc::c_int == '}' as i32 || | |
| (*r.offset(i as isize)).ty as libc::c_int == 'v' as i32 { | |
| (*r.offset(i as isize)).bend_th = 0.0f64 | |
| } else { | |
| (*r.offset(i as isize)).bend_th = | |
| mod_2pi((*r.offset(i as isize)).seg_th - | |
| (*r.offset(ilast as isize)).seg_th) | |
| } | |
| ilast = i; | |
| i += 1 | |
| } | |
| return r; | |
| } | |
| unsafe extern "C" fn bandec11(mut m: *mut bandmat, mut perm: *mut libc::c_int, | |
| mut n_0: libc::c_int) { | |
| let mut i: libc::c_int = 0; | |
| let mut j: libc::c_int = 0; | |
| let mut k: libc::c_int = 0; | |
| let mut l: libc::c_int = 0; | |
| /* pack top triangle to the left. */ | |
| i = 0 as libc::c_int; | |
| while i < 5 as libc::c_int { | |
| j = 0 as libc::c_int; | |
| while j < i + 6 as libc::c_int { | |
| (*m.offset(i as isize)).a[j as usize] = | |
| (*m.offset(i as | |
| isize)).a[(j + 5 as libc::c_int - i) as usize]; | |
| j += 1 | |
| } | |
| while j < 11 as libc::c_int { | |
| (*m.offset(i as isize)).a[j as usize] = 0.0f64; | |
| j += 1 | |
| } | |
| i += 1 | |
| } | |
| l = 5 as libc::c_int; | |
| k = 0 as libc::c_int; | |
| while k < n_0 { | |
| let mut pivot: libc::c_int = k; | |
| let mut pivot_val: libc::c_double = | |
| (*m.offset(k as isize)).a[0 as libc::c_int as usize]; | |
| let mut pivot_scale: libc::c_double = 0.; | |
| if l < n_0 { l += 1 } | |
| j = k + 1 as libc::c_int; | |
| while j < l { | |
| if fabs((*m.offset(j as isize)).a[0 as libc::c_int as usize]) > | |
| fabs(pivot_val) { | |
| pivot_val = | |
| (*m.offset(j as isize)).a[0 as libc::c_int as usize]; | |
| pivot = j | |
| } | |
| j += 1 | |
| } | |
| *perm.offset(k as isize) = pivot; | |
| if pivot != k { | |
| j = 0 as libc::c_int; | |
| while j < 11 as libc::c_int { | |
| let mut tmp: libc::c_double = | |
| (*m.offset(k as isize)).a[j as usize]; | |
| (*m.offset(k as isize)).a[j as usize] = | |
| (*m.offset(pivot as isize)).a[j as usize]; | |
| (*m.offset(pivot as isize)).a[j as usize] = tmp; | |
| j += 1 | |
| } | |
| } | |
| if fabs(pivot_val) < 1e-12f64 { pivot_val = 1e-12f64 } | |
| pivot_scale = 1.0f64 / pivot_val; | |
| i = k + 1 as libc::c_int; | |
| while i < l { | |
| let mut x: libc::c_double = | |
| (*m.offset(i as isize)).a[0 as libc::c_int as usize] * | |
| pivot_scale; | |
| (*m.offset(k as isize)).al[(i - k - 1 as libc::c_int) as usize] = | |
| x; | |
| j = 1 as libc::c_int; | |
| while j < 11 as libc::c_int { | |
| (*m.offset(i as isize)).a[(j - 1 as libc::c_int) as usize] = | |
| (*m.offset(i as isize)).a[j as usize] - | |
| x * (*m.offset(k as isize)).a[j as usize]; | |
| j += 1 | |
| } | |
| (*m.offset(i as isize)).a[10 as libc::c_int as usize] = 0.0f64; | |
| i += 1 | |
| } | |
| k += 1 | |
| }; | |
| } | |
| unsafe extern "C" fn banbks11(mut m: *const bandmat, | |
| mut perm: *const libc::c_int, | |
| mut v: *mut libc::c_double, | |
| mut n_0: libc::c_int) { | |
| let mut i: libc::c_int = 0; | |
| let mut k: libc::c_int = 0; | |
| let mut l: libc::c_int = 0; | |
| /* forward substitution */ | |
| l = 5 as libc::c_int; | |
| k = 0 as libc::c_int; | |
| while k < n_0 { | |
| i = *perm.offset(k as isize); | |
| if i != k { | |
| let mut tmp: libc::c_double = *v.offset(k as isize); | |
| *v.offset(k as isize) = *v.offset(i as isize); | |
| *v.offset(i as isize) = tmp | |
| } | |
| if l < n_0 { l += 1 } | |
| i = k + 1 as libc::c_int; | |
| while i < l { | |
| *v.offset(i as isize) -= | |
| (*m.offset(k as | |
| isize)).al[(i - k - 1 as libc::c_int) as usize] | |
| * *v.offset(k as isize); | |
| i += 1 | |
| } | |
| k += 1 | |
| } | |
| /* back substitution */ | |
| l = 1 as libc::c_int; | |
| i = n_0 - 1 as libc::c_int; | |
| while i >= 0 as libc::c_int { | |
| let mut x: libc::c_double = *v.offset(i as isize); | |
| k = 1 as libc::c_int; | |
| while k < l { | |
| x -= | |
| (*m.offset(i as isize)).a[k as usize] * | |
| *v.offset((k + i) as isize); | |
| k += 1 | |
| } | |
| *v.offset(i as isize) = | |
| x / (*m.offset(i as isize)).a[0 as libc::c_int as usize]; | |
| if l < 11 as libc::c_int { l += 1 } | |
| i -= 1 | |
| }; | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn compute_jinc(mut ty0: libc::c_char, | |
| mut ty1: libc::c_char) -> libc::c_int { | |
| if ty0 as libc::c_int == 'o' as i32 || ty1 as libc::c_int == 'o' as i32 || | |
| ty0 as libc::c_int == ']' as i32 || | |
| ty1 as libc::c_int == '[' as i32 { | |
| return 4 as libc::c_int | |
| } else if ty0 as libc::c_int == 'c' as i32 && | |
| ty1 as libc::c_int == 'c' as i32 { | |
| return 2 as libc::c_int | |
| } else if (ty0 as libc::c_int == '{' as i32 || | |
| ty0 as libc::c_int == 'v' as i32 || | |
| ty0 as libc::c_int == '[' as i32) && | |
| ty1 as libc::c_int == 'c' as i32 || | |
| ty0 as libc::c_int == 'c' as i32 && | |
| (ty1 as libc::c_int == '}' as i32 || | |
| ty1 as libc::c_int == 'v' as i32 || | |
| ty1 as libc::c_int == ']' as i32) { | |
| return 1 as libc::c_int | |
| } else { return 0 as libc::c_int }; | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn count_vec(mut s: *const spiro_seg, | |
| mut nseg: libc::c_int) -> libc::c_int { | |
| let mut i: libc::c_int = 0; | |
| let mut n_0: libc::c_int = 0 as libc::c_int; | |
| i = 0 as libc::c_int; | |
| while i < nseg { | |
| n_0 += | |
| compute_jinc((*s.offset(i as isize)).ty, | |
| (*s.offset((i + 1 as libc::c_int) as isize)).ty); | |
| i += 1 | |
| } | |
| return n_0; | |
| } | |
| unsafe extern "C" fn add_mat_line(mut m: *mut bandmat, | |
| mut v: *mut libc::c_double, | |
| mut derivs: *mut libc::c_double, | |
| mut x: libc::c_double, | |
| mut y: libc::c_double, mut j: libc::c_int, | |
| mut jj: libc::c_int, mut jinc: libc::c_int, | |
| mut nmat: libc::c_int) { | |
| let mut k: libc::c_int = 0; | |
| if jj >= 0 as libc::c_int { | |
| let mut joff: libc::c_int = (j + 5 as libc::c_int - jj + nmat) % nmat; | |
| *v.offset(jj as isize) += x; | |
| k = 0 as libc::c_int; | |
| while k < jinc { | |
| (*m.offset(jj as isize)).a[(joff + k) as usize] += | |
| y * *derivs.offset(k as isize); | |
| k += 1 | |
| } | |
| }; | |
| } | |
| unsafe extern "C" fn spiro_iter(mut s: *mut spiro_seg, mut m: *mut bandmat, | |
| mut perm: *mut libc::c_int, | |
| mut v: *mut libc::c_double, | |
| mut n_0: libc::c_int) -> libc::c_double { | |
| let mut cyclic: libc::c_int = | |
| ((*s.offset(0 as libc::c_int as isize)).ty as libc::c_int != | |
| '{' as i32 && | |
| (*s.offset(0 as libc::c_int as isize)).ty as libc::c_int != | |
| 'v' as i32) as libc::c_int; | |
| let mut i: libc::c_int = 0; | |
| let mut j: libc::c_int = 0; | |
| let mut jj: libc::c_int = 0; | |
| let mut nmat: libc::c_int = count_vec(s, n_0); | |
| let mut norm: libc::c_double = 0.; | |
| let mut n_invert: libc::c_int = 0; | |
| i = 0 as libc::c_int; | |
| while i < nmat { | |
| *v.offset(i as isize) = 0.0f64; | |
| j = 0 as libc::c_int; | |
| while j < 11 as libc::c_int { | |
| (*m.offset(i as isize)).a[j as usize] = 0.0f64; | |
| j += 1 | |
| } | |
| j = 0 as libc::c_int; | |
| while j < 5 as libc::c_int { | |
| (*m.offset(i as isize)).al[j as usize] = 0.0f64; | |
| j += 1 | |
| } | |
| i += 1 | |
| } | |
| j = 0 as libc::c_int; | |
| if (*s.offset(0 as libc::c_int as isize)).ty as libc::c_int == 'o' as i32 | |
| { | |
| jj = nmat - 2 as libc::c_int | |
| } else if (*s.offset(0 as libc::c_int as isize)).ty as libc::c_int == | |
| 'c' as i32 || | |
| (*s.offset(0 as libc::c_int as isize)).ty as libc::c_int == | |
| '[' as i32 || | |
| (*s.offset(0 as libc::c_int as isize)).ty as libc::c_int == | |
| ']' as i32 { | |
| jj = nmat - 1 as libc::c_int | |
| } else { jj = 0 as libc::c_int } | |
| i = 0 as libc::c_int; | |
| while i < n_0 { | |
| let mut ty0: libc::c_char = (*s.offset(i as isize)).ty; | |
| let mut ty1: libc::c_char = | |
| (*s.offset((i + 1 as libc::c_int) as isize)).ty; | |
| let mut jinc: libc::c_int = compute_jinc(ty0, ty1); | |
| let mut th: libc::c_double = (*s.offset(i as isize)).bend_th; | |
| let mut ends: [[libc::c_double; 4]; 2] = [[0.; 4]; 2]; | |
| let mut derivs: [[[libc::c_double; 4]; 2]; 4] = [[[0.; 4]; 2]; 4]; | |
| let mut jthl: libc::c_int = -(1 as libc::c_int); | |
| let mut jk0l: libc::c_int = -(1 as libc::c_int); | |
| let mut jk1l: libc::c_int = -(1 as libc::c_int); | |
| let mut jk2l: libc::c_int = -(1 as libc::c_int); | |
| let mut jthr: libc::c_int = -(1 as libc::c_int); | |
| let mut jk0r: libc::c_int = -(1 as libc::c_int); | |
| let mut jk1r: libc::c_int = -(1 as libc::c_int); | |
| let mut jk2r: libc::c_int = -(1 as libc::c_int); | |
| compute_pderivs(&mut *s.offset(i as isize), ends.as_mut_ptr(), | |
| derivs.as_mut_ptr(), jinc); | |
| /* constraints crossing left */ | |
| if ty0 as libc::c_int == 'o' as i32 || | |
| ty0 as libc::c_int == 'c' as i32 || | |
| ty0 as libc::c_int == '[' as i32 || | |
| ty0 as libc::c_int == ']' as i32 { | |
| let fresh0 = jj; | |
| jj = jj + 1; | |
| jthl = fresh0; | |
| jj %= nmat; | |
| let fresh1 = jj; | |
| jj = jj + 1; | |
| jk0l = fresh1 | |
| } | |
| if ty0 as libc::c_int == 'o' as i32 { | |
| jj %= nmat; | |
| let fresh2 = jj; | |
| jj = jj + 1; | |
| jk1l = fresh2; | |
| let fresh3 = jj; | |
| jj = jj + 1; | |
| jk2l = fresh3 | |
| } | |
| /* constraints on left */ | |
| if (ty0 as libc::c_int == '[' as i32 || | |
| ty0 as libc::c_int == 'v' as i32 || | |
| ty0 as libc::c_int == '{' as i32 || | |
| ty0 as libc::c_int == 'c' as i32) && jinc == 4 as libc::c_int | |
| { | |
| if ty0 as libc::c_int != 'c' as i32 { | |
| let fresh4 = jj; | |
| jj = jj + 1; | |
| jk1l = fresh4 | |
| } | |
| let fresh5 = jj; | |
| jj = jj + 1; | |
| jk2l = fresh5 | |
| } | |
| /* constraints on right */ | |
| if (ty1 as libc::c_int == ']' as i32 || | |
| ty1 as libc::c_int == 'v' as i32 || | |
| ty1 as libc::c_int == '}' as i32 || | |
| ty1 as libc::c_int == 'c' as i32) && jinc == 4 as libc::c_int | |
| { | |
| if ty1 as libc::c_int != 'c' as i32 { | |
| let fresh6 = jj; | |
| jj = jj + 1; | |
| jk1r = fresh6 | |
| } | |
| let fresh7 = jj; | |
| jj = jj + 1; | |
| jk2r = fresh7 | |
| } | |
| /* constraints crossing right */ | |
| if ty1 as libc::c_int == 'o' as i32 || | |
| ty1 as libc::c_int == 'c' as i32 || | |
| ty1 as libc::c_int == '[' as i32 || | |
| ty1 as libc::c_int == ']' as i32 { | |
| jthr = jj; | |
| jk0r = (jj + 1 as libc::c_int) % nmat | |
| } | |
| if ty1 as libc::c_int == 'o' as i32 { | |
| jk1r = (jj + 2 as libc::c_int) % nmat; | |
| jk2r = (jj + 3 as libc::c_int) % nmat | |
| } | |
| add_mat_line(m, v, | |
| derivs[0 as libc::c_int as | |
| usize][0 as libc::c_int as | |
| usize].as_mut_ptr(), | |
| th - | |
| ends[0 as libc::c_int as | |
| usize][0 as libc::c_int as usize], | |
| 1 as libc::c_int as libc::c_double, j, jthl, jinc, nmat); | |
| add_mat_line(m, v, | |
| derivs[1 as libc::c_int as | |
| usize][0 as libc::c_int as | |
| usize].as_mut_ptr(), | |
| ends[0 as libc::c_int as | |
| usize][1 as libc::c_int as usize], | |
| -(1 as libc::c_int) as libc::c_double, j, jk0l, jinc, | |
| nmat); | |
| add_mat_line(m, v, | |
| derivs[2 as libc::c_int as | |
| usize][0 as libc::c_int as | |
| usize].as_mut_ptr(), | |
| ends[0 as libc::c_int as | |
| usize][2 as libc::c_int as usize], | |
| -(1 as libc::c_int) as libc::c_double, j, jk1l, jinc, | |
| nmat); | |
| add_mat_line(m, v, | |
| derivs[3 as libc::c_int as | |
| usize][0 as libc::c_int as | |
| usize].as_mut_ptr(), | |
| ends[0 as libc::c_int as | |
| usize][3 as libc::c_int as usize], | |
| -(1 as libc::c_int) as libc::c_double, j, jk2l, jinc, | |
| nmat); | |
| add_mat_line(m, v, | |
| derivs[0 as libc::c_int as | |
| usize][1 as libc::c_int as | |
| usize].as_mut_ptr(), | |
| -ends[1 as libc::c_int as | |
| usize][0 as libc::c_int as usize], | |
| 1 as libc::c_int as libc::c_double, j, jthr, jinc, nmat); | |
| add_mat_line(m, v, | |
| derivs[1 as libc::c_int as | |
| usize][1 as libc::c_int as | |
| usize].as_mut_ptr(), | |
| -ends[1 as libc::c_int as | |
| usize][1 as libc::c_int as usize], | |
| 1 as libc::c_int as libc::c_double, j, jk0r, jinc, nmat); | |
| add_mat_line(m, v, | |
| derivs[2 as libc::c_int as | |
| usize][1 as libc::c_int as | |
| usize].as_mut_ptr(), | |
| -ends[1 as libc::c_int as | |
| usize][2 as libc::c_int as usize], | |
| 1 as libc::c_int as libc::c_double, j, jk1r, jinc, nmat); | |
| add_mat_line(m, v, | |
| derivs[3 as libc::c_int as | |
| usize][1 as libc::c_int as | |
| usize].as_mut_ptr(), | |
| -ends[1 as libc::c_int as | |
| usize][3 as libc::c_int as usize], | |
| 1 as libc::c_int as libc::c_double, j, jk2r, jinc, nmat); | |
| j += jinc; | |
| i += 1 | |
| } | |
| if cyclic != 0 { | |
| memcpy(m.offset(nmat as isize) as *mut libc::c_void, | |
| m as *const libc::c_void, | |
| (::std::mem::size_of::<bandmat>() as | |
| libc::c_ulong).wrapping_mul(nmat as libc::c_ulong)); | |
| memcpy(m.offset((2 as libc::c_int * nmat) as isize) as | |
| *mut libc::c_void, m as *const libc::c_void, | |
| (::std::mem::size_of::<bandmat>() as | |
| libc::c_ulong).wrapping_mul(nmat as libc::c_ulong)); | |
| memcpy(v.offset(nmat as isize) as *mut libc::c_void, | |
| v as *const libc::c_void, | |
| (::std::mem::size_of::<libc::c_double>() as | |
| libc::c_ulong).wrapping_mul(nmat as libc::c_ulong)); | |
| memcpy(v.offset((2 as libc::c_int * nmat) as isize) as | |
| *mut libc::c_void, v as *const libc::c_void, | |
| (::std::mem::size_of::<libc::c_double>() as | |
| libc::c_ulong).wrapping_mul(nmat as libc::c_ulong)); | |
| n_invert = 3 as libc::c_int * nmat; | |
| j = nmat | |
| } else { n_invert = nmat; j = 0 as libc::c_int } | |
| bandec11(m, perm, n_invert); | |
| banbks11(m, perm, v, n_invert); | |
| norm = 0.0f64; | |
| i = 0 as libc::c_int; | |
| while i < n_0 { | |
| let mut ty0_0: libc::c_char = (*s.offset(i as isize)).ty; | |
| let mut ty1_0: libc::c_char = | |
| (*s.offset((i + 1 as libc::c_int) as isize)).ty; | |
| let mut jinc_0: libc::c_int = compute_jinc(ty0_0, ty1_0); | |
| let mut k: libc::c_int = 0; | |
| k = 0 as libc::c_int; | |
| while k < jinc_0 { | |
| let fresh8 = j; | |
| j = j + 1; | |
| let mut dk: libc::c_double = *v.offset(fresh8 as isize); | |
| (*s.offset(i as isize)).ks[k as usize] += dk; | |
| norm += dk * dk; | |
| k += 1 | |
| } | |
| i += 1 | |
| } | |
| return norm; | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn solve_spiro(mut s: *mut spiro_seg, | |
| mut nseg: libc::c_int) -> libc::c_int { | |
| let mut m: *mut bandmat = 0 as *mut bandmat; | |
| let mut v: *mut libc::c_double = 0 as *mut libc::c_double; | |
| let mut perm: *mut libc::c_int = 0 as *mut libc::c_int; | |
| let mut nmat: libc::c_int = count_vec(s, nseg); | |
| let mut n_alloc: libc::c_int = nmat; | |
| let mut norm: libc::c_double = 0.; | |
| let mut i: libc::c_int = 0; | |
| if nmat == 0 as libc::c_int { return 0 as libc::c_int } | |
| if (*s.offset(0 as libc::c_int as isize)).ty as libc::c_int != '{' as i32 | |
| && | |
| (*s.offset(0 as libc::c_int as isize)).ty as libc::c_int != | |
| 'v' as i32 { | |
| n_alloc *= 3 as libc::c_int | |
| } | |
| if n_alloc < 5 as libc::c_int { n_alloc = 5 as libc::c_int } | |
| m = | |
| malloc((::std::mem::size_of::<bandmat>() as | |
| libc::c_ulong).wrapping_mul(n_alloc as libc::c_ulong)) as | |
| *mut bandmat; | |
| v = | |
| malloc((::std::mem::size_of::<libc::c_double>() as | |
| libc::c_ulong).wrapping_mul(n_alloc as libc::c_ulong)) as | |
| *mut libc::c_double; | |
| perm = | |
| malloc((::std::mem::size_of::<libc::c_int>() as | |
| libc::c_ulong).wrapping_mul(n_alloc as libc::c_ulong)) as | |
| *mut libc::c_int; | |
| i = 0 as libc::c_int; | |
| while i < 10 as libc::c_int { | |
| norm = spiro_iter(s, m, perm, v, nseg); | |
| if norm < 1e-12f64 { break ; } | |
| i += 1 | |
| } | |
| free(m as *mut libc::c_void); | |
| free(v as *mut libc::c_void); | |
| free(perm as *mut libc::c_void); | |
| return 0 as libc::c_int; | |
| } | |
| unsafe extern "C" fn spiro_seg_to_bpath(mut ks: *const libc::c_double, | |
| mut x0: libc::c_double, | |
| mut y0: libc::c_double, | |
| mut x1: libc::c_double, | |
| mut y1: libc::c_double, | |
| mut bc: *mut bezctx, | |
| mut depth: libc::c_int) { | |
| let mut bend: libc::c_double = | |
| fabs(*ks.offset(0 as libc::c_int as isize)) + | |
| fabs(0.5f64 * *ks.offset(1 as libc::c_int as isize)) + | |
| fabs(0.125f64 * *ks.offset(2 as libc::c_int as isize)) + | |
| fabs(1.0f64 / 48 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize)); | |
| if (bend == 0.) as libc::c_int as libc::c_double > 1e-8f64 { | |
| bezctx_lineto(bc, x1, y1); | |
| } else { | |
| let mut seg_ch: libc::c_double = hypot(x1 - x0, y1 - y0); | |
| let mut seg_th: libc::c_double = atan2(y1 - y0, x1 - x0); | |
| let mut xy: [libc::c_double; 2] = [0.; 2]; | |
| let mut ch: libc::c_double = 0.; | |
| let mut th: libc::c_double = 0.; | |
| let mut scale: libc::c_double = 0.; | |
| let mut rot: libc::c_double = 0.; | |
| let mut th_even: libc::c_double = 0.; | |
| let mut th_odd: libc::c_double = 0.; | |
| let mut ul: libc::c_double = 0.; | |
| let mut vl: libc::c_double = 0.; | |
| let mut ur: libc::c_double = 0.; | |
| let mut vr: libc::c_double = 0.; | |
| integrate_spiro(ks, xy.as_mut_ptr()); | |
| ch = | |
| hypot(xy[0 as libc::c_int as usize], | |
| xy[1 as libc::c_int as usize]); | |
| th = | |
| atan2(xy[1 as libc::c_int as usize], | |
| xy[0 as libc::c_int as usize]); | |
| scale = seg_ch / ch; | |
| rot = seg_th - th; | |
| if depth > 5 as libc::c_int || bend < 1.0f64 { | |
| th_even = | |
| 1.0f64 / 384 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize) + | |
| 1.0f64 / 8 as libc::c_int as libc::c_double * | |
| *ks.offset(1 as libc::c_int as isize) + rot; | |
| th_odd = | |
| 1.0f64 / 48 as libc::c_int as libc::c_double * | |
| *ks.offset(2 as libc::c_int as isize) + | |
| 0.5f64 * *ks.offset(0 as libc::c_int as isize); | |
| ul = | |
| scale * (1.0f64 / 3 as libc::c_int as libc::c_double) * | |
| cos(th_even - th_odd); | |
| vl = | |
| scale * (1.0f64 / 3 as libc::c_int as libc::c_double) * | |
| sin(th_even - th_odd); | |
| ur = | |
| scale * (1.0f64 / 3 as libc::c_int as libc::c_double) * | |
| cos(th_even + th_odd); | |
| vr = | |
| scale * (1.0f64 / 3 as libc::c_int as libc::c_double) * | |
| sin(th_even + th_odd); | |
| bezctx_curveto(bc, x0 + ul, y0 + vl, x1 - ur, y1 - vr, x1, y1); | |
| } else { | |
| /* subdivide */ | |
| let mut ksub: [libc::c_double; 4] = [0.; 4]; | |
| let mut thsub: libc::c_double = 0.; | |
| let mut xysub: [libc::c_double; 2] = [0.; 2]; | |
| let mut xmid: libc::c_double = 0.; | |
| let mut ymid: libc::c_double = 0.; | |
| let mut cth: libc::c_double = 0.; | |
| let mut sth: libc::c_double = 0.; | |
| ksub[0 as libc::c_int as usize] = | |
| 0.5f64 * *ks.offset(0 as libc::c_int as isize) - | |
| 0.125f64 * *ks.offset(1 as libc::c_int as isize) + | |
| 1.0f64 / 64 as libc::c_int as libc::c_double * | |
| *ks.offset(2 as libc::c_int as isize) - | |
| 1.0f64 / 768 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| ksub[1 as libc::c_int as usize] = | |
| 0.25f64 * *ks.offset(1 as libc::c_int as isize) - | |
| 1.0f64 / 16 as libc::c_int as libc::c_double * | |
| *ks.offset(2 as libc::c_int as isize) + | |
| 1.0f64 / 128 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| ksub[2 as libc::c_int as usize] = | |
| 0.125f64 * *ks.offset(2 as libc::c_int as isize) - | |
| 1.0f64 / 32 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| ksub[3 as libc::c_int as usize] = | |
| 1.0f64 / 16 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| thsub = | |
| rot - 0.25f64 * *ks.offset(0 as libc::c_int as isize) + | |
| 1.0f64 / 32 as libc::c_int as libc::c_double * | |
| *ks.offset(1 as libc::c_int as isize) - | |
| 1.0f64 / 384 as libc::c_int as libc::c_double * | |
| *ks.offset(2 as libc::c_int as isize) + | |
| 1.0f64 / 6144 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| cth = 0.5f64 * scale * cos(thsub); | |
| sth = 0.5f64 * scale * sin(thsub); | |
| integrate_spiro(ksub.as_mut_ptr() as *const libc::c_double, | |
| xysub.as_mut_ptr()); | |
| xmid = | |
| x0 + cth * xysub[0 as libc::c_int as usize] - | |
| sth * xysub[1 as libc::c_int as usize]; | |
| ymid = | |
| y0 + cth * xysub[1 as libc::c_int as usize] + | |
| sth * xysub[0 as libc::c_int as usize]; | |
| spiro_seg_to_bpath(ksub.as_mut_ptr() as *const libc::c_double, x0, | |
| y0, xmid, ymid, bc, depth + 1 as libc::c_int); | |
| ksub[0 as libc::c_int as usize] += | |
| 0.25f64 * *ks.offset(1 as libc::c_int as isize) + | |
| 1.0f64 / 384 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| ksub[1 as libc::c_int as usize] += | |
| 0.125f64 * *ks.offset(2 as libc::c_int as isize); | |
| ksub[2 as libc::c_int as usize] += | |
| 1.0f64 / 16 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| spiro_seg_to_bpath(ksub.as_mut_ptr() as *const libc::c_double, | |
| xmid, ymid, x1, y1, bc, | |
| depth + 1 as libc::c_int); | |
| } | |
| }; | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn run_spiro(mut src: *const spiro_cp, | |
| mut n_0: libc::c_int) -> *mut spiro_seg { | |
| let mut nseg: libc::c_int = | |
| if (*src.offset(0 as libc::c_int as isize)).ty as libc::c_int == | |
| '{' as i32 { | |
| (n_0) - 1 as libc::c_int | |
| } else { n_0 }; | |
| let mut s: *mut spiro_seg = setup_path(src, n_0); | |
| if nseg > 1 as libc::c_int { solve_spiro(s, nseg); } | |
| return s; | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn free_spiro(mut s: *mut spiro_seg) { | |
| free(s as *mut libc::c_void); | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn spiro_to_bpath(mut s: *const spiro_seg, | |
| mut n_0: libc::c_int, | |
| mut bc: *mut bezctx) { | |
| let mut i: libc::c_int = 0; | |
| let mut nsegs: libc::c_int = | |
| if (*s.offset((n_0 - 1 as libc::c_int) as isize)).ty as libc::c_int == | |
| '}' as i32 { | |
| (n_0) - 1 as libc::c_int | |
| } else { n_0 }; | |
| i = 0 as libc::c_int; | |
| while i < nsegs { | |
| let mut x0: libc::c_double = (*s.offset(i as isize)).x; | |
| let mut y0: libc::c_double = (*s.offset(i as isize)).y; | |
| let mut x1: libc::c_double = | |
| (*s.offset((i + 1 as libc::c_int) as isize)).x; | |
| let mut y1: libc::c_double = | |
| (*s.offset((i + 1 as libc::c_int) as isize)).y; | |
| if i == 0 as libc::c_int { | |
| bezctx_moveto(bc, x0, y0, | |
| ((*s.offset(0 as libc::c_int as isize)).ty as | |
| libc::c_int == '{' as i32) as libc::c_int); | |
| } | |
| bezctx_mark_knot(bc, i); | |
| spiro_seg_to_bpath((*s.offset(i as isize)).ks.as_ptr(), x0, y0, x1, | |
| y1, bc, 0 as libc::c_int); | |
| i += 1 | |
| }; | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn get_knot_th(mut s: *const spiro_seg, | |
| mut i: libc::c_int) -> libc::c_double { | |
| let mut ends: [[libc::c_double; 4]; 2] = [[0.; 4]; 2]; | |
| if i == 0 as libc::c_int { | |
| compute_ends((*s.offset(i as isize)).ks.as_ptr(), ends.as_mut_ptr(), | |
| (*s.offset(i as isize)).seg_ch); | |
| return (*s.offset(i as isize)).seg_th - | |
| ends[0 as libc::c_int as usize][0 as libc::c_int as usize] | |
| } else { | |
| compute_ends((*s.offset((i - 1 as libc::c_int) as isize)).ks.as_ptr(), | |
| ends.as_mut_ptr(), | |
| (*s.offset((i - 1 as libc::c_int) as isize)).seg_ch); | |
| return (*s.offset((i - 1 as libc::c_int) as isize)).seg_th + | |
| ends[1 as libc::c_int as usize][0 as libc::c_int as usize] | |
| }; | |
| } | |
| /* for gettimeofday */ | |
| unsafe extern "C" fn get_time() -> libc::c_double { | |
| let mut tv: timeval = timeval{tv_sec: 0, tv_usec: 0,}; | |
| let mut tz: timezone = timezone{tz_minuteswest: 0, tz_dsttime: 0,}; | |
| gettimeofday(&mut tv, &mut tz as *mut timezone as *mut libc::c_void); | |
| return tv.tv_sec as libc::c_double + | |
| 1e-6f64 * tv.tv_usec as libc::c_double; | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn test_integ() -> libc::c_int { | |
| let mut ks: [libc::c_double; 4] = | |
| [1 as libc::c_int as libc::c_double, | |
| 2 as libc::c_int as libc::c_double, | |
| 3 as libc::c_int as libc::c_double, | |
| 4 as libc::c_int as libc::c_double]; | |
| let mut xy: [libc::c_double; 2] = [0.; 2]; | |
| let mut xynom: [libc::c_double; 2] = [0.; 2]; | |
| let mut ch: libc::c_double = 0.; | |
| let mut th: libc::c_double = 0.; | |
| let mut i: libc::c_int = 0; | |
| let mut j: libc::c_int = 0; | |
| let mut nsubdiv: libc::c_int = 0; | |
| n = | |
| if (12 as libc::c_int) < 6 as libc::c_int { | |
| 4096 as libc::c_int | |
| } else { 1024 as libc::c_int }; | |
| integrate_spiro(ks.as_mut_ptr() as *const libc::c_double, | |
| xynom.as_mut_ptr()); | |
| nsubdiv = | |
| if (12 as libc::c_int) < 12 as libc::c_int { | |
| 8 as libc::c_int | |
| } else { 7 as libc::c_int }; | |
| i = 0 as libc::c_int; | |
| while i < nsubdiv { | |
| let mut st: libc::c_double = 0.; | |
| let mut en: libc::c_double = 0.; | |
| let mut err: libc::c_double = 0.; | |
| let mut n_iter: libc::c_int = | |
| (1 as libc::c_int) << 20 as libc::c_int - i; | |
| n = (1 as libc::c_int) << i; | |
| st = get_time(); | |
| j = 0 as libc::c_int; | |
| while j < n_iter { | |
| integrate_spiro(ks.as_mut_ptr() as *const libc::c_double, | |
| xy.as_mut_ptr()); | |
| j += 1 | |
| } | |
| en = get_time(); | |
| err = | |
| hypot(xy[0 as libc::c_int as usize] - | |
| xynom[0 as libc::c_int as usize], | |
| xy[1 as libc::c_int as usize] - | |
| xynom[1 as libc::c_int as usize]); | |
| printf(b"%d %d %g %g\n\x00" as *const u8 as *const libc::c_char, | |
| 12 as libc::c_int, n, (en - st) / n_iter as libc::c_double, | |
| err); | |
| ch = | |
| hypot(xy[0 as libc::c_int as usize], | |
| xy[1 as libc::c_int as usize]); | |
| th = | |
| atan2(xy[1 as libc::c_int as usize], | |
| xy[0 as libc::c_int as usize]); | |
| i += 1 | |
| } | |
| return 0 as libc::c_int; | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn print_seg(mut ks: *const libc::c_double, | |
| mut x0: libc::c_double, | |
| mut y0: libc::c_double, | |
| mut x1: libc::c_double, | |
| mut y1: libc::c_double) { | |
| let mut bend: libc::c_double = | |
| fabs(*ks.offset(0 as libc::c_int as isize)) + | |
| fabs(0.5f64 * *ks.offset(1 as libc::c_int as isize)) + | |
| fabs(0.125f64 * *ks.offset(2 as libc::c_int as isize)) + | |
| fabs(1.0f64 / 48 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize)); | |
| if bend < 1e-8f64 { | |
| printf(b"%g %g lineto\n\x00" as *const u8 as *const libc::c_char, x1, | |
| y1); | |
| } else { | |
| let mut seg_ch: libc::c_double = hypot(x1 - x0, y1 - y0); | |
| let mut seg_th: libc::c_double = atan2(y1 - y0, x1 - x0); | |
| let mut xy: [libc::c_double; 2] = [0.; 2]; | |
| let mut ch: libc::c_double = 0.; | |
| let mut th: libc::c_double = 0.; | |
| let mut scale: libc::c_double = 0.; | |
| let mut rot: libc::c_double = 0.; | |
| let mut th_even: libc::c_double = 0.; | |
| let mut th_odd: libc::c_double = 0.; | |
| let mut ul: libc::c_double = 0.; | |
| let mut vl: libc::c_double = 0.; | |
| let mut ur: libc::c_double = 0.; | |
| let mut vr: libc::c_double = 0.; | |
| integrate_spiro(ks, xy.as_mut_ptr()); | |
| ch = | |
| hypot(xy[0 as libc::c_int as usize], | |
| xy[1 as libc::c_int as usize]); | |
| th = | |
| atan2(xy[1 as libc::c_int as usize], | |
| xy[0 as libc::c_int as usize]); | |
| scale = seg_ch / ch; | |
| rot = seg_th - th; | |
| if bend < 1.0f64 { | |
| th_even = | |
| 1.0f64 / 384 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize) + | |
| 1.0f64 / 8 as libc::c_int as libc::c_double * | |
| *ks.offset(1 as libc::c_int as isize) + rot; | |
| th_odd = | |
| 1.0f64 / 48 as libc::c_int as libc::c_double * | |
| *ks.offset(2 as libc::c_int as isize) + | |
| 0.5f64 * *ks.offset(0 as libc::c_int as isize); | |
| ul = | |
| scale * (1.0f64 / 3 as libc::c_int as libc::c_double) * | |
| cos(th_even - th_odd); | |
| vl = | |
| scale * (1.0f64 / 3 as libc::c_int as libc::c_double) * | |
| sin(th_even - th_odd); | |
| ur = | |
| scale * (1.0f64 / 3 as libc::c_int as libc::c_double) * | |
| cos(th_even + th_odd); | |
| vr = | |
| scale * (1.0f64 / 3 as libc::c_int as libc::c_double) * | |
| sin(th_even + th_odd); | |
| printf(b"%g %g %g %g %g %g curveto\n\x00" as *const u8 as | |
| *const libc::c_char, x0 + ul, y0 + vl, x1 - ur, | |
| y1 - vr, x1, y1); | |
| } else { | |
| /* subdivide */ | |
| let mut ksub: [libc::c_double; 4] = [0.; 4]; | |
| let mut thsub: libc::c_double = 0.; | |
| let mut xysub: [libc::c_double; 2] = [0.; 2]; | |
| let mut xmid: libc::c_double = 0.; | |
| let mut ymid: libc::c_double = 0.; | |
| let mut cth: libc::c_double = 0.; | |
| let mut sth: libc::c_double = 0.; | |
| ksub[0 as libc::c_int as usize] = | |
| 0.5f64 * *ks.offset(0 as libc::c_int as isize) - | |
| 0.125f64 * *ks.offset(1 as libc::c_int as isize) + | |
| 1.0f64 / 64 as libc::c_int as libc::c_double * | |
| *ks.offset(2 as libc::c_int as isize) - | |
| 1.0f64 / 768 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| ksub[1 as libc::c_int as usize] = | |
| 0.25f64 * *ks.offset(1 as libc::c_int as isize) - | |
| 1.0f64 / 16 as libc::c_int as libc::c_double * | |
| *ks.offset(2 as libc::c_int as isize) + | |
| 1.0f64 / 128 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| ksub[2 as libc::c_int as usize] = | |
| 0.125f64 * *ks.offset(2 as libc::c_int as isize) - | |
| 1.0f64 / 32 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| ksub[3 as libc::c_int as usize] = | |
| 1.0f64 / 16 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| thsub = | |
| rot - 0.25f64 * *ks.offset(0 as libc::c_int as isize) + | |
| 1.0f64 / 32 as libc::c_int as libc::c_double * | |
| *ks.offset(1 as libc::c_int as isize) - | |
| 1.0f64 / 384 as libc::c_int as libc::c_double * | |
| *ks.offset(2 as libc::c_int as isize) + | |
| 1.0f64 / 6144 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| cth = 0.5f64 * scale * cos(thsub); | |
| sth = 0.5f64 * scale * sin(thsub); | |
| integrate_spiro(ksub.as_mut_ptr() as *const libc::c_double, | |
| xysub.as_mut_ptr()); | |
| xmid = | |
| x0 + cth * xysub[0 as libc::c_int as usize] - | |
| sth * xysub[1 as libc::c_int as usize]; | |
| ymid = | |
| y0 + cth * xysub[1 as libc::c_int as usize] + | |
| sth * xysub[0 as libc::c_int as usize]; | |
| print_seg(ksub.as_mut_ptr() as *const libc::c_double, x0, y0, | |
| xmid, ymid); | |
| ksub[0 as libc::c_int as usize] += | |
| 0.25f64 * *ks.offset(1 as libc::c_int as isize) + | |
| 1.0f64 / 384 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| ksub[1 as libc::c_int as usize] += | |
| 0.125f64 * *ks.offset(2 as libc::c_int as isize); | |
| ksub[2 as libc::c_int as usize] += | |
| 1.0f64 / 16 as libc::c_int as libc::c_double * | |
| *ks.offset(3 as libc::c_int as isize); | |
| print_seg(ksub.as_mut_ptr() as *const libc::c_double, xmid, ymid, | |
| x1, y1); | |
| } | |
| }; | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn print_segs(mut segs: *const spiro_seg, | |
| mut nsegs: libc::c_int) { | |
| let mut i: libc::c_int = 0; | |
| i = 0 as libc::c_int; | |
| while i < nsegs { | |
| let mut x0: libc::c_double = (*segs.offset(i as isize)).x; | |
| let mut y0: libc::c_double = (*segs.offset(i as isize)).y; | |
| let mut x1: libc::c_double = | |
| (*segs.offset((i + 1 as libc::c_int) as isize)).x; | |
| let mut y1: libc::c_double = | |
| (*segs.offset((i + 1 as libc::c_int) as isize)).y; | |
| if i == 0 as libc::c_int { | |
| printf(b"%g %g moveto\n\x00" as *const u8 as *const libc::c_char, | |
| x0, y0); | |
| } | |
| printf(b"%% ks = [ %g %g %g %g ]\n\x00" as *const u8 as | |
| *const libc::c_char, | |
| (*segs.offset(i as isize)).ks[0 as libc::c_int as usize], | |
| (*segs.offset(i as isize)).ks[1 as libc::c_int as usize], | |
| (*segs.offset(i as isize)).ks[2 as libc::c_int as usize], | |
| (*segs.offset(i as isize)).ks[3 as libc::c_int as usize]); | |
| print_seg((*segs.offset(i as isize)).ks.as_ptr(), x0, y0, x1, y1); | |
| i += 1 | |
| } | |
| printf(b"stroke\n\x00" as *const u8 as *const libc::c_char); | |
| } | |
| #[no_mangle] | |
| pub unsafe extern "C" fn test_curve() -> libc::c_int { | |
| let mut path: [spiro_cp; 15] = | |
| [{ | |
| let mut init = | |
| spiro_cp{x: 334 as libc::c_int as libc::c_double, | |
| y: 117 as libc::c_int as libc::c_double, | |
| ty: 'v' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 305 as libc::c_int as libc::c_double, | |
| y: 176 as libc::c_int as libc::c_double, | |
| ty: 'v' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 212 as libc::c_int as libc::c_double, | |
| y: 142 as libc::c_int as libc::c_double, | |
| ty: 'c' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 159 as libc::c_int as libc::c_double, | |
| y: 171 as libc::c_int as libc::c_double, | |
| ty: 'c' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 224 as libc::c_int as libc::c_double, | |
| y: 237 as libc::c_int as libc::c_double, | |
| ty: 'c' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 347 as libc::c_int as libc::c_double, | |
| y: 335 as libc::c_int as libc::c_double, | |
| ty: 'c' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 202 as libc::c_int as libc::c_double, | |
| y: 467 as libc::c_int as libc::c_double, | |
| ty: 'c' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 81 as libc::c_int as libc::c_double, | |
| y: 429 as libc::c_int as libc::c_double, | |
| ty: 'v' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 114 as libc::c_int as libc::c_double, | |
| y: 368 as libc::c_int as libc::c_double, | |
| ty: 'v' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 201 as libc::c_int as libc::c_double, | |
| y: 402 as libc::c_int as libc::c_double, | |
| ty: 'c' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 276 as libc::c_int as libc::c_double, | |
| y: 369 as libc::c_int as libc::c_double, | |
| ty: 'c' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 218 as libc::c_int as libc::c_double, | |
| y: 308 as libc::c_int as libc::c_double, | |
| ty: 'c' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 91 as libc::c_int as libc::c_double, | |
| y: 211 as libc::c_int as libc::c_double, | |
| ty: 'c' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 124 as libc::c_int as libc::c_double, | |
| y: 111 as libc::c_int as libc::c_double, | |
| ty: 'c' as i32 as libc::c_char,}; | |
| init | |
| }, | |
| { | |
| let mut init = | |
| spiro_cp{x: 229 as libc::c_int as libc::c_double, | |
| y: 82 as libc::c_int as libc::c_double, | |
| ty: 'c' as i32 as libc::c_char,}; | |
| init | |
| }]; | |
| let mut segs: *mut spiro_seg = 0 as *mut spiro_seg; | |
| let mut i: libc::c_int = 0; | |
| n = 1 as libc::c_int; | |
| i = 0 as libc::c_int; | |
| while i < 1000 as libc::c_int { | |
| segs = setup_path(path.as_mut_ptr(), 15 as libc::c_int); | |
| solve_spiro(segs, 15 as libc::c_int); | |
| i += 1 | |
| } | |
| printf(b"100 800 translate 1 -1 scale 1 setlinewidth\n\x00" as *const u8 | |
| as *const libc::c_char); | |
| print_segs(segs, 15 as libc::c_int); | |
| printf(b"showpage\n\x00" as *const u8 as *const libc::c_char); | |
| return 0 as libc::c_int; | |
| } | |
| unsafe fn main_0(mut argc: libc::c_int, mut argv: *mut *mut libc::c_char) | |
| -> libc::c_int { | |
| return test_curve(); | |
| } | |
| #[main] | |
| pub fn main() { | |
| let mut args: Vec<*mut libc::c_char> = Vec::new(); | |
| for arg in ::std::env::args() { | |
| args.push(::std::ffi::CString::new(arg).expect("Failed to convert argument into CString.").into_raw()); | |
| }; | |
| args.push(::std::ptr::null_mut()); | |
| unsafe { | |
| ::std::process::exit(main_0((args.len() - 1) as libc::c_int, | |
| args.as_mut_ptr() as | |
| *mut *mut libc::c_char) as i32) | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment