diff options
-rw-r--r-- | converter/other/Makefile | 4 | ||||
-rw-r--r-- | converter/other/avstopam.c | 110 | ||||
-rw-r--r-- | converter/other/pamtoavs.c | 152 | ||||
-rw-r--r-- | doc/HISTORY | 5 |
4 files changed, 268 insertions, 3 deletions
diff --git a/converter/other/Makefile b/converter/other/Makefile index 83676aaa..1417cd3a 100644 --- a/converter/other/Makefile +++ b/converter/other/Makefile @@ -77,9 +77,9 @@ ifeq ($(TIFFLIB_NEEDS_Z),Y) endif endif -PORTBINARIES = bmptopnm fitstopnm \ +PORTBINARIES = avstopam bmptopnm fitstopnm \ gemtopnm giftopnm hdifftopam infotopam \ - pamtodjvurle pamtofits pamtogif \ + pamtoavs pamtodjvurle pamtofits pamtogif \ pamtohdiff pamtohtmltbl pamtompfont pamtooctaveimg \ pamtopam pamtopfm pamtopnm pamtouil \ pamtoxvmini \ diff --git a/converter/other/avstopam.c b/converter/other/avstopam.c new file mode 100644 index 00000000..a35fdcea --- /dev/null +++ b/converter/other/avstopam.c @@ -0,0 +1,110 @@ +/* ---------------------------------------------------------------------- + * + * Convert an AVS X image to a PAM image + * + * By Scott Pakin <scott+pbm@pakin.org> + * + * ---------------------------------------------------------------------- + * + * Copyright (C) 2010 Scott Pakin <scott+pbm@pakin.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + * + * ---------------------------------------------------------------------- + */ + +#include <stdio.h> + +#include "pm.h" +#include "pam.h" + + + +static void +producePam(FILE * const avsFileP, + struct pam * const pamP) { + + tuple * tuplerow; + unsigned int row; + + tuplerow = pnm_allocpamrow(pamP); + for (row = 0; row < pamP->height; ++row) { + unsigned int col; + for (col = 0; col < pamP->width; ++col) { + tuple const thisTuple = tuplerow[col]; + char c; + pm_readchar(avsFileP, &c); thisTuple[3] = c; + pm_readchar(avsFileP, &c); thisTuple[0] = c; + pm_readchar(avsFileP, &c); thisTuple[1] = c; + pm_readchar(avsFileP, &c); thisTuple[2] = c; + } + pnm_writepamrow(pamP, tuplerow); + } + pnm_freepamrow(tuplerow); +} + + + +int +main(int argc, const char *argv[]) { + + const char * comment = "Produced by avstopam"; /* constant */ + + struct pam outPam; + const char * inputFilename; + const char * outputFilename; + FILE * inFileP; + FILE * outFileP; + long width; + long height; + + pm_proginit(&argc, argv); + + inputFilename = (argc > 1) ? argv[1] : "-"; + outputFilename = (argc > 2) ? argv[2] : "-"; + + inFileP = pm_openr(inputFilename); + + pm_readbiglong(inFileP, &width); + pm_readbiglong(inFileP, &height); + + outFileP = pm_openw(outputFilename); + + outPam.size = sizeof(struct pam); + outPam.len = PAM_STRUCT_SIZE(comment_p); + outPam.file = outFileP; + outPam.format = PAM_FORMAT; + outPam.plainformat = 0; + outPam.width = width; + outPam.height = height; + outPam.depth = 4; + outPam.maxval = 255; + outPam.bytes_per_sample = 1; + sprintf(outPam.tuple_type, "RGB_ALPHA"); + outPam.allocation_depth = 4; + outPam.comment_p = &comment; + + /* Produce a PAM output header. Note that AVS files *always* + contain four channels with one byte per channel. + */ + pnm_writepaminit(&outPam); + + producePam(inFileP, &outPam); + + pm_closew(outFileP); + pm_closer(inFileP); + + return 0; +} + diff --git a/converter/other/pamtoavs.c b/converter/other/pamtoavs.c new file mode 100644 index 00000000..740042e6 --- /dev/null +++ b/converter/other/pamtoavs.c @@ -0,0 +1,152 @@ +/* ---------------------------------------------------------------------- + * + * Convert a PAM image to an AVS X image + * + * By Scott Pakin <scott+pbm@pakin.org> + * + * ---------------------------------------------------------------------- + * + * Copyright (C) 2010 Scott Pakin <scott+pbm@pakin.org> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + * + * ---------------------------------------------------------------------- + */ + +#include <stdio.h> +#include "pm.h" +#include "pam.h" + + + +static char +sample2char(sample const s, + sample const maxval) { +/* Scale down a sample to a single byte. */ + + return maxval==255 ? s : s * 255 / maxval; +} + + +#define THIS_SAMPLE_CHAR(PLANE) \ + sample2char(tuplerow[col][PLANE], pamP->maxval) + +static void +produceAvs(struct pam * const pamP, + FILE * const avsFileP) { + + tuple * tuplerow; + + /* Write the AVS header (image width and height as 4-byte + big-endian integers). + */ + pm_writebiglong(avsFileP, pamP->width); + pm_writebiglong(avsFileP, pamP->height); + + /* Write the AVS data (alpha, red, green, blue -- one byte apiece. */ + tuplerow = pnm_allocpamrow(pamP); + switch (pamP->depth) { + case 1: { + /* Black-and-white or grayscale, no alpha */ + unsigned int row; + for (row = 0; row < pamP->height; ++row) { + unsigned int col; + pnm_readpamrow(pamP, tuplerow); + for (col = 0; col < pamP->width; ++col) { + pm_writechar(avsFileP, (char)255); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(0)); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(0)); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(0)); + } + } + } break; + + case 2: { + /* Black-and-white or grayscale plus alpha */ + unsigned int row; + for (row = 0; row < pamP->height; ++row) { + unsigned int col; + pnm_readpamrow(pamP, tuplerow); + for (col = 0; col < pamP->width; ++col) { + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(1)); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(0)); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(0)); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(0)); + } + } + } break; + + case 3: { + /* RGB, no alpha */ + unsigned int row; + for (row = 0; row < pamP->height; ++row) { + unsigned int col; + pnm_readpamrow(pamP, tuplerow); + for (col = 0; col < pamP->width; ++col) { + pm_writechar(avsFileP, (char)255); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(0)); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(1)); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(2)); + } + } + } break; + + case 4: { + /* RGB plus alpha */ + unsigned int row; + for (row = 0; row < pamP->height; ++row) { + unsigned int col; + pnm_readpamrow( pamP, tuplerow ); + for (col = 0; col < pamP->width; ++col) { + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(3)); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(0)); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(1)); + pm_writechar(avsFileP, THIS_SAMPLE_CHAR(2)); + } + } + } break; + + default: + pm_error("Unrecognized PAM depth %u. We understand only " + "1, 2, 3, and 4", pamP->depth); + break; + } + pnm_freepamrow(tuplerow); +} + + + +int +main(int argc, const char *argv[]) { + struct pam inPam; + const char * inputFilename; + const char * outputFilename; + FILE * inFileP; + FILE * outFileP; + + pm_proginit(&argc, argv); + inputFilename = (argc > 1) ? argv[1] : "-"; + outputFilename = (argc > 2) ? argv[2] : "-"; + inFileP = pm_openr(inputFilename); + pnm_readpaminit(inFileP, &inPam, PAM_STRUCT_SIZE(tuple_type)); + outFileP = pm_openw(outputFilename); + + produceAvs(&inPam, outFileP); + + pm_closew(outFileP); + pm_closer(inFileP); + + return 0; +} + diff --git a/doc/HISTORY b/doc/HISTORY index f2858ca5..6fd8ed31 100644 --- a/doc/HISTORY +++ b/doc/HISTORY @@ -6,6 +6,8 @@ CHANGE HISTORY not yet BJH Release 10.50.00 + Add pamtoavs, avstopam. Thanks Scott Pakin. + Add pampaintspill. pnmconvol: Add -normalize . @@ -16,7 +18,8 @@ not yet BJH Release 10.50.00 libnetpbm: Add ppm_luminosity(). Same as PPM_LUMIN, but returns pixval. - pnmhisteq: slight speedup. Thanks Thomas Baruchel. + pnmhisteq: Equalize based on luminosity alone, rather than a + strange combination of luminosity and HSV value. libppmd/ppmpat: fix wild pointer in ppmd_fill_drawprocp(); broken in 10.47. |