[Rawstudio-commit] r826 - trunk/src

Anders Brander anders at brander.dk
Sat Sep 30 16:04:51 CEST 2006


Author: abrander
Date: 2006-09-30 16:04:51 +0200 (Sat, 30 Sep 2006)
New Revision: 826

Modified:
   trunk/src/color.h
   trunk/src/rawstudio.c
   trunk/src/rs-render.c
Log:
Removed working space.

Modified: trunk/src/color.h
===================================================================
--- trunk/src/color.h	2006-09-29 00:07:41 UTC (rev 825)
+++ trunk/src/color.h	2006-09-30 14:04:51 UTC (rev 826)
@@ -21,9 +21,9 @@
 
 /* luminance weight, notice that these is used for linear data */
 
-#define RLUM (0.297361)
-#define GLUM (0.627355)
-#define BLUM (0.075285)
+#define RLUM (0.3086)
+#define GLUM (0.6094)
+#define BLUM (0.0820)
 
 #define GAMMA 2.2 /* this is ONLY used to render the histogram */
 

Modified: trunk/src/rawstudio.c
===================================================================
--- trunk/src/rawstudio.c	2006-09-29 00:07:41 UTC (rev 825)
+++ trunk/src/rawstudio.c	2006-09-30 14:04:51 UTC (rev 826)
@@ -50,11 +50,10 @@
 #endif
 gushort loadtable[65536];
 
+static cmsHPROFILE testProfile = NULL;
 static cmsHPROFILE genericLoadProfile = NULL;
 static cmsHPROFILE genericRGBProfile = NULL;
-static cmsHPROFILE workProfile = NULL;
 
-static cmsHTRANSFORM loadTransform = NULL;
 static cmsHTRANSFORM displayTransform = NULL;
 static cmsHTRANSFORM exportTransform = NULL;
 
@@ -76,8 +75,6 @@
 static guchar *mycms_pack_rgb_b(void *info, register WORD wOut[], register LPBYTE output);
 static guchar *mycms_unroll_rgb_w(void *info, register WORD wIn[], register LPBYTE accum);
 static guchar *mycms_unroll_rgb_w_loadtable(void *info, register WORD wIn[], register LPBYTE accum);
-static guchar *mycms_unroll_rgb4_w(void *info, register WORD wIn[], register LPBYTE accum);
-static guchar *mycms_unroll_rgb4_w_loadtable(void *info, register WORD wIn[], register LPBYTE accum);
 static guchar *mycms_pack_rgb4_w(void *info, register WORD wOut[], register LPBYTE output);
 static gboolean dotdir_is_local = FALSE;
 static gboolean load_gdk = FALSE;
@@ -749,7 +746,6 @@
 	guint x,y;
 	guint srcoffset, destoffset;
 	gint64 shift;
-	gushort *buffer;
 
 	raw = (dcraw_data *) g_malloc(sizeof(dcraw_data));
 	if (!dcraw_open(raw, (char *) filename))
@@ -757,9 +753,8 @@
 		dcraw_load_raw(raw);
 		photo = rs_photo_new();
 		shift = (gint64) (16.0-log((gdouble) raw->rgbMax)/log(2.0)+0.5);
-		photo->input = rs_image16_new(raw->raw.width, raw->raw.height, 3, 4);
+		photo->input = rs_image16_new(raw->raw.width, raw->raw.height, 4, 4);
 		src  = (gushort *) raw->raw.image;
-		buffer = g_malloc(raw->raw.width*4*sizeof(gushort));
 #ifdef __i386__
 		if (cpuflags & _MMX)
 		{
@@ -771,7 +766,7 @@
 			sub[3] = raw->black;
 			for (y=0; y<raw->raw.height; y++)
 			{
-				destoffset = (guint) buffer;//(photo->input->pixels + y*photo->input->rowstride);
+				destoffset = (guint) (photo->input->pixels + y*photo->input->rowstride);
 				srcoffset = (guint) (src + y * photo->input->w * photo->input->pixelsize);
 				x = raw->raw.width;
 				asm volatile (
@@ -818,9 +813,6 @@
 					: "r" (sub), "r" (x), "r" (&shift)
 					: "%eax"
 				);
-				cmsDoTransform(loadTransform, buffer,
-					(photo->input->pixels + y*photo->input->rowstride),
-					raw->raw.width);
 			}
 		}
 		else
