void snapshot(int windowWidth, int windowHeight, char * filename){
char * bmpBuffer = (char *)malloc(windowWidth * windowHeight * 3);
if (!bmpBuffer) return;
glReadPixels((GLint)0, (GLint)0, (GLint)windowWidth - 1, (GLint)windowHeight - 1, GL_RGB, GL_UNSIGNED_BYTE, bmpBuffer);
FILE *filePtr = fopen(filename, "wb");
if (!filePtr) return;
BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER bitmapInfoHeader;
bitmapFileHeader.bfType = 0x424D; //"MB" - remember bitmap data is bottom to top, right to left
bitmapFileHeader.bfSize = windowWidth * windowHeight * 3;
bitmapFileHeader.bfReserved1 = 0; //reserved, always zero
bitmapFileHeader.bfReserved2 = 0; //reserved, always zero
bitmapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfoHeader.biWidth = windowWidth - 1;
bitmapInfoHeader.biHeight = windowHeight - 1;
bitmapInfoHeader.biPlanes = 1;
bitmapInfoHeader.biBitCount = 24; //24 bit
bitmapInfoHeader.biCompression = BI_RGB; //0
bitmapInfoHeader.biSizeImage = 0; //can be ignored
bitmapInfoHeader.biXPelsPerMeter = 0; //Always zero
bitmapInfoHeader.biYPelsPerMeter = 0; //Always zero
bitmapInfoHeader.biClrUsed = 0; //24 bit, don't need these
bitmapInfoHeader.biClrImportant = 0; //24 bit doesn't have important colours
fwrite(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);
fwrite(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);
fwrite(bmpBuffer, windowWidth * windowHeight * 3, 1, filePtr);
fclose(filePtr);
free(bmpBuffer);
}
Bookmarks