Author: post Date: 2009-09-20 13:22:00 +0200 (Sun, 20 Sep 2009) New Revision: 2632
Modified: trunk/plugins/meta-tiff/tiff-meta.c Log: Fixed preview images on Panasonic. Modified: trunk/plugins/meta-tiff/tiff-meta.c =================================================================== --- trunk/plugins/meta-tiff/tiff-meta.c 2009-09-20 11:20:04 UTC (rev 2631) +++ trunk/plugins/meta-tiff/tiff-meta.c 2009-09-20 11:22:00 UTC (rev 2632) @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2009 Anders Brander <[email protected]> and + * Copyright (C) 2006-2009 Anders Brander <[email protected]> and * Anders Kvist <[email protected]> * * This program is free software; you can redistribute it and/or @@ -66,6 +66,7 @@ static gboolean exif_reader(RAWFILE *rawfile, guint offset, RSMetadata *meta); static gboolean ifd_reader(RAWFILE *rawfile, guint offset, RSMetadata *meta); static gboolean thumbnail_reader(const gchar *service, RAWFILE *rawfile, guint offset, guint length, RSMetadata *meta); +static GdkPixbuf* raw_thumbnail_reader(const gchar *service, RSMetadata *meta); typedef enum tiff_field_type { @@ -656,7 +657,7 @@ break; case 0x00aa: /* Nikon Saturation */ if (meta->make == MAKE_NIKON) - { + { if (raw_strcmp(rawfile, offset, "ENHANCED", 8)) meta->saturation = 1.5; else if (raw_strcmp(rawfile, offset, "MODERATE", 8)) @@ -1373,30 +1374,7 @@ /* Special case for Panasonic - most have no embedded thumbnail */ else if (meta->make == MAKE_PANASONIC) { - RS_IMAGE16 *input; - if ((input = rs_filetype_load(service))) - { - gint c; - gfloat pre_mul[4]; - RS_IMAGE16 *image; - RSColorTransform *rct = rs_color_transform_new(); - image = rs_image16_transform(input, NULL, - NULL, NULL, NULL, 128, 128, TRUE, -1.0, - 0.0, 0, NULL); - pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, image->w, image->h); - - for(c=0;c<4;c++) - pre_mul[c] = (gfloat) meta->cam_mul[c]; - - rs_color_transform_set_premul(rct, pre_mul); - rs_color_transform_transform(rct, image->w, image->h, image->pixels, - image->rowstride, gdk_pixbuf_get_pixels(pixbuf), - gdk_pixbuf_get_rowstride(pixbuf)); - - g_object_unref(input); - g_object_unref(image); - g_object_unref(rct); - } + pixbuf = raw_thumbnail_reader(service, meta); } if (pixbuf) @@ -1443,6 +1421,79 @@ return ret; } +static GdkPixbuf* +raw_thumbnail_reader(const gchar *service, RSMetadata *meta) +{ + GdkPixbuf* pixbuf = 0; + gint c; + gfloat pre_mul[4]; + + RSFilter *finput = rs_filter_new("RSInputFile", NULL); + RSFilter *fdemosaic = rs_filter_new("RSDemosaic", finput); + RSFilterParam *param = rs_filter_param_new(); + + g_object_set(finput, "filename", service, NULL); + rs_filter_param_set_roi(param, FALSE); + rs_filter_param_set_quick(param, TRUE); + + RSFilterResponse *response = rs_filter_get_image(fdemosaic, param); + + if (rs_filter_response_has_image(response)) + { + RS_IMAGE16 *image_raw; + RS_IMAGE16 *image_raw_scaled; + RS_IMAGE16 *image_transformed; + RSColorTransform *rct = rs_color_transform_new(); + image_raw = rs_filter_response_get_image(response); + + /* Scale down for higher speed */ + g_object_unref(param); + g_object_unref(finput); + g_object_unref(response); + param = rs_filter_param_new(); + finput = rs_filter_new("RSInputImage16", NULL); + RSFilter *fresample = rs_filter_new("RSResample", finput); + + g_object_set(finput, "image", image_raw, "filename", service, NULL); + rs_filter_param_set_roi(param, FALSE); + rs_filter_param_set_quick(param, TRUE); + g_object_set(fresample, "width", image_raw->w/8, + "height", image_raw->h/8, NULL); + + /* Request the scaled image */ + response = rs_filter_get_image(fresample, param); + image_raw_scaled = rs_filter_response_get_image(response); + + /* Transform image */ + image_transformed = rs_image16_transform(image_raw_scaled, NULL, + NULL, NULL, NULL, 128, 128, TRUE, -1.0, 0.0, 0, NULL); + pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, image_transformed->w, + image_transformed->h); + + + for(c=0;c<4;c++) + pre_mul[c] = (gfloat) meta->cam_mul[c]; + + rs_color_transform_set_premul(rct, pre_mul); + rs_color_transform_transform(rct, image_transformed->w, image_transformed->h, + image_transformed->pixels, image_transformed->rowstride, + gdk_pixbuf_get_pixels(pixbuf), gdk_pixbuf_get_rowstride(pixbuf)); + + g_object_unref(image_raw); + g_object_unref(image_transformed); + g_object_unref(image_raw_scaled); + g_object_unref(fresample); + g_object_unref(rct); + } + + g_object_unref(param); + g_object_unref(response); + g_object_unref(finput); + g_object_unref(fdemosaic); + + return pixbuf; +} + static void sony_load_meta(const gchar *service, RAWFILE *rawfile, guint offset, RSMetadata *meta) { _______________________________________________ Rawstudio-commit mailing list [email protected] http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit
