[Sumover-dev] [svn commit] r3779 - vic/trunk/render

sumover-dev at cs.ucl.ac.uk sumover-dev at cs.ucl.ac.uk
Thu Aug 3 18:20:14 BST 2006


Author: ucacsva
Date: Thu Aug  3 18:20:13 2006
New Revision: 3779

Modified:
   vic/trunk/render/ppm.cpp

Log:
Adapted ppm file format routines to work via Tcl calls. This was necessary since the ppm logo file in now opened from a tcl script for overlays.

Modified: vic/trunk/render/ppm.cpp
==============================================================================
--- vic/trunk/render/ppm.cpp	(original)
+++ vic/trunk/render/ppm.cpp	Thu Aug  3 18:20:13 2006
@@ -35,8 +35,9 @@
 static const char rcsid[] = "@(#) $Header$ (LBL)";
 #endif
 
-#include <tk.h>
 #include "vic_tcl.h"
+#include <tk.h>
+
 
 class PPM : public TclObject {
 public:
@@ -44,8 +45,8 @@
 	~PPM();
 	int command(int argc, const char*const* argv);
 protected:
-	int load(FILE* f);
-	int dump(FILE* f);
+	int load(Tcl_Channel tclChannel);
+	int dump(Tcl_Channel tclChannel);
 	int width_;
 	int height_;
 	u_char* image_;
@@ -68,9 +69,11 @@
 	delete image_;
 }
 
+
 int PPM::command(int argc, const char*const* argv)
 {
 	Tcl& tcl = Tcl::instance();
+
 	if (argc == 2) {
 		if (strcmp(argv[1], "width") == 0) {
 			sprintf(tcl.buffer(), "%d", width_);
@@ -84,23 +87,47 @@
 		}
 	} else if (argc == 3) {
 		if (strcmp(argv[1], "load") == 0) {
-			FILE* f;
-			if (Tcl_GetOpenFile(tcl.interp(), (char*)argv[2],
-					    0, 1, (void **)&f) != TCL_OK ||
-			    load(f) < 0)
+			Tcl_Channel Ch;
+			if ( (Ch = Tcl_OpenFileChannel(tcl.interp(), (char*)argv[2], "r", 0777)) == NULL)
+			{
+				printf("ppm.cpp: Can't obtain channel for open file %s. ErrMsg = %s\n", (char*)argv[2], Tcl_ErrnoMsg(Tcl_GetErrno()));
 				tcl.result("0");
-			else
+				exit(1);
+			}
+			else {
+				//printf("ppm.cpp: Opened file %s\n", (char*)argv[2]);
+				//Tcl_SetChannelOption(tcl.interp(), Ch, "translation", "binary");
 				tcl.result("1");
+			}
+			if (load(Ch) < 0) {
+				//printf("ppm.cpp: Can't load file %s from channel\n", (char*)argv[2]);
+				tcl.result("0");
+				exit(1);
+			} else  {
+				Tcl_Close(tcl.interp(), Ch);
+				//printf("ppm.cpp: Loaded file %s\n", (char*)argv[2]);
+			}
 			return (TCL_OK);
 		}
 		if (strcmp(argv[1], "dump-yuv") == 0) {
-			FILE* f;
-			if (Tcl_GetOpenFile(tcl.interp(), (char*)argv[2],
-					    1, 1, (void **)&f) != TCL_OK ||
-			    dump(f) < 0)
+			Tcl_Channel Ch;
+			if ((Ch = Tcl_OpenFileChannel(tcl.interp(), (char*)argv[2], "w+", 0777)) == NULL)
+			{
+				printf("ppm.cpp: Can't obtain channel for dumping file %s.\nErrMsg = \"%s\"\n", (char*)argv[2], Tcl_ErrnoMsg(Tcl_GetErrno()));
 				tcl.result("0");
-			else
+				exit(1);
+			}
+			else {
+				//Tcl_SetChannelOption(tcl.interp(), Ch, "translation", "binary");
 				tcl.result("1");
+			}
+			if (dump(Ch) < 0) {
+				printf("ppm.cpp: Can't dump file %s into channel %d\n", (char*)argv[2], Ch);
+				tcl.result("0");
+				exit(1);
+			} else {
+				Tcl_Close(tcl.interp(), Ch);
+			}
 			return (TCL_OK);
 		}
 	}
@@ -108,39 +135,53 @@
 }
 	
 static int
-readline(FILE *fp, char* line, int size)
+readline(Tcl_Channel tclChannel, char *cline)
 {
+	Tcl_DString line;
+
 	for (;;) {
-		if (fgets(line, size, fp) == 0)
+		Tcl_DStringInit(&line);
+
+		if (Tcl_Gets(tclChannel, &line) == 0)
 			return (-1);
-		if (*line != '#')
+
+		sprintf(cline, "%s", Tcl_DStringValue(&line));
+
+		Tcl_DStringFree(&line);
+
+		if (cline[0] != '#')
 			return (0);
 	}
 }
 
 static int
