static gpointer exec_resize (GthAsyncTask *task, gpointer user_data) { ResizeData *resize_data = user_data; cairo_surface_t *source; cairo_surface_t *destination; int w, h; int new_w, new_h; int max_w, max_h; GthImage *destination_image; source = gth_image_get_cairo_surface (gth_image_task_get_source (GTH_IMAGE_TASK (task))); w = cairo_image_surface_get_width (source); h = cairo_image_surface_get_height (source); if (resize_data->allow_swap && (((h > w) && (resize_data->width > resize_data->height)) || ((h < w) && (resize_data->width < resize_data->height)))) { max_w = resize_data->height; max_h = resize_data->width; } else { max_w = resize_data->width; max_h = resize_data->height; } if (resize_data->unit == GTH_UNIT_PERCENTAGE) { new_w = w * ((double) max_w / 100.0); new_h = h * ((double) max_h / 100.0); } else if (resize_data->keep_aspect_ratio) { new_w = w; new_h = h; scale_keeping_ratio (&new_w, &new_h, max_w, max_h, TRUE); } else { new_w = max_w; new_h = max_h; } if ((new_w > 1) && (new_h > 1)) destination = _cairo_image_surface_scale (source, new_w, new_h, SCALE_FILTER_BEST, task); else destination = NULL; destination_image = gth_image_new_for_surface (destination); gth_image_task_set_destination (GTH_IMAGE_TASK (task), destination_image); _g_object_unref (destination_image); cairo_surface_destroy (destination); cairo_surface_destroy (source); return NULL; }
static GthImage * _libraw_read_bitmap_data (int width, int height, int colors, int bits, guchar *buffer, gsize buffer_size) { GthImage *image = NULL; cairo_surface_t *surface = NULL; surface = _cairo_surface_create_from_ppm (width, height, colors, bits, buffer, buffer_size); if (surface != NULL) { image = gth_image_new_for_surface (surface); cairo_surface_destroy (surface); } return image; }
void gth_browser_activate_action_tool_desktop_background (GtkAction *action, GthBrowser *browser) { WallpaperData *wdata; gboolean saving_wallpaper = FALSE; GList *items; GList *file_list; GthFileData *file_data; const char *mime_type; wdata = wallpaper_data_new (browser); items = gth_file_selection_get_selected (GTH_FILE_SELECTION (gth_browser_get_file_list_view (browser))); file_list = gth_file_list_get_files (GTH_FILE_LIST (gth_browser_get_file_list (browser)), items); file_data = (file_list != NULL) ? file_list->data : NULL; mime_type = (file_data != NULL) ? gth_file_data_get_mime_type (file_data) : NULL; if (gth_main_extension_is_active ("image_viewer") && (gth_browser_get_file_modified (browser) || ! _gdk_pixbuf_mime_type_is_readable (mime_type))) { GtkWidget *viewer_page; viewer_page = gth_browser_get_viewer_page (browser); if (viewer_page != NULL) { GthImage *image; GthTask *task; image = gth_image_new_for_surface (gth_image_viewer_page_get_image (GTH_IMAGE_VIEWER_PAGE (viewer_page))); file_data = gth_file_data_new (wdata->new_style.file, NULL); task = gth_save_image_task_new (image, "image/jpeg", file_data, GTH_OVERWRITE_RESPONSE_YES); g_signal_connect (task, "completed", G_CALLBACK (save_wallpaper_task_completed_cb), wdata); gth_browser_exec_task (GTH_BROWSER (browser), task, FALSE); saving_wallpaper = TRUE; _g_object_unref (task); g_object_unref (image); } } if (saving_wallpaper) return; if (file_data == NULL) return; if (g_file_is_native (file_data->file)) { _g_object_unref (wdata->new_style.file); wdata->new_style.file = g_file_dup (file_data->file); wallpaper_data_set (wdata); } else g_file_copy_async (file_data->file, wdata->new_style.file, G_FILE_COPY_OVERWRITE, G_PRIORITY_DEFAULT, NULL, NULL, NULL, copy_wallpaper_ready_cb, wdata); _g_object_list_unref (file_list); _gtk_tree_path_list_free (items); }
static gpointer adjust_contrast_exec (GthAsyncTask *task, gpointer user_data) { AdjustContrastData *adjust_data = user_data; cairo_format_t format; int width; int height; int source_stride; cairo_surface_t *destination; int destination_stride; unsigned char *p_source_line; unsigned char *p_destination_line; unsigned char *p_source; unsigned char *p_destination; gboolean cancelled; double progress; int x, y; unsigned char red, green, blue, alpha; GthImage *destination_image; /* initialize some extra data */ adjust_contrast_setup (adjust_data); /* convert the image */ format = cairo_image_surface_get_format (adjust_data->source); width = cairo_image_surface_get_width (adjust_data->source); height = cairo_image_surface_get_height (adjust_data->source); source_stride = cairo_image_surface_get_stride (adjust_data->source); destination = cairo_image_surface_create (format, width, height); destination_stride = cairo_image_surface_get_stride (destination); p_source_line = _cairo_image_surface_flush_and_get_data (adjust_data->source); p_destination_line = _cairo_image_surface_flush_and_get_data (destination); for (y = 0; y < height; y++) { gth_async_task_get_data (task, NULL, &cancelled, NULL); if (cancelled) return NULL; progress = (double) y / height; gth_async_task_set_data (task, NULL, NULL, &progress); p_source = p_source_line; p_destination = p_destination_line; for (x = 0; x < width; x++) { CAIRO_GET_RGBA (p_source, red, green, blue, alpha); red = adjust_contrast_func (adjust_data, GTH_HISTOGRAM_CHANNEL_RED, red); green = adjust_contrast_func (adjust_data, GTH_HISTOGRAM_CHANNEL_GREEN, green); blue = adjust_contrast_func (adjust_data, GTH_HISTOGRAM_CHANNEL_BLUE, blue); CAIRO_SET_RGBA (p_destination, red, green, blue, alpha); p_source += 4; p_destination += 4; } p_source_line += source_stride; p_destination_line += destination_stride; } cairo_surface_mark_dirty (destination); destination_image = gth_image_new_for_surface (destination); gth_image_task_set_destination (GTH_IMAGE_TASK (task), destination_image); _g_object_unref (destination_image); cairo_surface_destroy (destination); return NULL; }