cairo_surface_t * _cairo_image_surface_rotate (cairo_surface_t *image, double angle, gboolean high_quality, GdkRGBA *background_color, GthAsyncTask *task) { cairo_surface_t *rotated; cairo_surface_t *tmp = NULL; if (angle >= 90.0) { image = tmp = _cairo_image_surface_transform (image, GTH_TRANSFORM_ROTATE_90); angle -= 90.0; } else if (angle <= -90.0) { image = tmp = _cairo_image_surface_transform (image, GTH_TRANSFORM_ROTATE_270); angle += 90.0; } if (angle != 0.0) rotated = rotate (image, -angle, high_quality, background_color->red * 255.0, background_color->green * 255.0, background_color->blue * 255.0, background_color->alpha * 255.0, task); else rotated = cairo_surface_reference (image); if (tmp != NULL) cairo_surface_destroy (tmp); return rotated; }
static gpointer rotate_right_exec (GthAsyncTask *task, gpointer user_data) { cairo_surface_t *source; cairo_surface_t *destination; source = gth_image_task_get_source_surface (GTH_IMAGE_TASK (task)); destination = _cairo_image_surface_transform (source, GTH_TRANSFORM_ROTATE_90); gth_image_task_set_destination_surface (GTH_IMAGE_TASK (task), destination); cairo_surface_destroy (destination); cairo_surface_destroy (source); return NULL; }
void gth_image_info_rotate (GthImageInfo *image_info, int angle) { angle = angle % 360; image_info->rotation = GTH_TRANSFORM_NONE; switch (angle) { case 90: image_info->rotation = GTH_TRANSFORM_ROTATE_90; break; case 180: image_info->rotation = GTH_TRANSFORM_ROTATE_180; break; case 270: image_info->rotation = GTH_TRANSFORM_ROTATE_270; break; default: break; } _cairo_clear_surface (&image_info->thumbnail); if (image_info->thumbnail_original != NULL) image_info->thumbnail = _cairo_image_surface_transform (image_info->thumbnail_original, image_info->rotation); _cairo_clear_surface (&image_info->thumbnail_active); if (image_info->thumbnail != NULL) image_info->thumbnail_active = _cairo_image_surface_color_shift (image_info->thumbnail, 30); if ((angle == 90) || (angle == 270)) { image_info->image_width = image_info->original_height; image_info->image_height = image_info->original_width; } else { image_info->image_width = image_info->original_width; image_info->image_height = image_info->original_height; } }
static void gth_file_tool_rotate_left_activate (GthFileTool *base) { GtkWidget *window; GtkWidget *viewer_page; GtkWidget *viewer; cairo_surface_t *old_image; cairo_surface_t *new_image; 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; viewer = gth_image_viewer_page_get_image_viewer (GTH_IMAGE_VIEWER_PAGE (viewer_page)); old_image = gth_image_viewer_get_current_image (GTH_IMAGE_VIEWER (viewer)); if (old_image == NULL) return; new_image = _cairo_image_surface_transform (old_image, GTH_TRANSFORM_ROTATE_270); gth_image_viewer_page_set_image (GTH_IMAGE_VIEWER_PAGE (viewer_page), new_image, TRUE); cairo_surface_destroy (new_image); }
static GthImage * _cairo_image_surface_create_from_raw (GInputStream *istream, GthFileData *file_data, int requested_size, int *original_width, int *original_height, gpointer user_data, GCancellable *cancellable, GError **error) { libraw_data_t *raw_data; int result; void *buffer = NULL; size_t size; GthImage *image = NULL; raw_data = libraw_init (LIBRAW_OPIONS_NO_MEMERR_CALLBACK | LIBRAW_OPIONS_NO_DATAERR_CALLBACK); if (raw_data == NULL) { _libraw_set_gerror (error, errno); goto fatal_error; } libraw_set_progress_handler (raw_data, _libraw_progress_cb, cancellable); if (! _g_input_stream_read_all (istream, &buffer, &size, cancellable, error)) goto fatal_error; raw_data->params.output_tiff = FALSE; raw_data->params.use_camera_wb = TRUE; raw_data->params.use_rawspeed = TRUE; raw_data->params.highlight = FALSE; raw_data->params.use_camera_matrix = TRUE; raw_data->params.output_color = RAW_OUTPUT_COLOR_SRGB; raw_data->params.output_bps = 8; raw_data->params.half_size = (requested_size > 0); result = libraw_open_buffer (raw_data, buffer, size); if (LIBRAW_FATAL_ERROR (result)) { _libraw_set_gerror (error, result); goto fatal_error; } /* */ #if RAW_USE_EMBEDDED_THUMBNAIL if (requested_size > 0) { /* read the thumbnail */ result = libraw_unpack_thumb (raw_data); if (result != LIBRAW_SUCCESS) { _libraw_set_gerror (error, result); goto fatal_error; } switch (raw_data->thumbnail.tformat) { case LIBRAW_THUMBNAIL_JPEG: image = _libraw_read_jpeg_data (raw_data->thumbnail.thumb, raw_data->thumbnail.tlength, requested_size, cancellable, error); break; case LIBRAW_THUMBNAIL_BITMAP: image = _libraw_read_bitmap_data (raw_data->thumbnail.twidth, raw_data->thumbnail.theight, raw_data->thumbnail.tcolors, 8, (guchar *) raw_data->thumbnail.thumb, raw_data->thumbnail.tlength); break; default: g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, "Unsupported data format"); break; } if ((image != NULL) && (_libraw_get_tranform (raw_data) != GTH_TRANSFORM_NONE)) { cairo_surface_t *surface; cairo_surface_t *rotated; surface = gth_image_get_cairo_surface (image); rotated = _cairo_image_surface_transform (surface, _libraw_get_tranform (raw_data)); gth_image_set_cairo_surface (image, rotated); cairo_surface_destroy (rotated); cairo_surface_destroy (surface); } } else #endif { /* read the image */ libraw_processed_image_t *processed_image; result = libraw_unpack (raw_data); if (result != LIBRAW_SUCCESS) { _libraw_set_gerror (error, result); goto fatal_error; } result = libraw_dcraw_process (raw_data); if (result != LIBRAW_SUCCESS) { _libraw_set_gerror (error, result); goto fatal_error; } processed_image = libraw_dcraw_make_mem_image (raw_data, &result); if (result != LIBRAW_SUCCESS) { _libraw_set_gerror (error, result); goto fatal_error; } switch (processed_image->type) { case LIBRAW_IMAGE_JPEG: image = _libraw_read_jpeg_data (processed_image->data, processed_image->data_size, -1, cancellable, error); break; case LIBRAW_IMAGE_BITMAP: image = _libraw_read_bitmap_data (processed_image->width, processed_image->height, processed_image->colors, processed_image->bits, processed_image->data, processed_image->data_size); break; default: g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, "Unsupported data format"); break; } libraw_dcraw_clear_mem (processed_image); } /* get the original size */ if ((original_width != NULL) && (original_height != NULL)) { result = libraw_adjust_sizes_info_only (raw_data); if (result != LIBRAW_SUCCESS) { _libraw_set_gerror (error, result); goto fatal_error; } *original_width = raw_data->sizes.iwidth; *original_height = raw_data->sizes.iheight; } fatal_error: if (raw_data != NULL) libraw_close (raw_data); g_free (buffer); return image; }