diff options
Diffstat (limited to 'other/pamendian.c')
-rw-r--r-- | other/pamendian.c | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/other/pamendian.c b/other/pamendian.c index c24d9629..8826b06f 100644 --- a/other/pamendian.c +++ b/other/pamendian.c @@ -1,20 +1,21 @@ -/****************************************************************************** +/*============================================================================= pamendian -******************************************************************************* +=============================================================================== Reverse the endianness of multi-byte samples in a Netpbm stream. I.e. convert between the true format and the little endian variation of it. -******************************************************************************/ - +=============================================================================*/ + #include "pam.h" static sample -reverseSample(sample const insample, unsigned int const bytesPerSample) { +reverseSample(sample const insample, + unsigned int const bytesPerSample) { /*---------------------------------------------------------------------------- Return a sample whose value is the least significant - 'bytes_per_sample' bytes, in reverse order. + 'bytesPerSample' bytes, in reverse order. -----------------------------------------------------------------------------*/ unsigned int bytePos; sample shiftedInsample; @@ -30,14 +31,14 @@ reverseSample(sample const insample, unsigned int const bytesPerSample) { -int main(int argc, char *argv[]) { +int main(int argc, const char ** argv) { struct pam inpam, outpam; tuple * intuplerow; tuple * outtuplerow; unsigned int row; - pnm_init(&argc, argv); + pm_proginit(&argc, argv); pnm_readpaminit(stdin, &inpam, PAM_STRUCT_SIZE(tuple_type)); @@ -46,27 +47,39 @@ int main(int argc, char *argv[]) { pnm_writepaminit(&outpam); - intuplerow = pnm_allocpamrow(&inpam); - outtuplerow = pnm_allocpamrow(&outpam); - + /* We read the samples as if the maxval is 65535 so pnm_readpamrow, which + assumes big-endian samples, doesn't choke on a little-endian sample, + finding it to exceed the maxval. (The pure way to do this would be not + to use libnetpbm row reading and writing facilities on little-endian + pseudo-Netpbm images, but this program isn't important enough to + justify that effort). + */ inpam.maxval = 65535; - for (row = 0; row < inpam.height; row++) { + intuplerow = pnm_allocpamrow(&inpam); + outtuplerow = pnm_allocpamrow(&outpam); + + for (row = 0; row < inpam.height; ++row) { unsigned int col; + pnm_readpamrow(&inpam, intuplerow); - for (col = 0; col < inpam.width; col++) { + for (col = 0; col < inpam.width; ++col) { unsigned int plane; - for (plane = 0; plane < inpam.depth; plane++) - outtuplerow[col][plane] = - reverseSample(intuplerow[col][plane], + + for (plane = 0; plane < inpam.depth; ++plane) { + outtuplerow[col][plane] = + reverseSample(intuplerow[col][plane], inpam.bytes_per_sample); + } } pnm_writepamrow(&outpam, outtuplerow); } - pnm_freepamrow(outtuplerow); - pnm_freepamrow(intuplerow); + pnm_freepamrow(outtuplerow); + pnm_freepamrow(intuplerow); - exit(0); + return 0; } + + |