[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55781] trunk/blender: Fix #34863: bge. render.makeScreenshot from Blender was only saving PNG files,

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Apr 4 16:00:31 CEST 2013


Revision: 55781
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55781
Author:   blendix
Date:     2013-04-04 14:00:31 +0000 (Thu, 04 Apr 2013)
Log Message:
-----------
Fix #34863: bge.render.makeScreenshot from Blender was only saving PNG files,
while the docs said it followed the settings in the Output panel, other file
formats work now.

Benderplayer still only saves PNG now as documented, but I cleaned up the code
there to reuse existing imbuf functions rather than using own libpng code.

Modified Paths:
--------------
    trunk/blender/doc/python_api/rst/bge.render.rst
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.h
    trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.cpp

Modified: trunk/blender/doc/python_api/rst/bge.render.rst
===================================================================
--- trunk/blender/doc/python_api/rst/bge.render.rst	2013-04-04 13:37:07 UTC (rev 55780)
+++ trunk/blender/doc/python_api/rst/bge.render.rst	2013-04-04 14:00:31 UTC (rev 55781)
@@ -97,7 +97,7 @@
    The standalone player saves .png files. It does not support color space conversion 
    or gamma correction.
    
-   When run from Blender, makeScreenshot supports Iris, IrisZ, TGA, Raw TGA, PNG, HamX, and Jpeg.
+   When run from Blender, makeScreenshot supports all Blender image file formats like PNG, TGA, Jpeg and OpenEXR.
    Gamma, Colorspace conversion and Jpeg compression are taken from the Render settings panels.
    
    :type filename: string

Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp	2013-04-04 13:37:07 UTC (rev 55780)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp	2013-04-04 14:00:31 UTC (rev 55781)
@@ -32,6 +32,7 @@
 
 #include "KX_BlenderCanvas.h"
 #include "DNA_screen_types.h"
+#include "DNA_windowmanager_types.h"
 #include <stdio.h>
 #include <assert.h>
 
@@ -256,5 +257,5 @@
 	area_dummy.totrct.ymin = m_frame_rect.GetBottom();
 	area_dummy.totrct.ymax = m_frame_rect.GetTop();
 
-	BL_MakeScreenShot(&area_dummy, filename);
+	BL_MakeScreenShot(m_win->screen, &area_dummy, filename);
 }

Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp	2013-04-04 13:37:07 UTC (rev 55780)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp	2013-04-04 14:00:31 UTC (rev 55781)
@@ -60,6 +60,7 @@
 #include "DNA_image_types.h"
 #include "DNA_view3d_types.h"
 #include "DNA_material_types.h"
+#include "DNA_space_types.h"
 #include "DNA_windowmanager_types.h"
 
 #include "BKE_global.h"
@@ -68,6 +69,7 @@
 #include "BKE_image.h"
 
 #include "BLI_path_util.h"
