static cairo_status_t _cpp_line_to (void *closure, const cairo_point_t *point) { cpp_t *cpp = closure; cairo_path_data_t *data = cpp->data; double x, y; x = _cairo_fixed_to_double (point->x); y = _cairo_fixed_to_double (point->y); _cairo_gstate_backend_to_user (cpp->gstate, &x, &y); data->header.type = CAIRO_PATH_LINE_TO; data->header.length = 2; /* We index from 1 to leave room for data->header */ data[1].point.x = x; data[1].point.y = y; cpp->data += data->header.length; cpp->current_point = *point; return CAIRO_STATUS_SUCCESS; }
static void _cairo_default_context_backend_to_user (void *abstract_cr, double *x, double *y) { cairo_default_context_t *cr = abstract_cr; _cairo_gstate_backend_to_user (cr->gstate, x, y); }
static cairo_status_t _cpp_curve_to (void *closure, const cairo_point_t *p1, const cairo_point_t *p2, const cairo_point_t *p3) { cpp_t *cpp = closure; cairo_path_data_t *data = cpp->data; double x1, y1; double x2, y2; double x3, y3; x1 = _cairo_fixed_to_double (p1->x); y1 = _cairo_fixed_to_double (p1->y); _cairo_gstate_backend_to_user (cpp->gstate, &x1, &y1); x2 = _cairo_fixed_to_double (p2->x); y2 = _cairo_fixed_to_double (p2->y); _cairo_gstate_backend_to_user (cpp->gstate, &x2, &y2); x3 = _cairo_fixed_to_double (p3->x); y3 = _cairo_fixed_to_double (p3->y); _cairo_gstate_backend_to_user (cpp->gstate, &x3, &y3); data->header.type = CAIRO_PATH_CURVE_TO; data->header.length = 4; /* We index from 1 to leave room for data->header */ data[1].point.x = x1; data[1].point.y = y1; data[2].point.x = x2; data[2].point.y = y2; data[3].point.x = x3; data[3].point.y = y3; cpp->data += data->header.length; cpp->current_point = *p3; return CAIRO_STATUS_SUCCESS; }
static cairo_bool_t _cairo_default_context_get_current_point (void *abstract_cr, double *x, double *y) { cairo_default_context_t *cr = abstract_cr; cairo_fixed_t x_fixed, y_fixed; if (_cairo_path_fixed_get_current_point (cr->path, &x_fixed, &y_fixed)) { *x = _cairo_fixed_to_double (x_fixed); *y = _cairo_fixed_to_double (y_fixed); _cairo_gstate_backend_to_user (cr->gstate, x, y); return TRUE; } else { return FALSE; } }