@@ -828,29 +820,27 @@
 		{
 			for (y=0; y<raw->raw.height; y++)
 			{
-				destoffset = 0;
+				destoffset = y*photo->input->rowstride;
 				srcoffset = y * raw->raw.width * 4;
 				for (x=0; x<raw->raw.width; x++)
 				{
-					register gint r,g,b;
+					register gint r,g,b,g2;
 					r = (src[srcoffset++] - raw->black)<<shift;
 					g = (src[srcoffset++] - raw->black)<<shift;
 					b = (src[srcoffset++] - raw->black)<<shift;
-					srcoffset++;
+					g2 = (src[srcoffset++] - raw->black)<<shift;
 					_CLAMP65535_TRIPLET(r, g, b);
-					buffer[destoffset++] = r;
-					buffer[destoffset++] = g;
-					buffer[destoffset++] = b;
+					_CLAMP65535(g2);
+					photo->input->pixels[destoffset++] = r;
+					photo->input->pixels[destoffset++] = g;
+					photo->input->pixels[destoffset++] = b;
+					photo->input->pixels[destoffset++] = g2;
 				}
-				cmsDoTransform(loadTransform, buffer,
-					photo->input->pixels+y*photo->input->rowstride,
-					raw->raw.width);
 			}
 		}
 		photo->filename = g_strdup(filename);
 		dcraw_close(raw);
 		photo->active = TRUE;
-		g_free(buffer);
 	}
 	g_free(raw);
 	return(photo);
@@ -1277,7 +1267,7 @@
 		39913, 39913, 39913,
 		51855, 51855, 51855
 	};
-	cmsDoTransform(loadTransform, table_lin, buffer, 9);
+	cmsDoTransform(transform, table_lin, buffer, 9);
 	for (n=0;n<9;n++)
 	{
 		lin += abs(buffer[n*4]-table_lin[n*3]);
@@ -1296,81 +1286,49 @@
 void
 rs_cms_prepare_transforms(RS_BLOB *rs)
 {
-	gdouble gamma;
+	gfloat gamma;
+	cmsHPROFILE in, di, ex;
+	cmsHTRANSFORM testtransform;
+
 	if (rs->cms_enabled)
 	{
-		
 		if (rs->loadProfile)
-		{
-			if (loadTransform)
-				cmsDeleteTransform(loadTransform);
-			loadTransform = cmsCreateTransform(rs->loadProfile, TYPE_RGB_16,
-				workProfile, TYPE_RGB_16, rs->cms_intent, 0);
-		}
+			in = rs->loadProfile;
 		else
-			loadTransform = cmsCreateTransform(genericLoadProfile, TYPE_RGB_16,
-				workProfile, TYPE_RGB_16, rs->cms_intent, 0);
-	}
-	else
-	{
-		if (loadTransform)
-			cmsDeleteTransform(loadTransform);
-		loadTransform = cmsCreateTransform(workProfile, TYPE_RGB_16,
-				workProfile, TYPE_RGB_16, rs->cms_intent, 0);
-	}
+			in = genericLoadProfile;
 
-	cmsSetUserFormatters(loadTransform, TYPE_RGB_16, mycms_unroll_rgb_w, TYPE_RGB_16, mycms_pack_rgb4_w);
-	gamma = rs_cms_guess_gamma(loadTransform);
-	if (gamma != 1.0)
-	{
-		make_gammatable16(loadtable, gamma);
-#ifdef __i386__
-		if (cpuflags & _MMX)
-			cmsSetUserFormatters(loadTransform, TYPE_RGB_16, mycms_unroll_rgb4_w_loadtable, TYPE_RGB_16, mycms_pack_rgb4_w);
+		if (rs->displayProfile)
+			di = rs->displayProfile;
 		else
-#endif
-			cmsSetUserFormatters(loadTransform, TYPE_RGB_16, mycms_unroll_rgb_w_loadtable, TYPE_RGB_16, mycms_pack_rgb4_w);
-	}
-	else
-#ifdef __i386__
-		if (cpuflags & _MMX)
-			cmsSetUserFormatters(loadTransform, TYPE_RGB_16, mycms_unroll_rgb4_w, TYPE_RGB_16, mycms_pack_rgb4_w);
+			di = genericRGBProfile;
+
+
+		if (rs->exportProfile)
+			ex = rs->exportProfile;
 		else
-#endif
-			cmsSetUserFormatters(loadTransform, TYPE_RGB_16, mycms_unroll_rgb_w, TYPE_RGB_16, mycms_pack_rgb4_w);
+			ex = genericRGBProfile;
 
-	if (rs->displayProfile)
-	{
 		if (displayTransform)
 			cmsDeleteTransform(displayTransform);
-		displayTransform = cmsCreateTransform(workProfile, TYPE_RGB_16,
-			rs->displayProfile, TYPE_RGB_8, rs->cms_intent, 0);
-	}
-	else
-	{
-		if (displayTransform)
-			cmsDeleteTransform(displayTransform);
-		displayTransform = cmsCreateTransform(workProfile, TYPE_RGB_16,
-			genericRGBProfile, TYPE_RGB_8, rs->cms_intent, 0);
-	}
-	cmsSetUserFormatters(displayTransform, TYPE_RGB_16, mycms_unroll_rgb_w, TYPE_RGB_8, mycms_pack_rgb_b);
+		displayTransform = cmsCreateTransform(in, TYPE_RGB_16,
+			di, TYPE_RGB_8, rs->cms_intent, 0);
 
-	if (rs->exportProfile)
-	{
 		if (exportTransform)
 			cmsDeleteTransform(exportTransform);
-		exportTransform = cmsCreateTransform(workProfile, TYPE_RGB_16,
-			rs->exportProfile, TYPE_RGB_8, rs->cms_intent, 0);
-	}
-	else
-	{
-		if (exportTransform)
-			cmsDeleteTransform(exportTransform);
-		exportTransform = cmsCreateTransform(workProfile, TYPE_RGB_16,
-			genericRGBProfile, TYPE_RGB_8, rs->cms_intent, 0);
-	}
-	cmsSetUserFormatters(exportTransform, TYPE_RGB_16, mycms_unroll_rgb_w, TYPE_RGB_8, mycms_pack_rgb_b);
+		exportTransform = cmsCreateTransform(in, TYPE_RGB_16,
+			ex, TYPE_RGB_8, rs->cms_intent, 0);
 
+		testtransform = cmsCreateTransform(in, TYPE_RGB_16, genericLoadProfile, TYPE_RGB_16, rs->cms_intent, 0);
+		cmsSetUserFormatters(testtransform, TYPE_RGB_16, mycms_unroll_rgb_w, TYPE_RGB_16, mycms_pack_rgb4_w);
+		gamma = rs_cms_guess_gamma(testtransform);
+		if (gamma != 1.0)
+		{
+			make_gammatable16(loadtable, gamma);
+			cmsSetUserFormatters(displayTransform, TYPE_RGB_16, mycms_unroll_rgb_w_loadtable, TYPE_RGB_8, mycms_pack_rgb_b);
+		}
+		else
+			cmsSetUserFormatters(displayTransform, TYPE_RGB_16, mycms_unroll_rgb_w, TYPE_RGB_8, mycms_pack_rgb_b);
+	}
 	rs_render_select(rs->cms_enabled);
 	return;
 }
