#define BUFFERSIZE 1024 #define unchar unsigned char static unchar iDataR[BUFFERSIZE][BUFFERSIZE]; // Red buffer. static unchar iDataG[BUFFERSIZE][BUFFERSIZE]; // Green or BW buffer. static unchar iDataB[BUFFERSIZE][BUFFERSIZE]; // Blue buffer. /********************************************************************/ /* Unix PGM access routines */ /********************************************************************/ /****************************************/ /* PGM filename prompt. */ /****************************************/ void pgmFileName(char FileName[80], char *Prompt) { printf("* Enter a %s filename: ", Prompt); scanf("%s", FileName); printf("\n"); } /****************************************/ /* Clear comments from PGM file. */ /****************************************/ void pgmCommentClear(FILE *disk) { int data; int err; long l; unsigned char ch; fpos_t *pos; pos = &l; fread(&ch, 1, 1, disk); err = fgetpos(disk, pos); fread(&ch, 1, 1, disk); if (ch == '#') { while (ch == '#') { while (ch != '\n') fread(&ch, 1, 1, disk); err = fgetpos(disk, pos); fread(&ch, 1, 1, disk); } err = fsetpos(disk, pos); } else { err = fsetpos(disk, pos); } } /****************************************/ /* PGM file load. */ /****************************************/ void pgmLoad(char FileName[80], int *xSize, int *ySize, int *color) { int x, y; int xmax, ymax; int pmax; int cFlag; unchar *ptrR, *ptrG, *ptrB; char ch; char type[3]; FILE *disk; // Open file for reading. printf("* Loading PGM file: %s \n", FileName); if ((disk = fopen(FileName, "rb")) == NULL) { printf(">> ERROR - Cannot open PGM file.\n"); return; } // Read in file header. fscanf(disk, "%s", &type); pgmCommentClear(disk); fscanf(disk, "%d", &xmax); fscanf(disk, "%d", &ymax); fscanf(disk, "%d", &pmax); fread(&ch, 1, 1, disk); // Check file. if (strcmp(type, "P5") == 0) { cFlag = 0; } else { if (strcmp(type, "P6") == 0) { cFlag = 1; } else { printf(">> ERROR - Incorrect PGM format.\n"); fclose(disk); return; } } if (xmax > BUFFERSIZE) { printf(">> ERROR - Image is too big.\n"); fclose(disk); return; } if (ymax > BUFFERSIZE) { printf(">> ERROR - Image is too big.\n"); fclose(disk); return; } if (pmax > 255) { printf(">> ERROR - Image is too deep.\n"); fclose(disk); return; } // Clear buffers. for (y = 0; y < BUFFERSIZE; y++) { ptrR = iDataR[y]; ptrG = iDataG[y]; ptrB = iDataB[y]; for (x = 0; x < BUFFERSIZE; x++) { *ptrR = 0; *ptrG = 0; *ptrB = 0; ptrR++; ptrG++; ptrB++; } } if (cFlag == 0) { // Load b/w image. for (y = 0; y < ymax; y++) { ptrG = iDataG[y]; for (x = 0; x < xmax; x++) { *ptrG = getc(disk); ptrG++; } } } else { // Load color image. for (y = 0; y < ymax; y++) { ptrR = iDataR[y]; ptrG = iDataG[y]; ptrB = iDataB[y]; for (x = 0; x < xmax; x++) { *ptrR = getc(disk); *ptrG = getc(disk); *ptrB = getc(disk); ptrR++; ptrG++; ptrB++; } } } fclose(disk); // Return image size and color.; *xSize = xmax; *ySize = ymax; *color = cFlag; } /****************************************/ /* PGM file save. */ /****************************************/ void pgmSave(char FileName[80], int xSize, int ySize, int cFlag) { int x, y; unchar *ptrR, *ptrG, *ptrB; FILE *disk; // Open file for writing. printf("* Saving PGM file: %s \n", FileName); disk = fopen(FileName, "wb"); // Write file header. if (cFlag == 0) fprintf(disk, "P5\n"); else fprintf(disk, "P6\n"); fprintf(disk, "%d %d\n", xSize, ySize); fprintf(disk, "255\n"); if (cFlag == 0) { // Write BW data. for (y = 0; y < ySize; y++) { ptrG = iDataG[y]; for (x = 0; x < xSize; x++) { putc(*ptrG, disk); ptrG++; } } } else { // Write color data. for (y = 0; y < ySize; y++) { ptrR = iDataR[y]; ptrG = iDataG[y]; ptrB = iDataB[y]; for (x = 0; x < xSize; x++) { putc(*ptrR, disk); putc(*ptrG, disk); putc(*ptrB, disk); ptrR++; ptrG++; ptrB++; } } } fclose(disk); }