diff options
Diffstat (limited to 'lib/libpnm2.c')
-rw-r--r-- | lib/libpnm2.c | 107 |
1 files changed, 75 insertions, 32 deletions
diff --git a/lib/libpnm2.c b/lib/libpnm2.c index aae78d52..01ffa389 100644 --- a/lib/libpnm2.c +++ b/lib/libpnm2.c @@ -15,13 +15,10 @@ #include "pnm.h" #include "ppm.h" -#include "libppm.h" #include "pgm.h" -#include "libpgm.h" #include "pbm.h" -#include "libpbm.h" void pnm_writepnminit(FILE * const fileP, @@ -55,51 +52,97 @@ pnm_writepnminit(FILE * const fileP, -void -pnm_writepnmrow(FILE * const fileP, - xel * const xelrow, - int const cols, - xelval const maxval, - int const format, - int const forceplain) { - - bool const plainFormat = forceplain || pm_plain_output; +static void +writepgmrow(FILE * const fileP, + const xel * const xelrow, + unsigned int const cols, + xelval const maxval, + int const format, + bool const plainFormat) { - switch (PNM_FORMAT_TYPE(format)) { - case PPM_TYPE: - ppm_writeppmrow(fileP, (pixel*) xelrow, cols, (pixval) maxval, - plainFormat); - break; - - case PGM_TYPE: { - gray* grayrow; + jmp_buf jmpbuf; + jmp_buf * origJmpbufP; + gray * grayrow; + + grayrow = pgm_allocrow(cols); + + if (setjmp(jmpbuf) != 0) { + pgm_freerow(grayrow); + pm_setjmpbuf(origJmpbufP); + pm_longjmp(); + } else { unsigned int col; - grayrow = pgm_allocrow(cols); - + pm_setjmpbufsave(&jmpbuf, &origJmpbufP); + for (col = 0; col < cols; ++col) grayrow[col] = PNM_GET1(xelrow[col]); - + pgm_writepgmrow(fileP, grayrow, cols, (gray) maxval, plainFormat); - pgm_freerow( grayrow ); + pm_setjmpbuf(origJmpbufP); } - break; + pgm_freerow(grayrow); +} + + - case PBM_TYPE: { - bit* bitrow; +static void +writepbmrow(FILE * const fileP, + const xel * const xelrow, + unsigned int const cols, + bool const plainFormat) { + + jmp_buf jmpbuf; + jmp_buf * origJmpbufP; + bit * bitrow; + + bitrow = pbm_allocrow(cols); + + if (setjmp(jmpbuf) != 0) { + pbm_freerow(bitrow); + pm_setjmpbuf(origJmpbufP); + pm_longjmp(); + } else { unsigned int col; - bitrow = pbm_allocrow(cols); + pm_setjmpbufsave(&jmpbuf, &origJmpbufP); for (col = 0; col < cols; ++col) bitrow[col] = PNM_GET1(xelrow[col]) == 0 ? PBM_BLACK : PBM_WHITE; - + pbm_writepbmrow(fileP, bitrow, cols, plainFormat); - pbm_freerow(bitrow); - } - break; + pm_setjmpbuf(origJmpbufP); + } + pbm_freerow(bitrow); +} + + + +void +pnm_writepnmrow(FILE * const fileP, + const xel * const xelrow, + int const cols, + xelval const maxval, + int const format, + int const forceplain) { + + bool const plainFormat = forceplain || pm_plain_output; + + switch (PNM_FORMAT_TYPE(format)) { + case PPM_TYPE: + ppm_writeppmrow(fileP, (pixel*) xelrow, cols, (pixval) maxval, + plainFormat); + break; + + case PGM_TYPE: + writepgmrow(fileP, xelrow, cols, maxval, format, plainFormat); + break; + + case PBM_TYPE: + writepbmrow(fileP, xelrow, cols, plainFormat); + break; default: pm_error("invalid format argument received by pnm_writepnmrow(): %d" |