static void sp_pen_context_setup (SPEventContext *ec) { SPPenContext *pc; pc = SP_PEN_CONTEXT (ec); if (((SPEventContextClass *) pen_parent_class)->setup) ((SPEventContextClass *) pen_parent_class)->setup (ec); /* Pen indicators */ pc->c0 = sp_canvas_item_new (SP_DT_CONTROLS (SP_EVENT_CONTEXT_DESKTOP (ec)), SP_TYPE_CTRL, "shape", SP_CTRL_SHAPE_CIRCLE, "size", 4.0, "filled", 0, "fill_color", 0xff00007f, "stroked", 1, "stroke_color", 0x0000ff7f, NULL); pc->c1 = sp_canvas_item_new (SP_DT_CONTROLS (SP_EVENT_CONTEXT_DESKTOP (ec)), SP_TYPE_CTRL, "shape", SP_CTRL_SHAPE_CIRCLE, "size", 4.0, "filled", 0, "fill_color", 0xff00007f, "stroked", 1, "stroke_color", 0x0000ff7f, NULL); pc->cl0 = sp_canvas_item_new (SP_DT_CONTROLS (SP_EVENT_CONTEXT_DESKTOP (ec)), SP_TYPE_CTRLLINE, NULL); sp_ctrlline_set_rgba32 (SP_CTRLLINE (pc->cl0), 0x0000007f); pc->cl1 = sp_canvas_item_new (SP_DT_CONTROLS (SP_EVENT_CONTEXT_DESKTOP (ec)), SP_TYPE_CTRLLINE, NULL); sp_ctrlline_set_rgba32 (SP_CTRLLINE (pc->cl1), 0x0000007f); sp_canvas_item_hide (pc->c0); sp_canvas_item_hide (pc->c1); sp_canvas_item_hide (pc->cl0); sp_canvas_item_hide (pc->cl1); sp_event_context_read (ec, "mode"); }
/** Create a line from p1 to p2 and add it to the lines list */ void VPDrag::addLine (Geom::Point p1, Geom::Point p2, guint32 rgba) { SPCanvasItem *line = sp_canvas_item_new(sp_desktop_controls(inkscape_active_desktop()), SP_TYPE_CTRLLINE, NULL); sp_ctrlline_set_coords(SP_CTRLLINE(line), p1, p2); if (rgba != VP_LINE_COLOR_FILL) // fill is the default, so don't set color for it to speed up redraw sp_ctrlline_set_rgba32 (SP_CTRLLINE(line), rgba); sp_canvas_item_show (line); this->lines = g_slist_append (this->lines, line); }
static void sp_ctrlline_render (SPCanvasItem *item, SPCanvasBuf *buf) { SPCtrlLine *cl = SP_CTRLLINE (item); if (!buf->ct) return; if (cl->s == cl->e) return; sp_canvas_prepare_buffer (buf); guint32 rgba = cl->rgba; cairo_set_source_rgba(buf->ct, SP_RGBA32_B_F(rgba), SP_RGBA32_G_F(rgba), SP_RGBA32_R_F(rgba), SP_RGBA32_A_F(rgba)); cairo_set_line_width(buf->ct, 1); cairo_new_path(buf->ct); Geom::Point s = cl->s * cl->affine; Geom::Point e = cl->e * cl->affine; cairo_move_to (buf->ct, s[Geom::X] - buf->rect.x0, s[Geom::Y] - buf->rect.y0); cairo_line_to (buf->ct, e[Geom::X] - buf->rect.x0, e[Geom::Y] - buf->rect.y0); cairo_stroke(buf->ct); }
static void sp_ctrlline_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags) { SPCtrlLine *cl = SP_CTRLLINE (item); item->canvas->request_redraw ((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2); if (parent_class->update) (* parent_class->update) (item, affine, flags); sp_canvas_item_reset_bounds (item); cl->affine = affine; if (cl->s == cl->e) { item->x1 = item->x2 = item->y1 = item->y2 = 0; } else { Geom::Point s = cl->s * affine; Geom::Point e = cl->e * affine; item->x1 = round(MIN(s[Geom::X], e[Geom::X]) - 1); item->y1 = round(MIN(s[Geom::Y], e[Geom::Y]) - 1); item->x2 = round(MAX(s[Geom::X], e[Geom::X]) + 1); item->y2 = round(MAX(s[Geom::Y], e[Geom::Y]) + 1); item->canvas->request_redraw ((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2); } }
void sp_sel_trans_transform (SPSelTrans * seltrans, NRMatrixD *affine, NRPointF *norm) { NRMatrixD n2p, p2n; g_return_if_fail (seltrans->grabbed); g_return_if_fail (!seltrans->empty); nr_matrix_d_set_translate (&n2p, norm->x, norm->y); nr_matrix_d_set_translate (&p2n, -norm->x, -norm->y); nr_matrix_multiply_ddd (affine, &p2n, affine); nr_matrix_multiply_ddd (affine, affine, &n2p); if (seltrans->show == SP_SELTRANS_SHOW_CONTENT) { // update the content int i; for (i = 0; i < seltrans->nitems; i++) { NRMatrixF i2dnew; nr_matrix_multiply_ffd (&i2dnew, &seltrans->transforms[i], affine); sp_item_set_i2d_affine (seltrans->items[i], &i2dnew); } } else { NRPointF p[4]; /* update the outline */ p[0].x = NR_MATRIX_DF_TRANSFORM_X (affine, seltrans->box.x0, seltrans->box.y0); p[0].y = NR_MATRIX_DF_TRANSFORM_Y (affine, seltrans->box.x0, seltrans->box.y0); p[1].x = NR_MATRIX_DF_TRANSFORM_X (affine, seltrans->box.x1, seltrans->box.y0); p[1].y = NR_MATRIX_DF_TRANSFORM_Y (affine, seltrans->box.x1, seltrans->box.y0); p[2].x = NR_MATRIX_DF_TRANSFORM_X (affine, seltrans->box.x1, seltrans->box.y1); p[2].y = NR_MATRIX_DF_TRANSFORM_Y (affine, seltrans->box.x1, seltrans->box.y1); p[3].x = NR_MATRIX_DF_TRANSFORM_X (affine, seltrans->box.x0, seltrans->box.y1); p[3].y = NR_MATRIX_DF_TRANSFORM_Y (affine, seltrans->box.x0, seltrans->box.y1); sp_ctrlline_set_coords (SP_CTRLLINE (seltrans->l1), p[0].x, p[0].y, p[1].x, p[1].y); sp_ctrlline_set_coords (SP_CTRLLINE (seltrans->l2), p[1].x, p[1].y, p[2].x, p[2].y); sp_ctrlline_set_coords (SP_CTRLLINE (seltrans->l3), p[2].x, p[2].y, p[3].x, p[3].y); sp_ctrlline_set_coords (SP_CTRLLINE (seltrans->l4), p[3].x, p[3].y, p[0].x, p[0].y); } seltrans->current = *affine; seltrans->changed = TRUE; sp_sel_trans_update_handles (seltrans); }
SPCtrlLine *ControlManager::createControlLine(SPCanvasGroup *parent, CtrlLineType type) { SPCtrlLine *line = SP_CTRLLINE(sp_canvas_item_new(parent, SP_TYPE_CTRLLINE, NULL)); if (line) { line->ctrlType = CTRL_TYPE_LINE; line->setRgba32((type == CTLINE_PRIMARY) ? LINE_COLOR_PRIMARY : (type == CTLINE_SECONDARY) ? LINE_COLOR_SECONDARY : LINE_COLOR_TERTIARY); } return line; }
static void spdc_pen_set_ctrl (SPPenContext *pc, NRPointF *p, guint state) { SPDrawContext *dc; dc = SP_DRAW_CONTEXT (pc); sp_canvas_item_show (pc->c1); sp_canvas_item_show (pc->cl1); if (dc->npoints == 2) { dc->p[1] = *p; sp_canvas_item_hide (pc->c0); sp_canvas_item_hide (pc->cl0); sp_ctrl_moveto (SP_CTRL (pc->c1), dc->p[1].x, dc->p[1].y); sp_ctrlline_set_coords (SP_CTRLLINE (pc->cl1), dc->p[0].x, dc->p[0].y, dc->p[1].x, dc->p[1].y); } else if (dc->npoints == 5) { dc->p[4] = *p; sp_canvas_item_show (pc->c0); sp_canvas_item_show (pc->cl0); if (((pc->mode == SP_PEN_CONTEXT_MODE_CLICK) && (state & GDK_CONTROL_MASK)) || ((pc->mode == SP_PEN_CONTEXT_MODE_DRAG) && !(state & GDK_MOD1_MASK))) { gdouble dx, dy; dx = p->x - dc->p[3].x; dy = p->y - dc->p[3].y; dc->p[2].x = dc->p[3].x - dx; dc->p[2].y = dc->p[3].y - dy; sp_curve_reset (dc->red_curve); sp_curve_moveto (dc->red_curve, dc->p[0].x, dc->p[0].y); sp_curve_curveto (dc->red_curve, dc->p[1].x, dc->p[1].y, dc->p[2].x, dc->p[2].y, dc->p[3].x, dc->p[3].y); sp_canvas_bpath_set_bpath (SP_CANVAS_BPATH (dc->red_bpath), dc->red_curve); } sp_ctrl_moveto (SP_CTRL (pc->c0), dc->p[2].x, dc->p[2].y); sp_ctrlline_set_coords (SP_CTRLLINE (pc->cl0), dc->p[3].x, dc->p[3].y, dc->p[2].x, dc->p[2].y); sp_ctrl_moveto (SP_CTRL (pc->c1), dc->p[4].x, dc->p[4].y); sp_ctrlline_set_coords (SP_CTRLLINE (pc->cl1), dc->p[3].x, dc->p[3].y, dc->p[4].x, dc->p[4].y); } else { g_warning ("Something bad happened - npoints is %d", dc->npoints); } }
static void sp_ctrlline_destroy (GtkObject *object) { g_return_if_fail (object != NULL); g_return_if_fail (SP_IS_CTRLLINE (object)); SPCtrlLine *ctrlline = SP_CTRLLINE (object); ctrlline->item=NULL; if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); }
static bool sp_gradient_context_is_over_line (SPGradientContext *rc, SPItem *item, Geom::Point event_p) { SPDesktop *desktop = SP_EVENT_CONTEXT (rc)->desktop; //Translate mouse point into proper coord system rc->mousepoint_doc = desktop->w2d(event_p); SPCtrlLine* line = SP_CTRLLINE(item); Geom::Point nearest = snap_vector_midpoint (rc->mousepoint_doc, line->s, line->e, 0); double dist_screen = Geom::L2 (rc->mousepoint_doc - nearest) * desktop->current_zoom(); double tolerance = (double) SP_EVENT_CONTEXT(rc)->tolerance; bool close = (dist_screen < tolerance); return close; }