Fix makeScreenshot for blenderplayer

This commit is contained in:
Kester Maddock 2004-10-24 10:42:31 +00:00
parent 070d01dd68
commit 6424bf6eb0
2 changed files with 120 additions and 4 deletions

@ -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);