[Rawstudio-commit] r4162 - trunk/plugins/meta-tiff

Klaus Post klauspost at gmail.com
Tue Feb 21 18:51:38 CET 2012


Author: post
Date: 2012-02-21 18:51:37 +0100 (Tue, 21 Feb 2012)
New Revision: 4162

Modified:
   trunk/plugins/meta-tiff/tiff-meta.c
Log:
Use DCP profiles for rendering RAW-based thumbnails for better accuracy. Also be more liberal on accepting camera names, so DNG images always have previews.

Modified: trunk/plugins/meta-tiff/tiff-meta.c
===================================================================
--- trunk/plugins/meta-tiff/tiff-meta.c	2012-02-20 10:58:16 UTC (rev 4161)
+++ trunk/plugins/meta-tiff/tiff-meta.c	2012-02-21 17:51:37 UTC (rev 4162)
@@ -28,6 +28,7 @@
 #include <string.h> /* memcpy() */
 #include <stdlib.h>
 #include "rs-utils.h"
+#include "rs-profile-camera.h"
 
 /* It is required having some arbitrary maximum exposure time to prevent borked
  * shutter speed values being interpreted from the tiff.
@@ -1693,6 +1694,8 @@
 						meta->make = MAKE_RICOH;
 					else if (raw_strcmp(rawfile, ifd.value_offset, "SAMSUNG", 7))
 						meta->make = MAKE_SAMSUNG;
+					else if (raw_strcmp(rawfile, ifd.value_offset, "SIGMA", 5))
+						meta->make = MAKE_SIGMA;
 					/* Do not detect SONY, we don't want to call private_sony() unless
 					   we're sure we have a hidden SonyMeta */
 					else if (raw_strcmp(rawfile, ifd.value_offset, "FUJIFILM", 4))
@@ -1848,7 +1851,7 @@
 	} while (next>0);
 
 	rs_metadata_normalize_wb(meta);
-	return !!meta->make;
+	return (!!meta->make) || (meta->make_ascii);
 }
 
 /**
@@ -1877,7 +1880,6 @@
 thumbnail_reader(const gchar *service, RAWFILE *rawfile, guint offset, guint length, RSMetadata *meta)
 {
 	GdkPixbuf *pixbuf=NULL;
-
 	if ((offset>0) && (length>0) && (length<5000000))
 	{
 		if ((length==165888) && (meta->make == MAKE_CANON))
@@ -1975,25 +1977,80 @@
 	RSFilter *finput = rs_filter_new("RSInputFile", NULL);
 	RSFilter *fdemosaic = rs_filter_new("RSDemosaic", finput);
 	RSFilter *fresample = rs_filter_new("RSResample", fdemosaic);
-	RSFilter *fcst = rs_filter_new("RSColorspaceTransform", fresample);
+	RSFilter *fdcp = rs_filter_new("RSDcp", fresample);
+	RSFilter *fcst = rs_filter_new("RSColorspaceTransform", fdcp);
 	
 	g_object_set(fresample, "width", 256,
 				 "height", 256, 
 				"bounding-box", TRUE, NULL);
 
-	g_object_set(finput, "filename", service, 
-				 "color-space", rs_color_space_new_singleton("RSSrgb"), NULL);
+	g_object_set(finput, "filename", service, NULL);
 
+	/* Find a dcp profile */
+	const gchar* camera_id = rs_profile_camera_find(meta->make_ascii, meta->model_ascii);
+	RSDcpFile *dcp = NULL;
+	if (camera_id)
+	{
+		RSProfileFactory *factory = rs_profile_factory_new_default();
+		GSList *all_profiles = rs_profile_factory_find_from_model(factory, camera_id);
+		if (g_slist_length(all_profiles) > 0)
+		{
+			GSList *profiles_i = all_profiles;
+			do {
+				if (profiles_i->data && RS_IS_DCP_FILE(profiles_i->data))
+					dcp = RS_DCP_FILE(profiles_i->data); 
+				profiles_i = profiles_i->next;
+			} while (NULL == dcp && profiles_i);
+
+			g_slist_free(all_profiles);
+		}
+	}
+
+	if (NULL != dcp)
+		g_object_set(fdcp, "use-profile", TRUE, "profile", dcp, NULL);
+	else
+		g_object_set(fdcp, "use-profile", FALSE, NULL);
+	
 	rs_filter_set_recursive(RS_FILTER(fdemosaic), "demosaic-allow-downscale",  TRUE, NULL);
 	
 	RSFilterRequest *request = rs_filter_request_new();
 	rs_filter_request_set_roi(request, FALSE);
 	rs_filter_request_set_quick(request, TRUE);
 
-	for(c=0;c<4;c++)
-		pre_mul[c] = (gfloat) meta->cam_mul[c] * 1.5f;
 
-	rs_filter_param_set_float4(RS_FILTER_PARAM(request), "premul", pre_mul);
+	if (dcp)
+	{
+		RSSettings *settings = rs_settings_new();
+		gdouble buf[3];
+		gint c;
+		gdouble max=0.0, warmth, tint;
+	
+		for (c=0; c < 3; c++)
+			buf[c] = meta->cam_mul[c];
+
+		for (c=0; c < 3; c++)
+			if (max < buf[c])
+				max = buf[c];
+
+		for(c=0;c<3;c++)
+			buf[c] /= max;
+
+		buf[R] *= (1.0/buf[G]);
+		buf[B] *= (1.0/buf[G]);
+		buf[G] = 1.0;
+
+		tint = (buf[B] + buf[R] - 4.0)/-2.0;
+		warmth = (buf[R]/(2.0-tint))-1.0;
+		rs_settings_set_wb(settings, warmth, tint, "");
+		g_object_set(fdcp, "settings", settings, NULL);
+	}
+	else
+	{
+		g_object_set(finput, "color-space", rs_color_space_new_singleton("RSSrgb"), NULL);
+		for(c=0;c<4;c++)
+			pre_mul[c] = (gfloat) meta->cam_mul[c] * 1.5f;
+		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"));	
 
 	RSFilterResponse *response = rs_filter_get_image8(fcst, request);




More information about the Rawstudio-commit mailing list