static void rsvg_path_arc_segment (RSVGParsePathCtx *ctx, double xc, double yc, double th0, double th1, double rx, double ry, double x_axis_rotation) { double sin_th, cos_th; double a00, a01, a10, a11; double x1, y1, x2, y2, x3, y3; double t; double th_half; sin_th = sin (x_axis_rotation * (M_PI / 180.0)); cos_th = cos (x_axis_rotation * (M_PI / 180.0)); /* inverse transform compared with rsvg_path_arc */ a00 = cos_th * rx; a01 = -sin_th * ry; a10 = sin_th * rx; a11 = cos_th * ry; th_half = 0.5 * (th1 - th0); t = (8.0 / 3.0) * sin (th_half * 0.5) * sin (th_half * 0.5) / sin (th_half); x1 = xc + cos (th0) - t * sin (th0); y1 = yc + sin (th0) + t * cos (th0); x3 = xc + cos (th1); y3 = yc + sin (th1); x2 = x3 + t * sin (th1); y2 = y3 - t * cos (th1); rsvg_bpath_def_curveto (ctx->bpath, a00 * x1 + a01 * y1, a10 * x1 + a11 * y1, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3); }
static void rsvg_path_arc_segment (RSVGParsePathCtx * ctx, double xc, double yc, double th0, double th1, double rx, double ry, double x_axis_rotation) { double x1, y1, x2, y2, x3, y3; double t; double th_half; double f, sinf, cosf; f = x_axis_rotation * M_PI / 180.0; sinf = sin(f); cosf = cos(f); th_half = 0.5 * (th1 - th0); t = (8.0 / 3.0) * sin (th_half * 0.5) * sin (th_half * 0.5) / sin (th_half); x1 = rx*(cos (th0) - t * sin (th0)); y1 = ry*(sin (th0) + t * cos (th0)); x3 = rx*cos (th1); y3 = ry*sin (th1); x2 = x3 + rx*(t * sin (th1)); y2 = y3 + ry*(-t * cos (th1)); rsvg_bpath_def_curveto (ctx->bpath, xc + cosf*x1 - sinf*y1, yc + sinf*x1 + cosf*y1, xc + cosf*x2 - sinf*y2, yc + sinf*x2 + cosf*y2, xc + cosf*x3 - sinf*y3, yc + sinf*x3 + cosf*y3); }