Fix makeScreenshot for blenderplayer
This commit is contained in:
parent
070d01dd68
commit
6424bf6eb0
@ -38,6 +38,8 @@
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include "png.h"
|
||||
|
||||
#include "RAS_IPolygonMaterial.h"
|
||||
#include "GPC_Canvas.h"
|
||||
|
||||
@ -372,3 +374,120 @@ SetOrthoProjection(
|
||||
::glMatrixMode(GL_TEXTURE);
|
||||
::glLoadIdentity();
|
||||
}
|
||||
|
||||
void
|
||||
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
|
||||
|
||||
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);
|
||||
|
||||
/*
|
||||
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);
|
||||
*/
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -170,10 +170,7 @@ public:
|
||||
// not yet
|
||||
}
|
||||
|
||||
void MakeScreenShot(const char* filename)
|
||||
{
|
||||
// not yet
|
||||
}
|
||||
virtual void MakeScreenShot(const char* filename);
|
||||
|
||||
void ClearBuffer(int type);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user