static gboolean gimp_threshold_tool_initialize (GimpTool *tool, GimpDisplay *display, GError **error) { GimpThresholdTool *t_tool = GIMP_THRESHOLD_TOOL (tool); GimpImage *image = gimp_display_get_image (display); GimpDrawable *drawable = gimp_image_get_active_drawable (image); if (! drawable) return FALSE; gimp_config_reset (GIMP_CONFIG (t_tool->config)); if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error)) { return FALSE; } gimp_drawable_calculate_histogram (drawable, t_tool->histogram); gimp_histogram_view_set_histogram (t_tool->histogram_box->view, t_tool->histogram); gimp_image_map_tool_preview (GIMP_IMAGE_MAP_TOOL (t_tool)); return TRUE; }
static GeglNode * gimp_threshold_tool_get_operation (GimpImageMapTool *image_map_tool, GObject **config) { GimpThresholdTool *t_tool = GIMP_THRESHOLD_TOOL (image_map_tool); GeglNode *node; node = g_object_new (GEGL_TYPE_NODE, "operation", "gimp:threshold", NULL); t_tool->config = g_object_new (GIMP_TYPE_THRESHOLD_CONFIG, NULL); *config = G_OBJECT (t_tool->config); g_signal_connect_object (t_tool->config, "notify", G_CALLBACK (gimp_threshold_tool_config_notify), G_OBJECT (t_tool), 0); gegl_node_set (node, "config", t_tool->config, NULL); return node; }
static void gimp_threshold_tool_dialog (GimpImageMapTool *image_map_tool) { GimpThresholdTool *t_tool = GIMP_THRESHOLD_TOOL (image_map_tool); GimpToolOptions *tool_options = GIMP_TOOL_GET_OPTIONS (image_map_tool); GimpThresholdConfig *config = t_tool->config; GtkWidget *main_vbox; GtkWidget *hbox; GtkWidget *menu; GtkWidget *box; GtkWidget *button; gint n_bins; main_vbox = gimp_image_map_tool_dialog_get_vbox (image_map_tool); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); menu = gimp_prop_enum_icon_box_new (G_OBJECT (tool_options), "histogram-scale", "gimp-histogram", 0, 0); gtk_box_pack_end (GTK_BOX (hbox), menu, FALSE, FALSE, 0); gtk_widget_show (menu); box = gimp_histogram_box_new (); gtk_box_pack_start (GTK_BOX (main_vbox), box, TRUE, TRUE, 0); gtk_widget_show (box); t_tool->histogram_box = GIMP_HISTOGRAM_BOX (box); n_bins = gimp_histogram_n_bins (t_tool->histogram); gimp_histogram_view_set_range (t_tool->histogram_box->view, config->low * (n_bins - 0.0001), config->high * (n_bins - 0.0001)); g_signal_connect (t_tool->histogram_box->view, "range-changed", G_CALLBACK (gimp_threshold_tool_histogram_range), t_tool); gimp_histogram_options_connect_view (GIMP_HISTOGRAM_OPTIONS (tool_options), t_tool->histogram_box->view); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); button = gtk_button_new_with_mnemonic (_("_Auto")); gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); gimp_help_set_help_data (button, _("Automatically adjust to optimal " "binarization threshold"), NULL); gtk_widget_show (button); g_signal_connect (button, "clicked", G_CALLBACK (gimp_threshold_tool_auto_clicked), t_tool); }
static gboolean gimp_threshold_tool_initialize (GimpTool *tool, GimpDisplay *display, GError **error) { GimpThresholdTool *t_tool = GIMP_THRESHOLD_TOOL (tool); GimpFilterTool *filter_tool = GIMP_FILTER_TOOL (tool); GimpImage *image = gimp_display_get_image (display); GimpDrawable *drawable = gimp_image_get_active_drawable (image); gdouble low; gdouble high; gint n_bins; if (! GIMP_TOOL_CLASS (parent_class)->initialize (tool, display, error)) { return FALSE; } g_clear_object (&t_tool->histogram_async); g_object_get (filter_tool->config, "low", &low, "high", &high, NULL); /* this is a hack to make sure that * 'gimp_histogram_n_bins (t_tool->histogram)' returns the correct value for * 'drawable' before the asynchronous calculation of its histogram is * finished. */ { GeglBuffer *temp; temp = gegl_buffer_new (GEGL_RECTANGLE (0, 0, 1, 1), gimp_drawable_get_format (drawable)); gimp_histogram_calculate (t_tool->histogram, temp, GEGL_RECTANGLE (0, 0, 1, 1), NULL, NULL); g_object_unref (temp); } n_bins = gimp_histogram_n_bins (t_tool->histogram); t_tool->histogram_async = gimp_drawable_calculate_histogram_async ( drawable, t_tool->histogram, FALSE); gimp_histogram_view_set_histogram (t_tool->histogram_box->view, t_tool->histogram); gimp_histogram_view_set_range (t_tool->histogram_box->view, low * (n_bins - 0.0001), high * (n_bins - 0.0001)); return TRUE; }
static void gimp_threshold_tool_finalize (GObject *object) { GimpThresholdTool *t_tool = GIMP_THRESHOLD_TOOL (object); g_clear_object (&t_tool->histogram); g_clear_object (&t_tool->histogram_async); G_OBJECT_CLASS (parent_class)->finalize (object); }
static void gimp_threshold_tool_finalize (GObject *object) { GimpThresholdTool *t_tool = GIMP_THRESHOLD_TOOL (object); if (t_tool->histogram) { gimp_histogram_unref (t_tool->histogram); t_tool->histogram = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); }
static void gimp_threshold_tool_config_notify (GimpFilterTool *filter_tool, GimpConfig *config, const GParamSpec *pspec) { GimpThresholdTool *t_tool = GIMP_THRESHOLD_TOOL (filter_tool); GIMP_FILTER_TOOL_CLASS (parent_class)->config_notify (filter_tool, config, pspec); if (! t_tool->histogram_box) return; if (! strcmp (pspec->name, "channel")) { GimpHistogramChannel channel; g_object_get (config, "channel", &channel, NULL); gimp_histogram_view_set_channel (t_tool->histogram_box->view, channel); } else if (! strcmp (pspec->name, "low") || ! strcmp (pspec->name, "high")) { gdouble low; gdouble high; gint n_bins; g_object_get (config, "low", &low, "high", &high, NULL); n_bins = gimp_histogram_n_bins (t_tool->histogram); gimp_histogram_view_set_range (t_tool->histogram_box->view, low * (n_bins - 0.0001), high * (n_bins - 0.0001)); } }
static GeglNode * gimp_threshold_tool_get_operation (GimpImageMapTool *image_map_tool, GObject **config, gchar **undo_desc) { GimpThresholdTool *t_tool = GIMP_THRESHOLD_TOOL (image_map_tool); t_tool->config = g_object_new (GIMP_TYPE_THRESHOLD_CONFIG, NULL); g_signal_connect_object (t_tool->config, "notify", G_CALLBACK (gimp_threshold_tool_config_notify), G_OBJECT (t_tool), 0); *config = G_OBJECT (t_tool->config); return gegl_node_new_child (NULL, "operation", "gimp:threshold", "config", t_tool->config, NULL); }
static void gimp_threshold_tool_dialog (GimpFilterTool *filter_tool) { GimpThresholdTool *t_tool = GIMP_THRESHOLD_TOOL (filter_tool); GimpToolOptions *tool_options = GIMP_TOOL_GET_OPTIONS (filter_tool); GtkWidget *main_vbox; GtkWidget *main_frame; GtkWidget *frame_vbox; GtkWidget *hbox; GtkWidget *label; GtkWidget *hbox2; GtkWidget *box; GtkWidget *button; GimpHistogramChannel channel; main_vbox = gimp_filter_tool_dialog_get_vbox (filter_tool); main_frame = gimp_frame_new (NULL); gtk_box_pack_start (GTK_BOX (main_vbox), main_frame, TRUE, TRUE, 0); gtk_widget_show (main_frame); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); gtk_frame_set_label_widget (GTK_FRAME (main_frame), hbox); gtk_widget_show (hbox); label = gtk_label_new_with_mnemonic (_("Cha_nnel:")); gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); t_tool->channel_menu = gimp_prop_enum_combo_box_new (filter_tool->config, "channel", -1, -1); gimp_enum_combo_box_set_icon_prefix (GIMP_ENUM_COMBO_BOX (t_tool->channel_menu), "gimp-channel"); gimp_int_combo_box_set_sensitivity (GIMP_INT_COMBO_BOX (t_tool->channel_menu), gimp_threshold_tool_channel_sensitive, filter_tool, NULL); gtk_box_pack_start (GTK_BOX (hbox), t_tool->channel_menu, FALSE, FALSE, 0); gtk_widget_show (t_tool->channel_menu); gtk_label_set_mnemonic_widget (GTK_LABEL (label), t_tool->channel_menu); hbox2 = gimp_prop_enum_icon_box_new (G_OBJECT (tool_options), "histogram-scale", "gimp-histogram", 0, 0); gtk_box_pack_end (GTK_BOX (hbox), hbox2, FALSE, FALSE, 0); gtk_widget_show (hbox2); frame_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4); gtk_container_add (GTK_CONTAINER (main_frame), frame_vbox); gtk_widget_show (frame_vbox); box = gimp_histogram_box_new (); gtk_box_pack_start (GTK_BOX (frame_vbox), box, TRUE, TRUE, 0); gtk_widget_show (box); t_tool->histogram_box = GIMP_HISTOGRAM_BOX (box); g_object_get (filter_tool->config, "channel", &channel, NULL); gimp_histogram_view_set_channel (t_tool->histogram_box->view, channel); g_signal_connect (t_tool->histogram_box->view, "range-changed", G_CALLBACK (gimp_threshold_tool_histogram_range), t_tool); g_object_bind_property (G_OBJECT (tool_options), "histogram-scale", G_OBJECT (t_tool->histogram_box->view), "histogram-scale", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); gtk_box_pack_start (GTK_BOX (frame_vbox), hbox, FALSE, FALSE, 0); gtk_widget_show (hbox); button = gtk_button_new_with_mnemonic (_("_Auto")); gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); gimp_help_set_help_data (button, _("Automatically adjust to optimal " "binarization threshold"), NULL); gtk_widget_show (button); g_signal_connect (button, "clicked", G_CALLBACK (gimp_threshold_tool_auto_clicked), t_tool); }