/******** * * ppm_gl_io.c * * Description: * Routines for loading and saving images between GLCanvases and * raw PPM format image files. * * Author: Chase Garfinkle * Date of Version: January 16, 1994 * *********/ #include #include #include "ppm_gl_io.h" int ppmLoadCanvas(char *filename, struct GLCanvas *canvas) { FILE *fp; int width, height, size, i; unsigned int *buf; char data[1]; if ((fp = fopen(filename, "r")) == NULL) { fprintf(stderr, "%s: error opening file.\n", filename); return 0; } fscanf(fp, "P6\n"); fscanf(fp, "#%*[^\n]\n"); /* fscanf(fp, "#%*[^\n]\n");*/ fscanf(fp, "%d", &width); fscanf(fp, "%d", &height); fscanf(fp, "%*d\n"); size = width * height; canvas->width = width; canvas->height = height; canvas->pixels = (unsigned int *) malloc(size * sizeof(int)); buf = canvas->pixels; for (i = 0; i < size; i++, buf++) { fread(data, 1, 1, fp); *buf = *data; fread(data, 1, 1, fp); *buf |= (*data << 8); fread(data, 1, 1, fp); *buf |= (*data << 16); } return 1; } int ppmSaveCanvas(char *filename, struct GLCanvas *canvas) { FILE *fp; int width, height, size, i; unsigned int *buf; char data[1]; if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "%s: error opening file.\n", filename); return 0; } width = canvas->width; height = canvas->height; size = width*height; fprintf(fp, "P6\n"); fprintf(fp, "# Comment Line\n"); fprintf(fp, "%d %d\n", width, height); fprintf(fp, "255\n"); buf = canvas->pixels; for (i = 0; i < size; i++, buf++) { data[0] = (*buf) & 0xff; fwrite(data, 1, 1, fp); data[0] = ((*buf) >> 8) & 0xff; fwrite(data, 1, 1, fp); data[0] = ((*buf) >> 16) & 0xff; fwrite(data, 1, 1, fp); } fclose(fp); return 1; }