[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14039] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Mar 10 12:39:38 CET 2008


Revision: 14039
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14039
Author:   blendix
Date:     2008-03-10 12:39:37 +0100 (Mon, 10 Mar 2008)

Log Message:
-----------

Add an option for saving/loading DPX with in log color space with
reference black, reference white and gamma.

Added 16 bit TIFF saving.

This needs more work to cleanup code and add 16 bit TIFF reading, but
committing it now so it can be tested.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/imbuf/IMB_imbuf_types.h
    trunk/blender/source/blender/imbuf/intern/cineon/cineon_dpx.c
    trunk/blender/source/blender/imbuf/intern/cineon/cineonlib.c
    trunk/blender/source/blender/imbuf/intern/cineon/dpxlib.c
    trunk/blender/source/blender/imbuf/intern/cineon/logImageCore.c
    trunk/blender/source/blender/imbuf/intern/cineon/logImageCore.h
    trunk/blender/source/blender/imbuf/intern/cineon/logImageLib.c
    trunk/blender/source/blender/imbuf/intern/cineon/logImageLib.h
    trunk/blender/source/blender/imbuf/intern/tiff.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/src/buttons_scene.c

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c	2008-03-10 05:22:18 UTC (rev 14038)
+++ trunk/blender/source/blender/blenkernel/intern/image.c	2008-03-10 11:39:37 UTC (rev 14039)
@@ -1182,6 +1182,9 @@
 	}
 	else if ((G.have_libtiff) && (imtype==R_TIFF)) {
 		ibuf->ftype= TIF;
+
+		if(subimtype & R_TIFF_16BIT)
+			ibuf->ftype |= TIF_16BIT;
 	}
 #ifdef WITH_OPENEXR
 	else if (imtype==R_OPENEXR || imtype==R_MULTILAYER) {

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2008-03-10 05:22:18 UTC (rev 14038)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2008-03-10 11:39:37 UTC (rev 14039)
@@ -225,6 +225,10 @@
 	sce->r.simplify_shadowsamples= 16;
 	sce->r.simplify_aosss= 1.0f;
 
+	sce->r.cineonblack= 95;
+	sce->r.cineonwhite= 685;
+	sce->r.cineongamma= 1.7f;
+	
 	sce->toolsettings = MEM_callocN(sizeof(struct ToolSettings),"Tool Settings Struct");
 	sce->toolsettings->cornertype=1;
 	sce->toolsettings->degr = 90; 
@@ -267,7 +271,7 @@
 	sce->r.osa= 8;
 
 	sculptdata_init(sce);
-	
+
 	/* note; in header_info.c the scene copy happens..., if you add more to renderdata it has to be checked there */
 	scene_add_render_layer(sce);
 	

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2008-03-10 05:22:18 UTC (rev 14038)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2008-03-10 11:39:37 UTC (rev 14039)
@@ -7095,6 +7095,12 @@
 				sce->r.simplify_shadowsamples= 16;
 				sce->r.simplify_aosss= 1.0f;
 			}
+
+			if(sce->r.cineongamma == 0) {
+				sce->r.cineonblack= 95;
+				sce->r.cineonwhite= 685;
+				sce->r.cineongamma= 1.7f;
+			}
 		}
 
 		for(ntree=main->nodetree.first; ntree; ntree= ntree->id.next)

Modified: trunk/blender/source/blender/imbuf/IMB_imbuf_types.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_imbuf_types.h	2008-03-10 05:22:18 UTC (rev 14038)
+++ trunk/blender/source/blender/imbuf/IMB_imbuf_types.h	2008-03-10 11:39:37 UTC (rev 14039)
@@ -170,6 +170,7 @@
 
 #define RADHDR			(1 << 24)
 #define TIF				(1 << 23)
+#define TIF_16BIT		(1 << 8 )
 
 #define OPENEXR			(1 << 22)
 #define OPENEXR_HALF	(1 << 8 )

Modified: trunk/blender/source/blender/imbuf/intern/cineon/cineon_dpx.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/cineon/cineon_dpx.c	2008-03-10 05:22:18 UTC (rev 14038)
+++ trunk/blender/source/blender/imbuf/intern/cineon/cineon_dpx.c	2008-03-10 11:39:37 UTC (rev 14039)
@@ -42,14 +42,29 @@
 
 #include "MEM_guardedalloc.h"
 
