Skip to content

Instantly share code, notes, and snippets.

@ctrlcctrlv
Created September 21, 2020 03:53
Show Gist options
  • Select an option

  • Save ctrlcctrlv/82042e64a27753fa69a0ffbb0cc64fbe to your computer and use it in GitHub Desktop.

Select an option

Save ctrlcctrlv/82042e64a27753fa69a0ffbb0cc64fbe to your computer and use it in GitHub Desktop.
raphlinus/spiro transpiled by c2rust
#![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);
};
}
#![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