[gthumb] raw: added ability to read bitmap thumbnails
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] raw: added ability to read bitmap thumbnails
- Date: Sun, 30 Jun 2013 08:39:48 +0000 (UTC)
commit 7aed8b360104e935fccb063bba195672d86cb587
Author: Paolo Bacchilega <paobac src gnome org>
Date: Mon Jun 24 11:06:28 2013 +0200
raw: added ability to read bitmap thumbnails
extensions/raw_files/main.c | 65 +++++++++++++++++++++++++++++++++++++++---
1 files changed, 60 insertions(+), 5 deletions(-)
---
diff --git a/extensions/raw_files/main.c b/extensions/raw_files/main.c
index 58b1414..e26e7dc 100644
--- a/extensions/raw_files/main.c
+++ b/extensions/raw_files/main.c
@@ -67,6 +67,8 @@ _libraw_read_jpeg_thumbnail (libraw_data_t *raw_data,
GInputStream *istream;
GthImage *image;
+ g_return_val_if_fail (raw_data->thumbnail.tformat == LIBRAW_THUMBNAIL_JPEG, NULL);
+
loader_func = gth_main_get_image_loader_func ("image/jpeg", GTH_IMAGE_FORMAT_CAIRO_SURFACE);
if (loader_func == NULL)
return NULL;
@@ -91,11 +93,56 @@ _libraw_read_jpeg_thumbnail (libraw_data_t *raw_data,
static cairo_surface_t *
+_cairo_surface_create_from_ppm (int width,
+ int height,
+ guchar *buffer,
+ gsize buffer_size)
+{
+ cairo_surface_t *surface;
+ int stride;
+ guchar *buffer_p;
+ int r, c;
+ guchar *row;
+ guchar *column;
+ guint32 pixel;
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+ stride = cairo_image_surface_get_stride (surface);
+
+ cairo_surface_flush (surface);
+
+ buffer_p = buffer;
+ row = cairo_image_surface_get_data (surface);
+ for (r = 0; r < height; r++) {
+ column = row;
+ for (c = 0; c < width; c++) {
+ pixel = CAIRO_RGBA_TO_UINT32 (buffer_p[0], buffer_p[1], buffer_p[2], 0xff);
+ memcpy (column, &pixel, sizeof (guint32));
+
+ column += 4;
+ buffer_p += 3;
+ }
+ row += stride;
+ }
+
+ cairo_surface_mark_dirty (surface);
+
+ return NULL;
+}
+
+
+static GthImage *
_libraw_read_bitmap_thumbnail (libraw_data_t *raw_data)
{
GthImage *image = NULL;
cairo_surface_t *surface = NULL;
+ g_return_val_if_fail (raw_data->thumbnail.tformat == LIBRAW_THUMBNAIL_BITMAP, NULL);
+
+ surface = _cairo_surface_create_from_ppm (raw_data->thumbnail.twidth,
+ raw_data->thumbnail.theight,
+ (guchar *) raw_data->thumbnail.thumb,
+ raw_data->thumbnail.tlength);
if (surface != NULL) {
image = gth_image_new_for_surface (surface);
cairo_surface_destroy (surface);
@@ -129,6 +176,16 @@ _libraw_get_tranform (libraw_data_t *raw_data)
}
+static void
+swap_int (int *a,
+ int *b)
+{
+ int tmp = *a;
+ *a = *b;
+ *b = tmp;
+}
+
+
static GthImage *
_cairo_image_surface_create_from_raw (GInputStream *istream,
GthFileData *file_data,
@@ -169,18 +226,16 @@ _cairo_image_surface_create_from_raw (GInputStream *istream,
width = raw_data->sizes.iwidth;
height = raw_data->sizes.iheight;
+
switch (raw_data->sizes.flip) {
case 5: /* 270 degrees */
case 6: /* 90 degrees */
- {
- int tmp = width;
- width = height;
- height = tmp;
+ swap_int (&width, &height);
break;
- }
default:
break;
}
+
if (original_width)
*original_width = width;
if (original_height)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]