+/* ugly bad level, should be fixed */
+#include "DNA_scene_types.h"
+#include "BKE_global.h"
+
+static void cineon_conversion_parameters(LogImageByteConversionParameters *params)
+{
+	params->blackPoint = G.scene->r.cineonblack;
+	params->whitePoint = G.scene->r.cineonwhite;
+	params->gamma = G.scene->r.cineongamma;
+	params->doLogarithm = G.scene->r.subimtype & R_CINEON_LOG;
+}
+
 static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int size, int flags)
 {
+	LogImageByteConversionParameters conversion;
 	ImBuf *ibuf;
 	LogImageFile *image;
 	int x, y;
 	unsigned short *row, *upix;
 	int width, height, depth;
 	float *frow;
+
+	cineon_conversion_parameters(&conversion);
 	
 	image = logImageOpenFromMem(mem, size, use_cineon);
 	
@@ -70,6 +85,8 @@
 		return NULL;
 	}
 	
+	logImageSetByteConversion(image, &conversion);
+
 	ibuf = IMB_allocImBuf(width, height, 32, IB_rectfloat | flags, 0);
 
 	row = MEM_mallocN(sizeof(unsigned short)*width*depth, "row in cineon_dpx.c");
@@ -107,10 +124,9 @@
 	int i, j;
 	int index;
 	float *fline;
-	
-	conversion.blackPoint = 95;
-	conversion.whitePoint = 685;
-	conversion.gamma = 1;
+
+	cineon_conversion_parameters(&conversion);
+
 	/*
 	 * Get the drawable for the current image...
 	 */

Modified: trunk/blender/source/blender/imbuf/intern/cineon/cineonlib.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/cineon/cineonlib.c	2008-03-10 05:22:18 UTC (rev 14038)
+++ trunk/blender/source/blender/imbuf/intern/cineon/cineonlib.c	2008-03-10 11:39:37 UTC (rev 14039)
@@ -350,8 +350,10 @@
 
 	/* extract required pixels */
 	for (pixelIndex = 0; pixelIndex < numPixels; ++pixelIndex) {
-		/* row[pixelIndex] = cineon->lut10[cineon->pixelBuffer[pixelIndex]]; */
-		row[pixelIndex] = cineon->pixelBuffer[pixelIndex] << 6;
+		if(cineon->params.doLogarithm)
+			row[pixelIndex] = cineon->lut10_16[cineon->pixelBuffer[pixelIndex]];
+		else
+			row[pixelIndex] = cineon->pixelBuffer[pixelIndex] << 6;
 	}
 
 	return 0;
@@ -367,8 +369,10 @@
 
 	/* put new pixels into pixelBuffer */
 	for (pixelIndex = 0; pixelIndex < numPixels; ++pixelIndex) {
-		/* cineon->pixelBuffer[pixelIndex] = cineon->lut8[row[pixelIndex]]; */
-		cineon->pixelBuffer[pixelIndex] = row[pixelIndex] >> 6;
+		if(cineon->params.doLogarithm)
+			cineon->pixelBuffer[pixelIndex] = cineon->lut16_16[row[pixelIndex]];
+		else
+			cineon->pixelBuffer[pixelIndex] = row[pixelIndex] >> 6;
 	}
 
 	/* pack into longwords */

Modified: trunk/blender/source/blender/imbuf/intern/cineon/dpxlib.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/cineon/dpxlib.c	2008-03-10 05:22:18 UTC (rev 14038)
+++ trunk/blender/source/blender/imbuf/intern/cineon/dpxlib.c	2008-03-10 11:39:37 UTC (rev 14039)
@@ -199,7 +199,7 @@
 #endif
 }
 
-static int verbose = 0;
+static int verbose = 1;
 void
 dpxSetVerbose(int verbosity) {
 	verbose = verbosity;
@@ -275,8 +275,10 @@
 
 	/* extract required pixels */
 	for (pixelIndex = 0; pixelIndex < numPixels; ++pixelIndex) {
-		/* row[pixelIndex] = dpx->lut10[dpx->pixelBuffer[pixelIndex]]; */
-		row[pixelIndex] = dpx->pixelBuffer[pixelIndex] << 6;
+		if(dpx->params.doLogarithm)
+			row[pixelIndex] = dpx->lut10_16[dpx->pixelBuffer[pixelIndex]];
+		else
+			row[pixelIndex] = dpx->pixelBuffer[pixelIndex] << 6;
 	}
 
 	/* save remaining pixels */
@@ -316,8 +318,10 @@
 
 	/* put new pixels into pixelBuffer */
 	for (pixelIndex = 0; pixelIndex < numPixels; ++pixelIndex) {
-		/* dpx->pixelBuffer[dpx->pixelBufferUsed + pixelIndex] = dpx->lut8[row[pixelIndex]]; */
-		dpx->pixelBuffer[dpx->pixelBufferUsed + pixelIndex] = row[pixelIndex] >> 6;
+		if(dpx->params.doLogarithm)
+			dpx->pixelBuffer[dpx->pixelBufferUsed + pixelIndex] = dpx->lut16_16[row[pixelIndex]];
+		else
+			dpx->pixelBuffer[dpx->pixelBufferUsed + pixelIndex] = row[pixelIndex] >> 6;
 	}
 	dpx->pixelBufferUsed += numPixels;
 

Modified: trunk/blender/source/blender/imbuf/intern/cineon/logImageCore.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/cineon/logImageCore.c	2008-03-10 05:22:18 UTC (rev 14038)
+++ trunk/blender/source/blender/imbuf/intern/cineon/logImageCore.c	2008-03-10 11:39:37 UTC (rev 14039)
@@ -93,6 +93,35 @@
 	}
 }
 
