Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/python_api/rst/bge.render.rst2
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp3
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.cpp39
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.h3
-rw-r--r--source/gameengine/GamePlayer/common/GPC_Canvas.cpp121
5 files changed, 56 insertions, 112 deletions
diff --git a/doc/python_api/rst/bge.render.rst b/doc/python_api/rst/bge.render.rst
index d07d7a8734f..e203826d318 100644
--- a/doc/python_api/rst/bge.render.rst
+++ b/doc/python_api/rst/bge.render.rst
@@ -97,7 +97,7 @@ Functions
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
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
index e51daf615b8..e15b8ac942f 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
@@ -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 @@ void KX_BlenderCanvas::MakeScreenShot(const char *filename)
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);
}
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
index f808b1b7272..ebf788024c5 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
@@ -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 @@ void BL_NormalMouse(wmWindow *win)
{
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 @@ static unsigned int *screenshot(ScrArea *curarea, int *dumpsx, int *dumpsy)
}
/* 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);
+
+ /* create and save imbuf */
+ ImBuf *ibuf = IMB_allocImBuf(dumpsx, dumpsy, 24, 0);
+ ibuf->rect = dumprect;
- IMB_saveiff(ibuf, path, IB_rect);
+ BKE_imbuf_write_as(ibuf, path, &im_format, false);
- ibuf->rect= NULL;
+ ibuf->rect = NULL;
IMB_freeImBuf(ibuf);
MEM_freeN(dumprect);
}
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.h b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
index 2545cd34acb..0f35494c73a 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
@@ -38,13 +38,14 @@ extern "C" {
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);
diff --git a/source/gameengine/GamePlayer/common/GPC_Canvas.cpp b/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
index 058454ca352..8a6a41f3f99 100644
--- a/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
@@ -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 @@ GPC_Canvas::
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);
-
- fp = fopen(filename, "wb");
- if (!fp)
- {
- std::cout << "Couldn't open " << filename << " for writing." << std::endl;
- longjmp(png_jmpbuf(png_ptr), 1);
- }
-
- png_init_io(png_ptr, fp);
+ glReadPixels(0, 0, GetWidth(), GetHeight(), GL_RGBA, GL_UNSIGNED_BYTE, pixels);
-#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);
-
- png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
-#endif
+ // initialize image file format data
+ ImageFormatData im_format;
+ BKE_imformat_defaults(&im_format);
- // 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);
-
- // 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);
- }
+ // create file path
+ char path[FILE_MAX];
+ BLI_strncpy(path, filename, sizeof(path));
+ BKE_add_image_extension_from_type(path, im_format.imtype);
- // 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));
- }
+ // create and save imbuf
+ ImBuf *ibuf = IMB_allocImBuf(GetWidth(), GetHeight(), 24, 0);
+ ibuf->rect = (unsigned int*)pixels;
- // write out the entire image data in one call
- png_write_image(png_ptr, row_pointers);
+ BKE_imbuf_write_as(ibuf, path, &im_format, false);
- // write the additional chunks to the PNG file (not really needed)
- png_write_end(png_ptr, info_ptr);
+ ibuf->rect = NULL;
+ IMB_freeImBuf(ibuf);
// clean up
delete [] (pixels);
- delete [] (row_pointers);
- png_destroy_write_struct(&png_ptr, &info_ptr);
-
- if (fp)
- {
- fflush(fp);
- fclose(fp);
- }
}