about summary refs log tree commit diff
path: root/analyzer
diff options
context:
space:
mode:
authorgiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2017-04-15 18:58:10 +0000
committergiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2017-04-15 18:58:10 +0000
commit35bc26009a1c6cdb0e5df93a8d1dad668f5ec203 (patch)
tree0d51f9c895d5fd12761aef5d2f5a9c0147e5193d /analyzer
parentbb38646dbb21febcf096d89b9327b9a1f881fba3 (diff)
downloadnetpbm-mirror-35bc26009a1c6cdb0e5df93a8d1dad668f5ec203.tar.gz
netpbm-mirror-35bc26009a1c6cdb0e5df93a8d1dad668f5ec203.tar.xz
netpbm-mirror-35bc26009a1c6cdb0e5df93a8d1dad668f5ec203.zip
Add Pamtable
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@2951 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'analyzer')
-rw-r--r--analyzer/Makefile21
-rw-r--r--analyzer/pamtable.c197
2 files changed, 215 insertions, 3 deletions
diff --git a/analyzer/Makefile b/analyzer/Makefile
index c96a6d0a..18be9d8c 100644
--- a/analyzer/Makefile
+++ b/analyzer/Makefile
@@ -14,9 +14,24 @@ include $(BUILDDIR)/config.mk
 # This package is so big, it's useful even when some parts won't 
 # build.
 
-PORTBINARIES = pamfile pammosaicknit pamslice pamsumm pamtilt \
-               pbmminkowski pgmhist pnmhistmap ppmhist pgmminkowski
-MATHBINARIES = pamsharpmap pamsharpness pgmtexture pnmpsnr 
+PORTBINARIES = \
+  pamfile \
+  pammosaicknit \
+  pamslice \
+  pamsumm \
+  pamtable \
+  pamtilt \
+  pbmminkowski \
+  pgmhist \
+  pnmhistmap \
+  ppmhist \
+  pgmminkowski \
+
+MATHBINARIES = \
+  pamsharpmap \
+  pamsharpness \
+  pgmtexture \
+  pnmpsnr \
 
 BINARIES = $(PORTBINARIES) $(MATHBINARIES)
 SCRIPT =
diff --git a/analyzer/pamtable.c b/analyzer/pamtable.c
new file mode 100644
index 00000000..9422ff19
--- /dev/null
+++ b/analyzer/pamtable.c
@@ -0,0 +1,197 @@
+/*=============================================================================
+                               pamtable
+===============================================================================
+  Print the raster as a table of numbers.
+
+  By Bryan Henderson, San Jose CA 2017.04.15.
+
+  Contributed to the public domain
+
+=============================================================================*/
+#include <math.h>
+#include "pm_c_util.h"
+#include "pam.h"
+#include "shhopt.h"
+#include "mallocvar.h"
+#include "nstring.h"
+
+struct CmdlineInfo {
+    /* All the information the user supplied in the command line,
+       in a form easy for the program to use.
+    */
+    const char * inputFileName;  /* Name of input file */
+    unsigned int  verbose;
+};
+
+
+static void
+parseCommandLine(int argc, const char ** const argv,
+                 struct CmdlineInfo * const cmdlineP) {
+
+    optEntry * option_def;
+        /* Instructions to OptParseOptions3 on how to parse our options.
+         */
+    optStruct3 opt;
+
+    unsigned int option_def_index;
+
+    MALLOCARRAY(option_def, 100);
+
+    option_def_index = 0;   /* incremented by OPTENT3 */
+
+    OPTENT3(0,   "verbose",   OPT_FLAG,  NULL, &cmdlineP->verbose,   0);
+        /* For future expansion */
+
+    opt.opt_table = option_def;
+    opt.short_allowed = FALSE;  /* We have no short (old-fashioned) options */
+    opt.allowNegNum = FALSE;  /* We have no parms that are negative numbers */
+
+    pm_optParseOptions3(&argc, (char **)argv, opt, sizeof(opt), 0);
+        /* Uses and sets argc, argv, and some of *cmdlineP and others. */
+
+    if (argc-1 > 1)
+        pm_error("Too many arguments (%d).  File name is the only argument.",
+                 argc-1);
+
+    if (argc-1 < 1)
+        cmdlineP->inputFileName = "-";
+    else 
+        cmdlineP->inputFileName = argv[1];
+
+    free(option_def);
+}
+
+
+
+typedef struct {
+
+    const char * sampleFmt;
+       /* Printf format of a sample, e.g. %3u */
+
+    const char * interSampleGutter;
+       /* What we print between samples within a tuple */
+
+    const char * interTupleGutter;
+       /* What we print between tuples within a row */
+
+} Format;
+
+
+
+static const char *
+sampleFormat(const struct pam * const pamP) {
+/*----------------------------------------------------------------------------
+   The printf format string for a single sample in the output table.
+
+   E.g "%03u".
+
+   This format does not include any spacing between samples.
+-----------------------------------------------------------------------------*/
+    unsigned int const decimalWidth = ROUNDU(ceil(log10(pamP->maxval + 1)));
+
+    const char * retval;
+    
+    pm_asprintf(&retval, "%%%uu", decimalWidth);
+
+    return retval;
+}
+
+
+
+static void
+makeFormat(const struct pam * const pamP,
+           Format *           const formatP) {
+
+    formatP->sampleFmt = sampleFormat(pamP);
+
+    formatP->interSampleGutter = " ";
+
+    formatP->interTupleGutter = pamP->depth > 1 ? "|" : " ";
+}
+
+
+
+static void
+unmakeFormat(Format * const formatP) {
+
+    pm_strfree(formatP->sampleFmt);
+}
+
+
+
+static void
+printRow(const struct pam * const pamP,
+         tuple *            const tupleRow,
+         Format             const format,
+         FILE *             const ofP) {
+
+    unsigned int col;
+
+    for (col = 0; col < pamP->width; ++col) {
+        unsigned int plane;
+
+        if (col > 0)
+            fprintf(ofP, format.interTupleGutter);
+
+        for (plane = 0; plane < pamP->depth; ++plane) {
+
+            if (plane > 0)
+                fprintf(ofP, format.interSampleGutter);
+
+            fprintf(ofP, format.sampleFmt, tupleRow[col][plane]);
+        }
+    }
+
+    fprintf(ofP, "\n");
+}
+
+
+
+static void
+printRaster(FILE *             const ifP,
+            const struct pam * const pamP,
+            FILE *             const ofP) {
+
+    Format format;
+
+    tuple * inputRow;   /* Row from input image */
+    unsigned int row;
+
+    makeFormat(pamP, &format);
+
+    inputRow = pnm_allocpamrow(pamP);
+
+    for (row = 0; row < pamP->height; ++row) {
+        pnm_readpamrow(pamP, inputRow);
+
+        printRow(pamP, inputRow, format, ofP);
+    }
+
+    pnm_freepamrow(inputRow);
+
+    unmakeFormat(&format);
+}
+
+
+
+int
+main(int argc, const char *argv[]) {
+
+    FILE * ifP;
+    struct CmdlineInfo cmdline;
+    struct pam inpam;   /* Input PAM image */
+
+    pm_proginit(&argc, argv);
+
+    parseCommandLine(argc, argv, &cmdline);
+
+    ifP = pm_openr(cmdline.inputFileName);
+
+    pnm_readpaminit(ifP, &inpam, PAM_STRUCT_SIZE(tuple_type));
+
+    printRaster(ifP, &inpam, stdout);
+
+    pm_close(inpam.file);
+    
+    return 0;
+}