about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--converter/other/jpeg2000/libjasper/base/jas_stream.c2
-rw-r--r--converter/other/jpeg2000/pamtojpeg2k.c12
-rw-r--r--doc/HISTORY21
-rw-r--r--editor/pamfunc.c54
-rw-r--r--editor/pammixmulti.c2
-rw-r--r--other/pamarith.c34
-rw-r--r--version.mk2
7 files changed, 93 insertions, 34 deletions
diff --git a/converter/other/jpeg2000/libjasper/base/jas_stream.c b/converter/other/jpeg2000/libjasper/base/jas_stream.c
index 20336fd7..a4b3a27c 100644
--- a/converter/other/jpeg2000/libjasper/base/jas_stream.c
+++ b/converter/other/jpeg2000/libjasper/base/jas_stream.c
@@ -415,9 +415,11 @@ jas_stream_t *jas_stream_tmpfile()
         if (rc == 0) {
             pm_setjmpbuf(&jmpbuf);
             *obj = pm_tmpfile_fd();
+            pm_setjmpbuf(NULL);
         } else {
             /* pm_tmpfile_fd() threw an error */
             jas_stream_destroy(stream);
+            pm_setjmpbuf(NULL);
             return 0;
         }
     }
diff --git a/converter/other/jpeg2000/pamtojpeg2k.c b/converter/other/jpeg2000/pamtojpeg2k.c
index 4d73316a..a886c390 100644
--- a/converter/other/jpeg2000/pamtojpeg2k.c
+++ b/converter/other/jpeg2000/pamtojpeg2k.c
@@ -196,15 +196,15 @@ parseCommandLine(int argc, char ** argv,
     if (!ilyrratesSpec)
         cmdlineP->ilyrrates = (char*) "";
     if (progressionSpec) {
-        if (strcmp(progressionOpt, "lrcp") == 0)
+        if (streq(progressionOpt, "lrcp"))
             cmdlineP->progression = PROG_LRCP;
-        if (strcmp(progressionOpt, "rlcp") == 0)
+        else if (streq(progressionOpt, "rlcp"))
             cmdlineP->progression = PROG_RLCP;
-        if (strcmp(progressionOpt, "rpcl") == 0)
+        else if (streq(progressionOpt, "rpcl"))
             cmdlineP->progression = PROG_RPCL;
-        if (strcmp(progressionOpt, "pcrl") == 0)
+        else if (streq(progressionOpt, "pcrl"))
             cmdlineP->progression = PROG_PCRL;
-        if (strcmp(progressionOpt, "cprl") == 0)
+        else if (streq(progressionOpt, "cprl"))
             cmdlineP->progression = PROG_CPRL;
         else
             pm_error("Invalid value for -progression: '%s'.  "
@@ -432,7 +432,7 @@ writeJpc(jas_image_t *      const jasperP,
                 cmdline.imgareatlx,
                 cmdline.imgareatly,
                 cmdline.tilegrdtlx,
-                cmdline.tilegrdtlx,
+                cmdline.tilegrdtly,
                 cmdline.tilewidth,
                 cmdline.tileheight,
                 cmdline.prcwidth,
diff --git a/doc/HISTORY b/doc/HISTORY
index 3f9dd812..4c987946 100644
--- a/doc/HISTORY
+++ b/doc/HISTORY
@@ -4,6 +4,27 @@ Netpbm.
 CHANGE HISTORY 
 --------------
 
+20.09.16 BJH  Release 10.91.04
+
+              pamtojpeg2k: Fix failure with most -progression values.  Always
+              broken (pamtojpeg2k was new in Netpbm 10.12 (November 2002)).
+
+              pamtojpeg2k: Fix wrong result with -tilegrdtly.  Always
+              broken (pamtojpeg2k was new in Netpbm 10.12 (November 2002)).
+
+              jpeg2ktopam: Fix crash whenever the program fails.  Broken in
+              Netpbm 10.42 (March 2008).
+
+              pamarith: Fix crash with -compare where inputs are PBM.  Broken
+              in Netpbm 10.14 (February 2003).
+
+              pamfunc: Fix crash with -changemaxval and PBM input.  Always
+              broken.  -changemaxval was new in Netpbm 10.65 (December 2013).
+
+              pammixmulti: Fix bug: -randomseed ignored on some systems.
+              Always broken.  (pammixmulti was new in Netpbm 10.85 (December
+              2018).
+
 20.09.05 BJH  Release 10.91.03
 
               pamfunc: Fix always wrong output with -not.  Always broken.
diff --git a/editor/pamfunc.c b/editor/pamfunc.c
index 6a121883..454e6d63 100644
--- a/editor/pamfunc.c
+++ b/editor/pamfunc.c
@@ -266,11 +266,12 @@ validateFunction(struct CmdlineInfo const cmdline,
 static void
 planTransform(struct CmdlineInfo const cmdline,
               sample             const inputMaxval,
+              int                const outputFormat,
               sample *           const outputMaxvalP,
               bool *             const mustChangeRasterP) {
 /*----------------------------------------------------------------------------
    Plan the transform described by 'cmdline', given the maxval of the input
-   image is 'inputMaxval.
+   image is 'inputMaxval and the output format will be 'outputFormat'.
 
    The plan just consists of whether to change the maxval or the raster.
    Some multiplications and divisions can be achieved just by changing the
@@ -278,30 +279,36 @@ planTransform(struct CmdlineInfo const cmdline,
 -----------------------------------------------------------------------------*/
     if (cmdline.changemaxval) {
         /* User allows us to change the maxval, if that makes it easier */
-        if (cmdline.function == FN_MULTIPLY || cmdline.function == FN_DIVIDE) {
-            float const multiplier =
-                cmdline.function == FN_MULTIPLY ? cmdline.u.multiplier :
-                (1/cmdline.u.divisor);
-
-            float const neededMaxval = inputMaxval / multiplier;
-
-            if (neededMaxval + 0.5 < inputMaxval) {
-                /* Lowering the maxval might make some of the sample values
-                   higher than the maxval, so we'd have to modify the raster
-                   to clip them.
-                */
-                *outputMaxvalP     = inputMaxval;
-                *mustChangeRasterP = true;
-            } else if (neededMaxval > PAM_OVERALL_MAXVAL) {
+        if (PNM_FORMAT_TYPE(outputFormat) == PBM_TYPE) {
+            *outputMaxvalP     = inputMaxval;
+            *mustChangeRasterP = true;
+        } else {
+            if (cmdline.function == FN_MULTIPLY ||
+                cmdline.function == FN_DIVIDE) {
+                float const multiplier =
+                    cmdline.function == FN_MULTIPLY ? cmdline.u.multiplier :
+                    (1/cmdline.u.divisor);
+
+                float const neededMaxval = inputMaxval / multiplier;
+
+                if (neededMaxval + 0.5 < inputMaxval) {
+                    /* Lowering the maxval might make some of the sample
+                       values higher than the maxval, so we'd have to modify
+                       the raster to clip them.
+                    */
+                    *outputMaxvalP     = inputMaxval;
+                    *mustChangeRasterP = true;
+                } else if (neededMaxval > PAM_OVERALL_MAXVAL) {
+                    *outputMaxvalP     = inputMaxval;
+                    *mustChangeRasterP = true;
+                } else {
+                    *outputMaxvalP     = ROUNDU(neededMaxval);
+                    *mustChangeRasterP = false;
+                }
+            } else {
                 *outputMaxvalP     = inputMaxval;
                 *mustChangeRasterP = true;
-            } else {
-                *outputMaxvalP     = ROUNDU(neededMaxval);
-                *mustChangeRasterP = false;
             }
-        } else {
-            *outputMaxvalP     = inputMaxval;
-            *mustChangeRasterP = true;
         }
     } else {
         *outputMaxvalP     = inputMaxval;
@@ -412,7 +419,8 @@ main(int argc, const char *argv[]) {
     outpam = inpam;    /* Initial value -- most fields should be same */
     outpam.file = stdout;
 
-    planTransform(cmdline, inpam.maxval, &outpam.maxval, &mustChangeRaster);
+    planTransform(cmdline, inpam.maxval, outpam.format,
+                  &outpam.maxval, &mustChangeRaster);
 
     pnm_writepaminit(&outpam);
 
diff --git a/editor/pammixmulti.c b/editor/pammixmulti.c
index d063d96c..f5012d7a 100644
--- a/editor/pammixmulti.c
+++ b/editor/pammixmulti.c
@@ -243,7 +243,7 @@ blendTuplesRandom(struct ProgramState * const stateP,
   from a random input image.
 -----------------------------------------------------------------------------*/
     unsigned int const depth = stateP->inPam[0].depth;
-    unsigned int const img = (unsigned int) (random() % stateP->inFileCt);
+    unsigned int const img = (unsigned int) (rand() % stateP->inFileCt);
 
     unsigned int samp;
 
diff --git a/other/pamarith.c b/other/pamarith.c
index 54c18485..3fde1953 100644
--- a/other/pamarith.c
+++ b/other/pamarith.c
@@ -213,6 +213,30 @@ functionCategory(enum function const function) {
 
 
 
+static int
+outFmtForCompare(int const format1,
+                 int const format2) {
+/*----------------------------------------------------------------------------
+   The format for the output image, given that the function is Compare and
+   'format1' and 'format2' are the input image formats.
+
+   Note that Compare is special because its maxval is always 2, and that
+   won't work for PBM.
+-----------------------------------------------------------------------------*/
+    int const tentativeFormat = MAX(format1, format2);
+
+    int retval;
+
+    switch (tentativeFormat) {
+    case PBM_FORMAT:  retval = PGM_FORMAT;      break;
+    case RPBM_FORMAT: retval = RPGM_FORMAT;     break;
+    default:          retval = tentativeFormat; break;
+    }
+    return retval;
+}
+
+
+
 static void
 computeOutputType(struct pam *  const outpamP,
                   struct pam    const inpam1,
@@ -222,13 +246,17 @@ computeOutputType(struct pam *  const outpamP,
     outpamP->size        = sizeof(struct pam);
     outpamP->len         = PAM_STRUCT_SIZE(tuple_type);
     outpamP->file        = stdout;
-    outpamP->format      = MAX(inpam1.format, inpam2.format);
     outpamP->plainformat = FALSE;
     outpamP->height      = inpam1.height;
     outpamP->width       = inpam1.width;
     outpamP->depth       = MAX(inpam1.depth, inpam2.depth);
 
-    switch (functionCategory(function)) {    
+    if (function == FN_COMPARE)
+        outpamP->format = outFmtForCompare(inpam1.format, inpam2.format);
+    else
+        outpamP->format = MAX(inpam1.format, inpam2.format);
+
+    switch (functionCategory(function)) {
     case CATEGORY_FRACTIONAL_ARITH:
         if (function == FN_COMPARE)
             outpamP->maxval = 2;
@@ -835,7 +863,7 @@ main(int argc, const char *argv[]) {
 
     switch (functionCategory(cmdline.function)) {    
     case CATEGORY_FRACTIONAL_ARITH:
-        if (inpam1.maxval == inpam2.maxval)
+        if (inpam1.maxval == inpam2.maxval && inpam2.maxval == outpam.maxval)
             doUnNormalizedArith(&inpam1, &inpam2, &outpam, cmdline.function);
         else
             doNormalizedArith(&inpam1, &inpam2, &outpam, cmdline.function);
diff --git a/version.mk b/version.mk
index d6efbaf4..83e0f9d1 100644
--- a/version.mk
+++ b/version.mk
@@ -1,3 +1,3 @@
 NETPBM_MAJOR_RELEASE = 10
 NETPBM_MINOR_RELEASE = 91
-NETPBM_POINT_RELEASE = 3
+NETPBM_POINT_RELEASE = 4