static void gimp_foreground_select_tool_stroke (GimpChannel *mask, FgSelectStroke *stroke) { GimpScanConvert *scan_convert = gimp_scan_convert_new (); if (stroke->num_points == 1) { GimpVector2 points[2]; points[0] = points[1] = stroke->points[0]; points[1].x += 0.01; points[1].y += 0.01; gimp_scan_convert_add_polyline (scan_convert, 2, points, FALSE); } else { gimp_scan_convert_add_polyline (scan_convert, stroke->num_points, stroke->points, FALSE); } gimp_scan_convert_stroke (scan_convert, stroke->width, GIMP_JOIN_ROUND, GIMP_CAP_ROUND, 10.0, 0.0, NULL); gimp_scan_convert_compose_value (scan_convert, gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)), 0, 0, stroke->background ? 0 : 255); gimp_scan_convert_free (scan_convert); }
static void gimp_foreground_select_tool_stroke_paint (GimpForegroundSelectTool *fg_select, GimpDisplay *display, GimpForegroundSelectOptions *options) { GimpScanConvert *scan_convert; gint width; gdouble opacity; g_return_if_fail (fg_select->stroke != NULL); scan_convert = gimp_scan_convert_new (); if (fg_select->stroke->len == 1) { GimpVector2 points[2]; points[0] = points[1] = ((GimpVector2 *) fg_select->stroke->data)[0]; points[1].x += 0.01; points[1].y += 0.01; gimp_scan_convert_add_polyline (scan_convert, 2, points, FALSE); } else { gimp_scan_convert_add_polyline (scan_convert, fg_select->stroke->len, (GimpVector2 *) fg_select->stroke->data, FALSE); } width = ROUND ((gdouble) options->stroke_width); gimp_scan_convert_stroke (scan_convert, width, GIMP_JOIN_ROUND, GIMP_CAP_ROUND, 10.0, 0.0, NULL); if (options->draw_mode == GIMP_MATTING_DRAW_MODE_FOREGROUND) opacity = 1.0; else if (options->draw_mode == GIMP_MATTING_DRAW_MODE_BACKGROUND) opacity = 0.0; else opacity = 0.5; gimp_scan_convert_compose_value (scan_convert, fg_select->trimap, 0, 0, opacity); gimp_scan_convert_free (scan_convert); g_array_free (fg_select->stroke, TRUE); fg_select->stroke = NULL; }