12219210af
Set GLUT_PPM_FILE to the desired filename. The first frame rendered will be written to that file.
81 lines
2.0 KiB
C
81 lines
2.0 KiB
C
/*
|
|
* PPM file output
|
|
* Brian Paul
|
|
* 8 Dec 2008
|
|
*/
|
|
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "glutint.h"
|
|
|
|
|
|
static void
|
|
write_ppm_file(const char *filename, const GLubyte *buffer,
|
|
int width, int height)
|
|
{
|
|
const int binary = 1;
|
|
FILE *f = fopen( filename, "w" );
|
|
if (f) {
|
|
const GLubyte *ptr = buffer;
|
|
int i, x, y;
|
|
if (binary) {
|
|
fprintf(f,"P6\n");
|
|
fprintf(f,"# ppm-file created by GLUT\n");
|
|
fprintf(f,"%i %i\n", width, height);
|
|
fprintf(f,"255\n");
|
|
fclose(f);
|
|
f = fopen( filename, "ab" ); /* reopen in binary append mode */
|
|
for (y = height - 1; y >= 0; y--) {
|
|
for (x = 0; x < width; x++) {
|
|
i = (y * width + x) * 4;
|
|
fputc(ptr[i], f); /* write red */
|
|
fputc(ptr[i+1], f); /* write green */
|
|
fputc(ptr[i+2], f); /* write blue */
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
/*ASCII*/
|
|
int counter = 0;
|
|
fprintf(f,"P3\n");
|
|
fprintf(f,"# ascii ppm file created by GLUT\n");
|
|
fprintf(f,"%i %i\n", width, height);
|
|
fprintf(f,"255\n");
|
|
for (y = height - 1; y >= 0; y--) {
|
|
for (x = 0; x < width; x++) {
|
|
i = (y * width + x) * 4;
|
|
fprintf(f, " %3d %3d %3d", ptr[i], ptr[i+1], ptr[i+2]);
|
|
counter++;
|
|
if (counter % 5 == 0)
|
|
fprintf(f, "\n");
|
|
}
|
|
}
|
|
}
|
|
fclose(f);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Called from SwapBuffers if the GLUT_PPM_FILE env var is set.
|
|
*/
|
|
void __glutWritePPMFile(void)
|
|
{
|
|
int w = glutGet(GLUT_WINDOW_WIDTH);
|
|
int h = glutGet(GLUT_WINDOW_HEIGHT);
|
|
GLubyte *buf;
|
|
|
|
assert(__glutPPMFile);
|
|
|
|
buf = (GLubyte *) malloc(w * h * 4);
|
|
if (buf) {
|
|
/* XXX save/restore pixel packing */
|
|
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buf);
|
|
write_ppm_file(__glutPPMFile, buf, w, h);
|
|
free(buf);
|
|
}
|
|
|
|
__glutPPMFile = NULL; /* only write one file */
|
|
}
|