/** * gimp_draw_tool_add_corner: * @draw_tool: the #GimpDrawTool * @highlight: * @put_outside: whether to put the handles on the outside of the rectangle * @x1: * @y1: * @x2: * @y2: * @width: corner width * @height: corner height * @anchor: which corner to draw * * This function takes image space coordinates and transforms them to * screen window coordinates. It draws a corner into an already drawn * rectangle outline, taking care of not drawing over an already drawn line. **/ GimpCanvasItem * gimp_draw_tool_add_corner (GimpDrawTool *draw_tool, gboolean highlight, gboolean put_outside, gdouble x1, gdouble y1, gdouble x2, gdouble y2, gint width, gint height, GimpHandleAnchor anchor) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); item = gimp_canvas_corner_new (gimp_display_get_shell (draw_tool->display), x1, y1, x2 - x1, y2 - y1, anchor, width, height, put_outside); gimp_canvas_item_set_highlight (item, highlight); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
GimpCanvasItem * gimp_draw_tool_add_arc (GimpDrawTool *draw_tool, gboolean filled, gdouble x, gdouble y, gdouble width, gdouble height, gdouble start_angle, gdouble slice_angle) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); item = gimp_canvas_arc_new (gimp_display_get_shell (draw_tool->display), x + width / 2.0, y + height / 2.0, width / 2.0, height / 2.0, start_angle, slice_angle, filled); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
GimpCanvasItem * gimp_draw_tool_add_transform_preview (GimpDrawTool *draw_tool, GimpDrawable *drawable, const GimpMatrix3 *transform, gdouble x1, gdouble y1, gdouble x2, gdouble y2, gboolean perspective, gdouble opacity) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL); g_return_val_if_fail (transform != NULL, NULL); item = gimp_canvas_transform_preview_new (gimp_display_get_shell (draw_tool->display), drawable, transform, x1, y1, x2, y2, perspective, opacity); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
GimpCanvasGroup * gimp_draw_tool_add_fill_group (GimpDrawTool *draw_tool) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); item = gimp_canvas_group_new (gimp_display_get_shell (draw_tool->display)); gimp_canvas_group_set_group_filling (GIMP_CANVAS_GROUP (item), TRUE); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return GIMP_CANVAS_GROUP (item); }
GimpCanvasItem * gimp_draw_tool_add_path (GimpDrawTool *draw_tool, const GimpBezierDesc *desc) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); g_return_val_if_fail (desc != NULL, NULL); item = gimp_canvas_path_new (gimp_display_get_shell (draw_tool->display), desc, FALSE, FALSE); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
GimpCanvasItem * gimp_draw_tool_add_text_cursor (GimpDrawTool *draw_tool, PangoRectangle *cursor, gboolean overwrite) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); item = gimp_canvas_text_cursor_new (gimp_display_get_shell (draw_tool->display), cursor, overwrite); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
/** * gimp_draw_tool_add_sample_point: * @draw_tool: the #GimpDrawTool * @x: X position of the sample point * @y: Y position of the sample point * @index: Index of the sample point * * This function draws a sample point **/ GimpCanvasItem * gimp_draw_tool_add_sample_point (GimpDrawTool *draw_tool, gint x, gint y, gint index) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); item = gimp_canvas_sample_point_new (gimp_display_get_shell (draw_tool->display), x, y, index, TRUE); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
/** * gimp_draw_tool_add_guide: * @draw_tool: the #GimpDrawTool * @orientation: the orientation of the guide line * @position: the position of the guide line in image coordinates * * This function draws a guide line across the canvas. **/ GimpCanvasItem * gimp_draw_tool_add_guide (GimpDrawTool *draw_tool, GimpOrientationType orientation, gint position, gboolean guide_style) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); item = gimp_canvas_guide_new (gimp_display_get_shell (draw_tool->display), orientation, position, guide_style); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
/** * gimp_draw_tool_add_line: * @draw_tool: the #GimpDrawTool * @x1: start point X in image coordinates * @y1: start point Y in image coordinates * @x2: end point X in image coordinates * @y2: end point Y in image coordinates * * This function takes image space coordinates and transforms them to * screen window coordinates, then draws a line between the resulting * coordindates. **/ GimpCanvasItem * gimp_draw_tool_add_line (GimpDrawTool *draw_tool, gdouble x1, gdouble y1, gdouble x2, gdouble y2) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); item = gimp_canvas_line_new (gimp_display_get_shell (draw_tool->display), x1, y1, x2, y2); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
GimpCanvasItem * gimp_draw_tool_add_rectangle_guides (GimpDrawTool *draw_tool, GimpGuidesType type, gdouble x, gdouble y, gdouble width, gdouble height) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); item = gimp_canvas_rectangle_guides_new (gimp_display_get_shell (draw_tool->display), x, y, width, height, type, 4); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
GimpCanvasItem * gimp_draw_tool_add_strokes (GimpDrawTool *draw_tool, const GimpCoords *points, gint n_points, gboolean filled) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); if (points == NULL || n_points < 2) return NULL; item = gimp_canvas_polygon_new_from_coords (gimp_display_get_shell (draw_tool->display), points, n_points, filled); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
GimpCanvasItem * gimp_draw_tool_add_handle (GimpDrawTool *draw_tool, GimpHandleType type, gdouble x, gdouble y, gint width, gint height, GimpHandleAnchor anchor) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); item = gimp_canvas_handle_new (gimp_display_get_shell (draw_tool->display), type, anchor, x, y, width, height); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
GimpCanvasItem * gimp_draw_tool_add_pen (GimpDrawTool *draw_tool, const GimpVector2 *points, gint n_points, GimpContext *context, GimpActiveColor color, gint width) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); if (points == NULL || n_points < 2) return NULL; item = gimp_canvas_pen_new (gimp_display_get_shell (draw_tool->display), points, n_points, context, color, width); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
/** * gimp_draw_tool_add_boundary: * @draw_tool: a #GimpDrawTool * @bound_segs: the sorted brush outline * @n_bound_segs: the number of segments in @bound_segs * @matrix: transform matrix for the boundary * @offset_x: x offset * @offset_y: y offset * * Draw the boundary of the brush that @draw_tool uses. The boundary * should be sorted with sort_boundary(), and @n_bound_segs should * include the sentinel segments inserted by sort_boundary() that * indicate the end of connected segment sequences (groups) . */ GimpCanvasItem * gimp_draw_tool_add_boundary (GimpDrawTool *draw_tool, const BoundSeg *bound_segs, gint n_bound_segs, GimpMatrix3 *transform, gdouble offset_x, gdouble offset_y) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); g_return_val_if_fail (n_bound_segs > 0, NULL); g_return_val_if_fail (bound_segs != NULL, NULL); item = gimp_canvas_boundary_new (gimp_display_get_shell (draw_tool->display), bound_segs, n_bound_segs, transform, offset_x, offset_y); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
GimpCanvasItem * gimp_draw_tool_add_transform_guides (GimpDrawTool *draw_tool, const GimpMatrix3 *transform, GimpGuidesType type, gint n_guides, gdouble x1, gdouble y1, gdouble x2, gdouble y2) { GimpCanvasItem *item; g_return_val_if_fail (GIMP_IS_DRAW_TOOL (draw_tool), NULL); g_return_val_if_fail (transform != NULL, NULL); item = gimp_canvas_transform_guides_new (gimp_display_get_shell (draw_tool->display), transform, x1, y1, x2, y2, type, n_guides); gimp_draw_tool_add_item (draw_tool, item); g_object_unref (item); return item; }
static void gimp_perspective_clone_tool_draw (GimpDrawTool *draw_tool) { GimpTool *tool = GIMP_TOOL (draw_tool); GimpPerspectiveCloneTool *clone_tool = GIMP_PERSPECTIVE_CLONE_TOOL (draw_tool); GimpPerspectiveClone *clone = GIMP_PERSPECTIVE_CLONE (GIMP_PAINT_TOOL (tool)->core); GimpSourceCore *source_core = GIMP_SOURCE_CORE (clone); GimpPerspectiveCloneOptions *options; options = GIMP_PERSPECTIVE_CLONE_TOOL_GET_OPTIONS (tool); if (options->clone_mode == GIMP_PERSPECTIVE_CLONE_MODE_ADJUST) { if (clone_tool->widget) { GimpCanvasItem *item = gimp_tool_widget_get_item (clone_tool->widget); gimp_draw_tool_add_item (draw_tool, item); } } else { GimpCanvasGroup *stroke_group; stroke_group = gimp_draw_tool_add_stroke_group (draw_tool); /* draw the bounding box */ gimp_draw_tool_push_group (draw_tool, stroke_group); gimp_draw_tool_add_line (draw_tool, clone_tool->trans_info[X0], clone_tool->trans_info[Y0], clone_tool->trans_info[X1], clone_tool->trans_info[Y1]); gimp_draw_tool_add_line (draw_tool, clone_tool->trans_info[X1], clone_tool->trans_info[Y1], clone_tool->trans_info[X3], clone_tool->trans_info[Y3]); gimp_draw_tool_add_line (draw_tool, clone_tool->trans_info[X2], clone_tool->trans_info[Y2], clone_tool->trans_info[X3], clone_tool->trans_info[Y3]); gimp_draw_tool_add_line (draw_tool, clone_tool->trans_info[X2], clone_tool->trans_info[Y2], clone_tool->trans_info[X0], clone_tool->trans_info[Y0]); gimp_draw_tool_pop_group (draw_tool); } if (source_core->src_drawable && clone_tool->src_display) { GimpDisplay *tmp_display; tmp_display = draw_tool->display; draw_tool->display = clone_tool->src_display; gimp_draw_tool_add_handle (draw_tool, GIMP_HANDLE_CROSS, clone_tool->src_x + 0.5, clone_tool->src_y + 0.5, GIMP_TOOL_HANDLE_SIZE_CROSS, GIMP_TOOL_HANDLE_SIZE_CROSS, GIMP_HANDLE_ANCHOR_CENTER); draw_tool->display = tmp_display; } GIMP_DRAW_TOOL_CLASS (parent_class)->draw (draw_tool); }
static void gimp_paint_tool_draw (GimpDrawTool *draw_tool) { if (! gimp_color_tool_is_enabled (GIMP_COLOR_TOOL (draw_tool))) { GimpPaintTool *paint_tool = GIMP_PAINT_TOOL (draw_tool); GimpPaintCore *core = paint_tool->core; GimpImage *image = gimp_display_get_image (draw_tool->display); GimpDrawable *drawable = gimp_image_get_active_drawable (image); GimpCanvasItem *outline = NULL; gboolean line_drawn = FALSE; gdouble last_x, last_y; gdouble cur_x, cur_y; gint off_x, off_y; gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y); last_x = core->last_coords.x + off_x; last_y = core->last_coords.y + off_y; cur_x = core->cur_coords.x + off_x; cur_y = core->cur_coords.y + off_y; if (paint_tool->draw_line && ! gimp_tool_control_is_active (GIMP_TOOL (draw_tool)->control)) { GimpCanvasGroup *group; group = gimp_draw_tool_add_stroke_group (draw_tool); gimp_draw_tool_push_group (draw_tool, group); gimp_draw_tool_add_handle (draw_tool, GIMP_HANDLE_CIRCLE, last_x, last_y, GIMP_TOOL_HANDLE_SIZE_CIRCLE, GIMP_TOOL_HANDLE_SIZE_CIRCLE, GIMP_HANDLE_ANCHOR_CENTER); gimp_draw_tool_add_line (draw_tool, last_x, last_y, cur_x, cur_y); gimp_draw_tool_add_handle (draw_tool, GIMP_HANDLE_CIRCLE, cur_x, cur_y, GIMP_TOOL_HANDLE_SIZE_CIRCLE, GIMP_TOOL_HANDLE_SIZE_CIRCLE, GIMP_HANDLE_ANCHOR_CENTER); gimp_draw_tool_pop_group (draw_tool); line_drawn = TRUE; } gimp_paint_tool_set_draw_fallback (paint_tool, FALSE, 0.0); if (paint_tool->draw_brush) outline = gimp_paint_tool_get_outline (paint_tool, draw_tool->display, cur_x, cur_y); if (outline) { gimp_draw_tool_add_item (draw_tool, outline); g_object_unref (outline); } else if (paint_tool->draw_fallback) { /* Lets make a sensible fallback cursor * * Sensible cursor is * * crossed to indicate draw point * * reactive to options alterations * * not a full circle that would be in the way */ gint size = (gint) paint_tool->fallback_size; #define TICKMARK_ANGLE 48 #define ROTATION_ANGLE G_PI / 4 /* marks for indicating full size */ gimp_draw_tool_add_arc (draw_tool, FALSE, cur_x - (size / 2.0), cur_y - (size / 2.0), size, size, ROTATION_ANGLE - (2.0 * G_PI) / (TICKMARK_ANGLE * 2), (2.0 * G_PI) / TICKMARK_ANGLE); gimp_draw_tool_add_arc (draw_tool, FALSE, cur_x - (size / 2.0), cur_y - (size / 2.0), size, size, ROTATION_ANGLE + G_PI / 2 - (2.0 * G_PI) / (TICKMARK_ANGLE * 2), (2.0 * G_PI) / TICKMARK_ANGLE); gimp_draw_tool_add_arc (draw_tool, FALSE, cur_x - (size / 2.0), cur_y - (size / 2.0), size, size, ROTATION_ANGLE + G_PI - (2.0 * G_PI) / (TICKMARK_ANGLE * 2), (2.0 * G_PI) / TICKMARK_ANGLE); gimp_draw_tool_add_arc (draw_tool, FALSE, cur_x - (size / 2.0), cur_y - (size / 2.0), size, size, ROTATION_ANGLE + 3 * G_PI / 2 - (2.0 * G_PI) / (TICKMARK_ANGLE * 2), (2.0 * G_PI) / TICKMARK_ANGLE); } else if (paint_tool->draw_circle) { gint size = (gint) paint_tool->circle_size; /* draw an indicatory circle */ gimp_draw_tool_add_arc (draw_tool, FALSE, cur_x - (size / 2.0), cur_y - (size / 2.0), size, size, 0.0, (2.0 * G_PI)); } if (! outline && ! line_drawn && ! paint_tool->show_cursor && ! paint_tool->draw_circle) { /* don't leave the user without any indication and draw * a fallback crosshair */ gimp_draw_tool_add_handle (draw_tool, GIMP_HANDLE_CROSSHAIR, cur_x, cur_y, GIMP_TOOL_HANDLE_SIZE_CROSSHAIR, GIMP_TOOL_HANDLE_SIZE_CROSSHAIR, GIMP_HANDLE_ANCHOR_CENTER); } } GIMP_DRAW_TOOL_CLASS (parent_class)->draw (draw_tool); }