/* * PPM file output * Brian Paul * 8 Dec 2008 */ #include #include #include #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 */ }