-readhdr(FILE *fp, int *width, int *height, int *maxval)
+readhdr(Tcl_Channel tclChannel, int *width, int *height, int *maxval)
 {
-	char line[1024];
-	if (readline(fp, line, sizeof(line)) < 0 ||
-	    line[0] != 'P' || line[1] != '6')
+	int gotLine;
+	char cline[1000];
+
+	gotLine = readline(tclChannel, cline);
+	if ( gotLine < 0 || cline[0] != 'P' || cline[1] != '6')
 		return (-1);
 
-	if (readline(fp, line, sizeof(line)) < 0 ||
-	    sscanf(line, "%d %d", width, height) != 2)
+	gotLine = readline(tclChannel, cline);
+	if (gotLine < 0 || sscanf(cline, "%d %d", width, height) != 2)
 		return (-1);
 
-	if (readline(fp, line, sizeof(line)) < 0 ||
-	    sscanf(line, "%d", maxval) != 1)
+	gotLine = readline(tclChannel, cline);
+	if (gotLine < 0 || sscanf(cline, "%d", maxval) != 1)
 		return (-1);
 
 	return (0);
 }
 
-int PPM::load(FILE* f)
+int PPM::load(Tcl_Channel tclChannel)
 {
+	Tcl& tcl = Tcl::instance();
+
 	int maxval;
-	if (readhdr(f, &width_, &height_, &maxval) < 0)
+
+	if (readhdr(tclChannel, &width_, &height_, &maxval) < 0)
 		return (-1);
 	int n = width_ * height_;
 	if (n > 1024*1024)
@@ -148,27 +189,57 @@
 	delete image_;
 	image_ = new u_char[2 * n];
 	u_char* p = image_;
-	for (int k = n >> 1; --k >= 0; ) {
-		double r = getc(f);
-		double g = getc(f);
-		double b = getc(f);
 
-		printf("%d:\t%d %d %d\n", k, int(r), int(g), int(b));
+	for (int k = n >> 1; --k >= 0; ) {
 		
-		/* can't have overflow in this direction */
-		double y0 = 0.299 * r + 0.587 * g + 0.114 * b;
-		double u = -0.1687 * r - 0.3313 * g + 0.5 * b;
-		double v = 0.5 * r - 0.4187 * g - 0.0813 * b;
+		char R, G, B;
+		int ret;
+		
+		ret = Tcl_Read(tclChannel, &R, sizeof(char));
+		if ( ret < 0)
+		{
+			printf("Tcl_Read: ret = %d. Err = \"%s\"\n", ret, Tcl_ErrnoMsg(Tcl_GetErrno()));
+			return (-1);
+		}
+
+		ret = Tcl_Read(tclChannel, &G, sizeof(char));
+		if ( ret < 0)
+		{
+			printf("Tcl_Read: ret = %d. Err = \"%s\"\n", ret, Tcl_ErrnoMsg(Tcl_GetErrno()));		
+		}
+
+		ret = Tcl_Read(tclChannel, &B, sizeof(char));
+		if ( ret < 0)
+		{
+			printf("Tcl_Read: ret = %d. Err = \"%s\"\n", ret, Tcl_ErrnoMsg(Tcl_GetErrno()));		
+		}
+
+		// can't have overflow in this direction
+		double y0 = 0.299 * (u_char)R + 0.587 * (u_char)G + 0.114 * (u_char)B;
+		double u = -0.1687 * (u_char)R - 0.3313 * (u_char)G + 0.5 * (u_char)B;
+		double v = 0.5 * (u_char)R - 0.4187 * (u_char)G - 0.0813 * (u_char)B;
 		
-		r = getc(f);
-		g = getc(f);
-		b = getc(f);
 
-		printf("%d:\t%d %d %d\n", k, int(r), int(g), int(b));
+		ret = Tcl_Read(tclChannel, &R, sizeof(char));
+		if ( ret < 0)
+		{
+			printf("Tcl_Read: ret = %d. Err = \"%s\"\n", ret, Tcl_ErrnoMsg(Tcl_GetErrno()));
+			return (-1);
+		}
+
+		ret = Tcl_Read(tclChannel, &G, sizeof(char));
+		if ( ret < 0)
+		{
+			printf("Tcl_Read: ret = %d. Err = \"%s\"\n", ret, Tcl_ErrnoMsg(Tcl_GetErrno()));		
+		}
 
-		double y1 = 0.299 * r + 0.587 * g + 0.114 * b;
+		ret = Tcl_Read(tclChannel, &B, sizeof(char));
+		if ( ret < 0)
+		{
+			printf("Tcl_Read: ret = %d. Err = \"%s\"\n", ret, Tcl_ErrnoMsg(Tcl_GetErrno()));		
+		}
 
-	//	printf("%d:\t%d %d %d\n", k, int(r), int(g), int(b));
+		double y1 = 0.299 * (u_char)R + 0.587 * (u_char)G + 0.114 * (u_char)B;
 
 		p[0] = int(y0);
 		p[1] = int(u + 128);
@@ -176,16 +247,20 @@
 		p[3] = int(v + 128);
 		p += 4;
 	}
+	return 0;
 }
 
-int PPM::dump(FILE* f)
+int PPM::dump(Tcl_Channel tclChannel)
 {
 	int n = width_ * height_;
 	if (n <= 0)
 		return (-1);
 
-	if (fwrite(image_, 2 * n, 1, f) == 0)
+	if (Tcl_Write(tclChannel, (char *)image_, 2 * n) < 0)
+	{
+		printf("ppm.cpp: Tcl_Write() failed. ErrMsg = %s\n", Tcl_ErrnoMsg(Tcl_GetErrno()));
 		return (-1);
+	}
 
 	return (0);
 }



More information about the Sumover-dev mailing list