+/* set up the 10 bit to 16 bit and 16 bit to 10 bit tables */
+void
+setupLut16(LogImageFile *logImage) {
+
+	int i;
+	double f_black;
+	double scale;
+
+	f_black = convertTo(logImage->params.blackPoint, logImage->params.whitePoint, logImage->params.gamma);
+	scale = 65535.0 / (1.0 - f_black);
+
+	for (i = 0; i <= logImage->params.blackPoint; ++i) {
+		logImage->lut10_16[i] = 0;
+	}
+	for (; i < logImage->params.whitePoint; ++i) {
+		double f_i;
+		f_i = convertTo(i, logImage->params.whitePoint, logImage->params.gamma);
+		logImage->lut10_16[i] = (int)rint(scale * (f_i - f_black));
+	}
+	for (; i < 1024; ++i) {
+		logImage->lut10_16[i] = 65535;
+	}
+
+	for (i = 0; i < 65536; ++i) {
+		double f_i = f_black + (i / 65535.0) * (1.0 - f_black);
+		logImage->lut16_16[i] = convertFrom(f_i, logImage->params.whitePoint, logImage->params.gamma);
+	}
+}
+
 /* how many longwords to hold this many pixels? */
 int
 pixelsToLongs(int numPixels) {

Modified: trunk/blender/source/blender/imbuf/intern/cineon/logImageCore.h
===================================================================
--- trunk/blender/source/blender/imbuf/intern/cineon/logImageCore.h	2008-03-10 05:22:18 UTC (rev 14038)
+++ trunk/blender/source/blender/imbuf/intern/cineon/logImageCore.h	2008-03-10 11:39:37 UTC (rev 14039)
@@ -71,6 +71,9 @@
 	unsigned char lut10[1024];
 	unsigned short lut8[256];
 
+	unsigned short lut10_16[1024];
+	unsigned short lut16_16[65536];
+
 	/* pixel access functions */
 	GetRowFn* getRow;
 	SetRowFn* setRow;
@@ -82,6 +85,7 @@
 };
 
 void setupLut(LogImageFile*);
+void setupLut16(LogImageFile*);
 
 int pixelsToLongs(int numPixels);
 

Modified: trunk/blender/source/blender/imbuf/intern/cineon/logImageLib.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/cineon/logImageLib.c	2008-03-10 05:22:18 UTC (rev 14038)
+++ trunk/blender/source/blender/imbuf/intern/cineon/logImageLib.c	2008-03-10 11:39:37 UTC (rev 14039)
@@ -89,6 +89,7 @@
 	params->gamma = DEFAULT_GAMMA;
 	params->blackPoint = DEFAULT_BLACK_POINT;
 	params->whitePoint = DEFAULT_WHITE_POINT;
+	params->doLogarithm = 0;
 	return 0;
 }
 
@@ -97,6 +98,7 @@
 	params->gamma = logImage->params.gamma;
 	params->blackPoint = logImage->params.blackPoint;
 	params->whitePoint = logImage->params.whitePoint;
+	params->doLogarithm = 0;
 	return 0;
 }
 
@@ -110,7 +112,8 @@
 		logImage->params.gamma = params->gamma;
 		logImage->params.blackPoint = params->blackPoint;
 		logImage->params.whitePoint = params->whitePoint;
-		setupLut(logImage);
+		logImage->params.doLogarithm = params->doLogarithm;
+		setupLut16(logImage);
 		return 0;
 	}
 	return 1;

Modified: trunk/blender/source/blender/imbuf/intern/cineon/logImageLib.h
===================================================================
--- trunk/blender/source/blender/imbuf/intern/cineon/logImageLib.h	2008-03-10 05:22:18 UTC (rev 14038)
+++ trunk/blender/source/blender/imbuf/intern/cineon/logImageLib.h	2008-03-10 11:39:37 UTC (rev 14039)
@@ -47,6 +47,7 @@
 	float gamma;
 	int blackPoint;
 	int whitePoint;
+	int doLogarithm;
 } LogImageByteConversionParameters;
 
 /* int functions return 0 for OK */


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list