+#include "BLI_string.h"
 
 extern "C" {
 #include "IMB_imbuf_types.h"
@@ -270,8 +272,6 @@
 {
 	WM_cursor_set(win, CURSOR_STD);
 }
-#define MAX_FILE_LENGTH 512
-
 /* get shot from frontbuffer sort of a copy from screendump.c */
 static unsigned int *screenshot(ScrArea *curarea, int *dumpsx, int *dumpsy)
 {
@@ -296,27 +296,36 @@
 }
 
 /* based on screendump.c::screenshot_exec */
-void BL_MakeScreenShot(ScrArea *curarea, const char *filename)
+void BL_MakeScreenShot(bScreen *screen, ScrArea *curarea, const char *filename)
 {
-	char path[MAX_FILE_LENGTH];
-	strcpy(path,filename);
-
 	unsigned int *dumprect;
 	int dumpsx, dumpsy;
 	
-	dumprect= screenshot(curarea, &dumpsx, &dumpsy);
+	dumprect = screenshot(curarea, &dumpsx, &dumpsy);
+
 	if (dumprect) {
-		ImBuf *ibuf;
+		/* initialize image file format data */
+		Scene *scene = (screen)? screen->scene: NULL;
+		ImageFormatData im_format;
+
+		if(scene)
+			im_format = scene->r.im_format;
+		else
+			BKE_imformat_defaults(&im_format);
+
+		/* create file path */
+		char path[FILE_MAX];
+		BLI_strncpy(path, filename, sizeof(path));
 		BLI_path_abs(path, G.main->name);
-		/* BKE_add_image_extension() checks for if extension was already set */
-		BKE_add_image_extension_from_type(path, R_IMF_IMTYPE_PNG); /* scene->r.im_format.imtype */
-		ibuf= IMB_allocImBuf(dumpsx, dumpsy, 24, 0);
-		ibuf->rect= dumprect;
-		ibuf->ftype= PNG;
+		BKE_add_image_extension_from_type(path, im_format.imtype);
 
-		IMB_saveiff(ibuf, path, IB_rect);
+		/* create and save imbuf */
+		ImBuf *ibuf = IMB_allocImBuf(dumpsx, dumpsy, 24, 0);
+		ibuf->rect = dumprect;
 
-		ibuf->rect= NULL;
+		BKE_imbuf_write_as(ibuf, path, &im_format, false);
+
+		ibuf->rect = NULL;
 		IMB_freeImBuf(ibuf);
 		MEM_freeN(dumprect);
 	}

Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.h
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.h	2013-04-04 13:37:07 UTC (rev 55780)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.h	2013-04-04 14:00:31 UTC (rev 55781)
@@ -38,13 +38,14 @@
 
 struct wmWindow;
 struct ARegion;
+struct bScreen;
 
 // special swapbuffers, that takes care of which area (viewport) needs to be swapped
 void	BL_SwapBuffers(struct wmWindow *win);
 
 void	BL_warp_pointer(struct wmWindow *win,int x,int y);
 
-void	BL_MakeScreenShot(struct ScrArea *curarea, const char *filename);
+void	BL_MakeScreenShot(struct bScreen *screen, struct ScrArea *curarea, const char *filename);
 
 void	BL_HideMouse(struct wmWindow *win);
 void	BL_NormalMouse(struct wmWindow *win);

Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.cpp	2013-04-04 13:37:07 UTC (rev 55780)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_Canvas.cpp	2013-04-04 14:00:31 UTC (rev 55781)
@@ -41,6 +41,18 @@
 #include "RAS_IPolygonMaterial.h"
 #include "GPC_Canvas.h"
 
+#include "BLI_string.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_space_types.h"
+
+#include "BKE_image.h"
+
+extern "C" {
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+}
+
 GPC_Canvas::TBannerId GPC_Canvas::s_bannerId = 0;
 
 
@@ -425,114 +437,35 @@
 MakeScreenShot(
 	const char* filename
 ) {
-	png_structp png_ptr;
-	png_infop info_ptr;
-	unsigned char *pixels = 0;
-	png_bytepp row_pointers = 0;
-	int i, bytesperpixel = 3, color_type = PNG_COLOR_TYPE_RGB;
-	FILE *fp = 0;
-
-	png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
-	if (!png_ptr) 
-	{
-		std::cout << "Cannot png_create_write_struct." << std::endl;
-		return;
-	}
-
-	info_ptr = png_create_info_struct(png_ptr);
-	if (!info_ptr) 
-	{
-		png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
-		std::cout << "Cannot png_create_info_struct." << std::endl;
-		return;
-	}
-
-	if (setjmp(png_jmpbuf(png_ptr))) {
-		png_destroy_write_struct(&png_ptr, &info_ptr);
-		delete [] pixels;
-		delete [] row_pointers;
-		// printf("Aborting\n");
-		if (fp) {
-			fflush(fp);
-			fclose(fp);
-		}
-		return;
-	}
-
 	// copy image data
+	unsigned char *pixels = new unsigned char[GetWidth() * GetHeight() * 4];
 
-	pixels = new unsigned char[GetWidth() * GetHeight() * bytesperpixel * sizeof(unsigned char)];
 	if (!pixels) {
 		std::cout << "Cannot allocate pixels array" << std::endl;
 		return;
 	}
 
-	glReadPixels(0, 0, GetWidth(), GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, pixels);
+	glReadPixels(0, 0, GetWidth(), GetHeight(), GL_RGBA, GL_UNSIGNED_BYTE, pixels);
 
-	fp = fopen(filename, "wb");
-	if (!fp)
-	{
-		std::cout << "Couldn't open " << filename << " for writing." << std::endl;
-		longjmp(png_jmpbuf(png_ptr), 1);
-	}
+	// initialize image file format data
+	ImageFormatData im_format;
+	BKE_imformat_defaults(&im_format);
 
-	png_init_io(png_ptr, fp);
+	// create file path 
+	char path[FILE_MAX];
+	BLI_strncpy(path, filename, sizeof(path));
+	BKE_add_image_extension_from_type(path, im_format.imtype);
 
-#if 0
-	png_set_filter(png_ptr, 0,
-	               PNG_FILTER_NONE  | PNG_FILTER_VALUE_NONE |
-	               PNG_FILTER_SUB   | PNG_FILTER_VALUE_SUB  |
-	               PNG_FILTER_UP    | PNG_FILTER_VALUE_UP   |
-	               PNG_FILTER_AVG   | PNG_FILTER_VALUE_AVG  |
-	               PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH|
-	               PNG_ALL_FILTERS);
+	// create and save imbuf 
+	ImBuf *ibuf = IMB_allocImBuf(GetWidth(), GetHeight(), 24, 0);
+	ibuf->rect = (unsigned int*)pixels;
 
-	png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
-#endif
+	BKE_imbuf_write_as(ibuf, path, &im_format, false);
 
-	// png image settings
-	png_set_IHDR(png_ptr,
-	             info_ptr,
-	             GetWidth(),
-	             GetHeight(),
-	             8,
-	             color_type,
-	             PNG_INTERLACE_NONE,
-	             PNG_COMPRESSION_TYPE_DEFAULT,
-	             PNG_FILTER_TYPE_DEFAULT);
+	ibuf->rect = NULL;
+	IMB_freeImBuf(ibuf);
 
-	// write the file header information
-	png_write_info(png_ptr, info_ptr);
-
-	// allocate memory for an array of row-pointers
-	row_pointers = new png_bytep [(GetHeight() * sizeof(png_bytep))];
-	if (!row_pointers) 
-	{
-		std::cout << "Cannot allocate row-pointers array" << std::endl;
-		longjmp(png_jmpbuf(png_ptr), 1);
-	}
-
-	// set the individual row-pointers to point at the correct offsets
-	for (i = 0; i < GetHeight(); i++) {
-		row_pointers[GetHeight()-1-i] = (png_bytep)
-			((unsigned char *)pixels + (i * GetWidth()) * bytesperpixel * sizeof(unsigned char));
-	}
-
-	// write out the entire image data in one call
-	png_write_image(png_ptr, row_pointers);
-
-	// write the additional chunks to the PNG file (not really needed)
-	png_write_end(png_ptr, info_ptr);
-
 	// clean up
 	delete [] (pixels);
-	delete [] (row_pointers);
-	png_destroy_write_struct(&png_ptr, &info_ptr);
-
-	if (fp) 
-	{
-		fflush(fp);
-		fclose(fp);
-	}
 }
 




More information about the Bf-blender-cvs mailing list