static void preview_checkbutton_toggled_cb (GtkToggleButton *togglebutton, gpointer user_data) { GthFileToolGrayscale *self = user_data; if (gtk_toggle_button_get_active (togglebutton)) gth_preview_tool_set_image (GTH_PREVIEW_TOOL (self->priv->preview_tool), self->priv->destination); else gth_preview_tool_set_image (GTH_PREVIEW_TOOL (self->priv->preview_tool), self->priv->preview); }
static void gth_preview_tool_unset_viewer (GthImageViewerTool *base, GthImageViewer *viewer) { GthPreviewTool *self = GTH_PREVIEW_TOOL (base); gth_image_viewer_set_fit_mode (GTH_IMAGE_VIEWER (viewer), self->priv->original_fit_mode); gth_image_viewer_set_zoom_enabled (GTH_IMAGE_VIEWER (viewer), self->priv->original_zoom_enabled); self->priv->viewer = NULL; }
static void filter_grid_activated_cb (GthFilterGrid *filter_grid, int filter_id, gpointer user_data) { GthFileToolAdjustContrast *self = user_data; self->priv->view_original = (filter_id == GTH_FILTER_GRID_NO_FILTER); if (self->priv->view_original) { gth_preview_tool_set_image (GTH_PREVIEW_TOOL (self->priv->preview_tool), self->priv->preview); } else if (filter_id == self->priv->last_applied_method) { gth_preview_tool_set_image (GTH_PREVIEW_TOOL (self->priv->preview_tool), self->priv->destination); } else { self->priv->method = filter_id; apply_changes (self); } }
static void image_task_completed_cb (GthTask *task, GError *error, gpointer user_data) { GthFileToolAdjustContrast *self = user_data; GthImage *destination_image; self->priv->image_task = NULL; if (self->priv->closing) { g_object_unref (task); gth_image_viewer_page_tool_reset_image (GTH_IMAGE_VIEWER_PAGE_TOOL (self)); return; } if (error != NULL) { if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) apply_changes (self); g_object_unref (task); return; } destination_image = gth_image_task_get_destination (GTH_IMAGE_TASK (task)); if (destination_image == NULL) { g_object_unref (task); return; } cairo_surface_destroy (self->priv->destination); self->priv->destination = gth_image_get_cairo_surface (destination_image); self->priv->last_applied_method = self->priv->method; if (self->priv->apply_to_original) { if (self->priv->destination != NULL) { GtkWidget *window; GtkWidget *viewer_page; window = gth_file_tool_get_window (GTH_FILE_TOOL (self)); viewer_page = gth_browser_get_viewer_page (GTH_BROWSER (window)); gth_image_viewer_page_set_image (GTH_IMAGE_VIEWER_PAGE (viewer_page), self->priv->destination, TRUE); } gth_file_tool_hide_options (GTH_FILE_TOOL (self)); } else { if (! self->priv->view_original) gth_preview_tool_set_image (GTH_PREVIEW_TOOL (self->priv->preview_tool), self->priv->destination); } g_object_unref (task); }
static void gth_preview_tool_set_viewer (GthImageViewerTool *base, GthImageViewer *viewer) { GthPreviewTool *self = GTH_PREVIEW_TOOL (base); GdkCursor *cursor; self->priv->viewer = viewer; self->priv->original_fit_mode = gth_image_viewer_get_fit_mode (GTH_IMAGE_VIEWER (viewer)); self->priv->original_zoom_enabled = gth_image_viewer_get_zoom_enabled (GTH_IMAGE_VIEWER (viewer)); gth_image_viewer_set_fit_mode (GTH_IMAGE_VIEWER (viewer), GTH_FIT_SIZE_IF_LARGER); gth_image_viewer_set_zoom_enabled (GTH_IMAGE_VIEWER (viewer), FALSE); cursor = gdk_cursor_new (GDK_LEFT_PTR); gth_image_viewer_set_cursor (self->priv->viewer, cursor); g_object_unref (cursor); }
static void gth_preview_tool_draw (GthImageViewerTool *base, cairo_t *cr) { GthPreviewTool *self = GTH_PREVIEW_TOOL (base); GtkAllocation allocation; /* background */ cairo_save (cr); gtk_widget_get_allocation (GTK_WIDGET (self->priv->viewer), &allocation); cairo_rectangle (cr, 0, 0, allocation.width, allocation.height); cairo_set_source_rgba (cr, self->priv->background_color.red, self->priv->background_color.green, self->priv->background_color.blue, self->priv->background_color.alpha); cairo_fill (cr); cairo_restore (cr); /* image */ cairo_save (cr); if (self->priv->preview_image != NULL) { cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); cairo_set_source_surface (cr, self->priv->preview_image, self->priv->preview_image_area.x, self->priv->preview_image_area.y); cairo_pattern_set_filter (cairo_get_source (cr), CAIRO_FILTER_FAST); cairo_rectangle (cr, self->priv->preview_image_area.x, self->priv->preview_image_area.y, self->priv->preview_image_area.width, self->priv->preview_image_area.height); cairo_fill (cr); } cairo_restore (cr); }
static void gth_preview_tool_size_allocate (GthImageViewerTool *base, GtkAllocation *allocation) { update_preview_image_area (GTH_PREVIEW_TOOL (base)); }
static GtkWidget * gth_file_tool_adjust_contrast_get_options (GthFileTool *base) { GthFileToolAdjustContrast *self; GtkWidget *window; GtkWidget *viewer_page; GtkWidget *viewer; cairo_surface_t *source; GtkWidget *options; int width, height; GtkAllocation allocation; GtkWidget *filter_grid; self = (GthFileToolAdjustContrast *) base; window = gth_file_tool_get_window (base); viewer_page = gth_browser_get_viewer_page (GTH_BROWSER (window)); if (! GTH_IS_IMAGE_VIEWER_PAGE (viewer_page)) return NULL; _cairo_clear_surface (&self->priv->preview); _cairo_clear_surface (&self->priv->destination); viewer = gth_image_viewer_page_get_image_viewer (GTH_IMAGE_VIEWER_PAGE (viewer_page)); source = gth_image_viewer_page_tool_get_source (GTH_IMAGE_VIEWER_PAGE_TOOL (self)); if (source == NULL) return NULL; width = cairo_image_surface_get_width (source); height = cairo_image_surface_get_height (source); gtk_widget_get_allocation (GTK_WIDGET (viewer), &allocation); if (scale_keeping_ratio (&width, &height, PREVIEW_SIZE * allocation.width, PREVIEW_SIZE * allocation.height, FALSE)) self->priv->preview = _cairo_image_surface_scale_fast (source, width, height); else self->priv->preview = cairo_surface_reference (source); self->priv->destination = cairo_surface_reference (self->priv->preview); self->priv->apply_to_original = FALSE; self->priv->closing = FALSE; self->priv->builder = _gtk_builder_new_from_file ("adjust-contrast-options.ui", "file_tools"); options = _gtk_builder_get_widget (self->priv->builder, "options"); gtk_widget_show (options); filter_grid = gth_filter_grid_new (); gth_filter_grid_add_filter (GTH_FILTER_GRID (filter_grid), METHOD_STRETCH_0_5, get_image_task_for_method (METHOD_STRETCH_0_5), _("Stretch"), _("Stretch the histogram trimming the 0.5%")); gth_filter_grid_add_filter (GTH_FILTER_GRID (filter_grid), METHOD_EQUALIZE_SQUARE_ROOT, get_image_task_for_method (METHOD_EQUALIZE_SQUARE_ROOT), _("Equalize"), _("Equalize the histogram using the square root function")); gth_filter_grid_add_filter (GTH_FILTER_GRID (filter_grid), METHOD_EQUALIZE_LINEAR, get_image_task_for_method (METHOD_EQUALIZE_LINEAR), _("Uniform"), _("Equalize the histogram using the linear function")); g_signal_connect (filter_grid, "activated", G_CALLBACK (filter_grid_activated_cb), self); gtk_widget_show (filter_grid); gtk_box_pack_start (GTK_BOX (GET_WIDGET ("filter_grid_box")), filter_grid, TRUE, FALSE, 0); self->priv->preview_tool = gth_preview_tool_new (); gth_preview_tool_set_image (GTH_PREVIEW_TOOL (self->priv->preview_tool), self->priv->preview); gth_image_viewer_set_tool (GTH_IMAGE_VIEWER (viewer), self->priv->preview_tool); gth_filter_grid_activate (GTH_FILTER_GRID (filter_grid), METHOD_STRETCH_0_5); gth_filter_grid_generate_previews (GTH_FILTER_GRID (filter_grid), source); return options; }
static GtkWidget * gth_file_tool_grayscale_get_options (GthFileTool *base) { GthFileToolGrayscale *self; GtkWidget *window; GtkWidget *viewer_page; GtkWidget *viewer; cairo_surface_t *source; GtkWidget *options; int width, height; GtkAllocation allocation; self = (GthFileToolGrayscale *) base; window = gth_file_tool_get_window (base); viewer_page = gth_browser_get_viewer_page (GTH_BROWSER (window)); if (! GTH_IS_IMAGE_VIEWER_PAGE (viewer_page)) return NULL; cairo_surface_destroy (self->priv->destination); cairo_surface_destroy (self->priv->preview); viewer = gth_image_viewer_page_get_image_viewer (GTH_IMAGE_VIEWER_PAGE (viewer_page)); source = gth_image_viewer_page_tool_get_source (GTH_IMAGE_VIEWER_PAGE_TOOL (self)); if (source == NULL) return NULL; width = cairo_image_surface_get_width (source); height = cairo_image_surface_get_height (source); gtk_widget_get_allocation (GTK_WIDGET (viewer), &allocation); if (scale_keeping_ratio (&width, &height, PREVIEW_SIZE * allocation.width, PREVIEW_SIZE * allocation.height, FALSE)) self->priv->preview = _cairo_image_surface_scale_bilinear (source, width, height); else self->priv->preview = cairo_surface_reference (source); self->priv->destination = cairo_surface_reference (self->priv->preview); self->priv->apply_to_original = FALSE; self->priv->closing = FALSE; self->priv->builder = _gtk_builder_new_from_file ("grayscale-options.ui", "file_tools"); options = _gtk_builder_get_widget (self->priv->builder, "options"); gtk_widget_show (options); g_signal_connect (GET_WIDGET ("ok_button"), "clicked", G_CALLBACK (ok_button_clicked_cb), self); g_signal_connect_swapped (GET_WIDGET ("cancel_button"), "clicked", G_CALLBACK (gth_file_tool_cancel), self); g_signal_connect (GET_WIDGET ("brightness_radiobutton"), "clicked", G_CALLBACK (method_changed_cb), self); g_signal_connect (GET_WIDGET ("saturation_radiobutton"), "clicked", G_CALLBACK (method_changed_cb), self); g_signal_connect (GET_WIDGET ("average_radiobutton"), "clicked", G_CALLBACK (method_changed_cb), self); g_signal_connect (GET_WIDGET ("preview_checkbutton"), "toggled", G_CALLBACK (preview_checkbutton_toggled_cb), self); self->priv->preview_tool = gth_preview_tool_new (); gth_preview_tool_set_image (GTH_PREVIEW_TOOL (self->priv->preview_tool), self->priv->preview); gth_image_viewer_set_tool (GTH_IMAGE_VIEWER (viewer), self->priv->preview_tool); apply_changes (self); return options; }