static gboolean apply_cb (gpointer user_data) { GthFileToolSharpen *self = user_data; GthImageViewer *preview; if (self->priv->apply_event != 0) { g_source_remove (self->priv->apply_event); self->priv->apply_event = 0; } preview = GTH_IMAGE_VIEWER (self->priv->preview); if (self->priv->show_preview) { SharpenData *sharpen_data; int x, y, w ,h; cairo_surface_t *preview_surface; cairo_t *cr; sharpen_data = sharpen_data_new (self); x = MAX (gtk_adjustment_get_value (preview->hadj), 0); y = MAX (gtk_adjustment_get_value (preview->vadj), 0); w = MIN (gtk_adjustment_get_page_size (preview->hadj), cairo_image_surface_get_width (self->priv->source)); h = MIN (gtk_adjustment_get_page_size (preview->vadj), cairo_image_surface_get_height (self->priv->source)); if ((w < 0) || (h < 0)) return FALSE; cairo_surface_destroy (self->priv->destination); self->priv->destination = _cairo_image_surface_copy (self->priv->source); /* FIXME: use a cairo sub-surface when cairo 1.10 will be requiered */ preview_surface = _cairo_image_surface_copy_subsurface (self->priv->destination, x, y, w, h); _cairo_image_surface_sharpen (preview_surface, sharpen_data->radius, sharpen_data->amount, sharpen_data->threshold); cr = cairo_create (self->priv->destination); cairo_set_source_surface (cr, preview_surface, x, y); cairo_rectangle (cr, x, y, w, h); cairo_fill (cr); cairo_destroy (cr); gth_image_viewer_set_surface (preview, self->priv->destination, -1, -1); cairo_surface_destroy (preview_surface); sharpen_data_free (sharpen_data); } else gth_image_viewer_set_surface (preview, self->priv->source, -1, -1); return FALSE; }
cairo_surface_t * _cairo_image_surface_scale_squared (cairo_surface_t *image, int size, scale_filter_t quality, GthAsyncTask *task) { int width, height; int scaled_width, scaled_height; cairo_surface_t *scaled; cairo_surface_t *squared; width = cairo_image_surface_get_width (image); height = cairo_image_surface_get_height (image); if ((width < size) && (height < size)) return _cairo_image_surface_copy (image); if (width > height) { scaled_height = size; scaled_width = (int) (((double) width / height) * scaled_height); } else { scaled_width = size; scaled_height = (int) (((double) height / width) * scaled_width); } if ((scaled_width != width) || (scaled_height != height)) scaled = _cairo_image_surface_scale (image, scaled_width, scaled_height, quality, task); else scaled = cairo_surface_reference (image); if ((scaled_width == size) && (scaled_height == size)) return scaled; squared = _cairo_image_surface_copy_subsurface (scaled, (scaled_width - size) / 2, (scaled_height - size) / 2, size, size); cairo_surface_destroy (scaled); return squared; }