@@ -1397,7 +1355,7 @@
 	gamma[0] = gamma[1] = gamma[2] = cmsBuildGamma(2,1.0);
 
 	/* set up builtin profiles */
-	workProfile = cmsCreateRGBProfile(&D65, &AdobeRGBPrimaries, gamma);
+	testProfile = cmsCreateRGBProfile(&D65, &AdobeRGBPrimaries, gamma);
 	genericRGBProfile = cmsCreate_sRGBProfile();
 	genericLoadProfile = cmsCreateRGBProfile(&D65, &genericLoadPrimaries, gamma);
 
@@ -1462,24 +1420,6 @@
 }
 
 static guchar *
-mycms_unroll_rgb4_w(void *info, register WORD wIn[], register LPBYTE accum)
-{
-	wIn[0] = *(LPWORD) accum; accum+= 2;
-	wIn[1] = *(LPWORD) accum; accum+= 2;
-	wIn[2] = *(LPWORD) accum; accum+= 4;
-	return(accum);
-}
-
-static guchar *
-mycms_unroll_rgb4_w_loadtable(void *info, register WORD wIn[], register LPBYTE accum)
-{
-	wIn[0] = loadtable[*(LPWORD) accum]; accum+= 2;
-	wIn[1] = loadtable[*(LPWORD) accum]; accum+= 2;
-	wIn[2] = loadtable[*(LPWORD) accum]; accum+= 4;
-	return(accum);
-}
-
-static guchar *
 mycms_pack_rgb4_w(void *info, register WORD wOut[], register LPBYTE output)
 {
 #if defined (__i386__) || defined (__x86_64__)

Modified: trunk/src/rs-render.c
===================================================================
--- trunk/src/rs-render.c	2006-09-29 00:07:41 UTC (rev 825)
+++ trunk/src/rs-render.c	2006-09-30 14:04:51 UTC (rev 826)
@@ -130,17 +130,17 @@
 	gfloat top[4] align(16) = {65535.0, 65535.0, 65535.0, 65535.0};
 	gfloat mat[12] align(16) = {
 		photo->mat.coeff[0][0],
-		photo->mat.coeff[1][0],
+		photo->mat.coeff[1][0]*0.5,
 		photo->mat.coeff[2][0],
-		0.0,
+		photo->mat.coeff[1][0]*0.5,
 		photo->mat.coeff[0][1],
-		photo->mat.coeff[1][1],
+		photo->mat.coeff[1][1]*0.5,
 		photo->mat.coeff[2][1],
-		0.0,
+		photo->mat.coeff[1][1]*0.5,
 		photo->mat.coeff[0][2],
-		photo->mat.coeff[1][2],
+		photo->mat.coeff[1][2]*0.5,
 		photo->mat.coeff[2][2],
-		0.0 };
+		photo->mat.coeff[1][2]*0.5 };
 	asm volatile (
 		"movups (%2), %%xmm2\n\t" /* rs->pre_mul */
 		"movaps (%0), %%xmm3\n\t" /* matrix */
@@ -224,17 +224,17 @@
 	gfloat mat[12] align(8);
 	gfloat top[2] align(8);
 	mat[0] = photo->mat.coeff[0][0];
-	mat[1] = photo->mat.coeff[0][1];
+	mat[1] = photo->mat.coeff[0][1]*0.5;
 	mat[2] = photo->mat.coeff[0][2];
-	mat[3] = photo->mat.coeff[0][1]*0.0;
+	mat[3] = photo->mat.coeff[0][1]*0.5;
 	mat[4] = photo->mat.coeff[1][0];
-	mat[5] = photo->mat.coeff[1][1];
+	mat[5] = photo->mat.coeff[1][1]*0.5;
 	mat[6] = photo->mat.coeff[1][2];
-	mat[7] = photo->mat.coeff[1][1]*0.0;
+	mat[7] = photo->mat.coeff[1][1]*0.5;
 	mat[8] = photo->mat.coeff[2][0];
-	mat[9] = photo->mat.coeff[2][1];
+	mat[9] = photo->mat.coeff[2][1]*0.5;
 	mat[10] = photo->mat.coeff[2][2];
-	mat[11] = photo->mat.coeff[2][1]*0.0;
+	mat[11] = photo->mat.coeff[2][1]*0.5;
 	top[0] = 65535.0;
 	top[1] = 65535.0;
 	asm volatile (
@@ -375,18 +375,18 @@
 	gint col;
 	gfloat top[4] align(16) = {65535.0, 65535.0, 65535.0, 65535.0};
 	gfloat mat[12] align(16) = {
-	photo->mat.coeff[0][0],
-	photo->mat.coeff[1][0],
-	photo->mat.coeff[2][0],
-	0.0,
-	photo->mat.coeff[0][1],
-	photo->mat.coeff[1][1],
-	photo->mat.coeff[2][1],
-	0.0,
-	photo->mat.coeff[0][2],
-	photo->mat.coeff[1][2],
-	photo->mat.coeff[2][2],
-	0.0 };
+		photo->mat.coeff[0][0],
+		photo->mat.coeff[1][0]*0.5,
+		photo->mat.coeff[2][0],
+		photo->mat.coeff[1][0]*0.5,
+		photo->mat.coeff[0][1],
+		photo->mat.coeff[1][1]*0.5,
+		photo->mat.coeff[2][1],
+		photo->mat.coeff[1][1]*0.5,
+		photo->mat.coeff[0][2],
+		photo->mat.coeff[1][2]*0.5,
+		photo->mat.coeff[2][2],
+		photo->mat.coeff[1][2]*0.5 };
 	asm volatile (
 		"movups (%2), %%xmm2\n\t" /* rs->pre_mul */
 		"movaps (%0), %%xmm3\n\t" /* matrix */
@@ -468,17 +468,17 @@
 	gfloat mat[12] align(8);
 	gfloat top[2] align(8);
 	mat[0] = photo->mat.coeff[0][0];
-	mat[1] = photo->mat.coeff[0][1];
+	mat[1] = photo->mat.coeff[0][1]*0.5;
 	mat[2] = photo->mat.coeff[0][2];
-	mat[3] = photo->mat.coeff[0][1]*0.0;
+	mat[3] = photo->mat.coeff[0][1]*0.5;
 	mat[4] = photo->mat.coeff[1][0];
-	mat[5] = photo->mat.coeff[1][1];
+	mat[5] = photo->mat.coeff[1][1]*0.5;
 	mat[6] = photo->mat.coeff[1][2];
-	mat[7] = photo->mat.coeff[1][1]*0.0;
+	mat[7] = photo->mat.coeff[1][1]*0.5;
 	mat[8] = photo->mat.coeff[2][0];
-	mat[9] = photo->mat.coeff[2][1];
+	mat[9] = photo->mat.coeff[2][1]*0.5;
 	mat[10] = photo->mat.coeff[2][2];
-	mat[11] = photo->mat.coeff[2][1]*0.0;
+	mat[11] = photo->mat.coeff[2][1]*0.5;
 	top[0] = 65535.0;
 	top[1] = 65535.0;
 	asm volatile (




More information about the Rawstudio-commit mailing list