Author: post
Date: 2010-04-01 23:41:24 +0200 (Thu, 01 Apr 2010)
New Revision: 3306

Modified:
   trunk/plugins/meta-tiff/tiff-meta.c
Log:
Much better thumbnail generation from RAW image data (fallback for cameras 
without thumbnails).

Modified: trunk/plugins/meta-tiff/tiff-meta.c
===================================================================
--- trunk/plugins/meta-tiff/tiff-meta.c 2010-04-01 21:40:09 UTC (rev 3305)
+++ trunk/plugins/meta-tiff/tiff-meta.c 2010-04-01 21:41:24 UTC (rev 3306)
@@ -1486,7 +1486,7 @@
        if ((meta->make == MAKE_PHASEONE) || (meta->make == MAKE_SAMSUNG))
                meta->preview_planar_config = 1;
 
-       /* Load thumbnail - try thumbnail first - then preview image */
+       /* Load thumbnail - try thumbnail first - then preview image - then 
decode the RAW image*/
        if (!thumbnail_reader(service, rawfile, meta->thumbnail_start, 
meta->thumbnail_length, meta))
                if (!thumbnail_reader(service, rawfile, meta->preview_start, 
meta->preview_length, meta))
                        thumbnail_store(raw_thumbnail_reader(service, meta), 
meta);
@@ -1597,66 +1597,40 @@
 
        RSFilter *finput = rs_filter_new("RSInputFile", NULL);
        RSFilter *fdemosaic = rs_filter_new("RSDemosaic", finput);
-       RSFilterRequest *request = rs_filter_request_new();
+       RSFilter *fresample = rs_filter_new("RSResample", fdemosaic);
+       RSFilter *fcst = rs_filter_new("RSColorspaceTransform", fresample);
+       
+       g_object_set(fresample, "width", 128,
+                                "height", 128, 
+                               "bounding-box", TRUE, NULL);
 
-       g_object_set(finput, "filename", service, NULL);
+       g_object_set(finput, "filename", service, 
+                                "color-space", 
rs_color_space_new_singleton("RSSrgb"), NULL);
+
+       RSFilterRequest *request = rs_filter_request_new();
        rs_filter_request_set_roi(request, FALSE);
        rs_filter_request_set_quick(request, TRUE);
 
-       RSFilterResponse *response = rs_filter_get_image(fdemosaic, request);
+       for(c=0;c<4;c++)
+               pre_mul[c] = (gfloat) meta->cam_mul[c];
 
-       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);
+       /* Some estimation of camera response */
+       pre_mul[0] *= 1.75;
+       pre_mul[1] *= 1.0;
+       pre_mul[2] *= 1.5;
 
-               /* Scale down for higher speed */
-               g_object_unref(request);
-               g_object_unref(finput);
-               g_object_unref(response);
-               request = rs_filter_request_new();
-               finput = rs_filter_new("RSInputImage16", NULL);
-               RSFilter *fresample = rs_filter_new("RSResample", finput);
+       rs_filter_param_set_float4(RS_FILTER_PARAM(request), "premul", pre_mul);
+       rs_filter_param_set_object(RS_FILTER_PARAM(request), "colorspace", 
rs_color_space_new_singleton("RSSrgb"));     
 
-               g_object_set(finput, "image", image_raw, "filename", service, 
NULL);
-               rs_filter_request_set_roi(request, FALSE);
-               rs_filter_request_set_quick(request, TRUE);
-               g_object_set(fresample, "width", image_raw->w/8,
-                            "height", image_raw->h/8, NULL);
+       RSFilterResponse *response = rs_filter_get_image8(fcst, request);
+       pixbuf = rs_filter_response_get_image8(response);
 
-               /* Request the scaled image */
-               response = rs_filter_get_image(fresample, request);
-               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(request);
-       g_object_unref(response);
        g_object_unref(finput);
        g_object_unref(fdemosaic);
+       g_object_unref(fresample);
+       g_object_unref(fcst);
+       g_object_unref(request);
+       g_object_unref(response);
 
        return pixbuf;
 }


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to