about summary refs log tree commit diff
path: root/editor
diff options
context:
space:
mode:
authorgiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2023-12-28 19:47:49 +0000
committergiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2023-12-28 19:47:49 +0000
commit2468696c1739c475cb95a49813599a567f65219f (patch)
tree207b8cce487f7ead45c731d6fd64f26994f389e9 /editor
parent1a04fa9529619b1bd59424fda68a76c8a4a59332 (diff)
downloadnetpbm-mirror-2468696c1739c475cb95a49813599a567f65219f.tar.gz
netpbm-mirror-2468696c1739c475cb95a49813599a567f65219f.tar.xz
netpbm-mirror-2468696c1739c475cb95a49813599a567f65219f.zip
Release 10.86.40
git-svn-id: http://svn.code.sf.net/p/netpbm/code/super_stable@4823 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'editor')
-rw-r--r--editor/pnmconvol.c62
-rw-r--r--editor/pnmpad.c8
2 files changed, 67 insertions, 3 deletions
diff --git a/editor/pnmconvol.c b/editor/pnmconvol.c
index b1d8e025..ffcdc15d 100644
--- a/editor/pnmconvol.c
+++ b/editor/pnmconvol.c
@@ -617,6 +617,64 @@ normalizeKernel(struct ConvKernel * const convKernelP) {
 
 
 static void
+readPseudoPnmKernel(FILE *       const fileP,
+                    struct pam * const pamP,
+                    tuple ***    const tuplesP) {
+/*----------------------------------------------------------------------------
+   Read in the pseudo-PNM that is the convolution matrix.
+
+   This is essentially pnm_readpam(), except that it can take sample values
+   that exceed the maxval, which is not legal in PNM.  That's why it's
+   psuedo-PNM and not true PNM.
+-----------------------------------------------------------------------------*/
+
+    /* pm_getuint() is supposed to be internal to libnetpbm, but since we're
+       doing this backward compatibility hack here, we use it anyway.
+    */
+
+    unsigned int
+    pm_getuint(FILE * const file);
+
+    tuple ** tuples;
+    unsigned int row;
+
+    pnm_readpaminit(fileP, pamP, PAM_STRUCT_SIZE(tuple_type));
+
+    tuples = pnm_allocpamarray(pamP);
+
+    for (row = 0; row < pamP->height; ++row) {
+        if (pamP->format == PGM_FORMAT || pamP->format == PPM_FORMAT) {
+            /* Plain format -- can't use pnm_readpnmrow() because it will
+               reject a sample > maxval
+            */
+            unsigned int col;
+            for (col = 0; col < pamP->width; ++col) {
+                switch (pamP->format) {
+                case PGM_FORMAT:
+                    tuples[row][col][0] = pm_getuint(fileP);
+                    break;
+                case PPM_FORMAT:
+                    tuples[row][col][PAM_RED_PLANE] = pm_getuint(fileP);
+                    tuples[row][col][PAM_GRN_PLANE] = pm_getuint(fileP);
+                    tuples[row][col][PAM_BLU_PLANE] = pm_getuint(fileP);
+                    break;
+                default:
+                    assert(false);
+                }
+            }
+        } else {
+            /* Raw or PBM format -- pnm_readpnmrow() won't do any maxval
+               checking
+            */
+            pnm_readpamrow(pamP, tuples[row]);
+        }
+    }
+    *tuplesP = tuples;
+}
+
+
+
+static void
 getKernelPnm(const char *         const fileName,
              unsigned int         const depth,
              bool                 const offset,
@@ -639,12 +697,14 @@ getKernelPnm(const char *         const fileName,
     cifP = pm_openr(fileName);
 
     /* Read in the convolution matrix. */
-    ctuples = pnm_readpam(cifP, &cpam, PAM_STRUCT_SIZE(tuple_type));
+    readPseudoPnmKernel(cifP, &cpam, &ctuples);
     pm_close(cifP);
 
     validateKernelDimensions(cpam.width, cpam.height);
 
     convKernelCreatePnm(&cpam, ctuples, depth, offset, convKernelPP);
+
+    pnm_freepamarray(ctuples, &cpam);
 }
 
 
diff --git a/editor/pnmpad.c b/editor/pnmpad.c
index 7cc53b69..d7c31142 100644
--- a/editor/pnmpad.c
+++ b/editor/pnmpad.c
@@ -186,6 +186,10 @@ parseCommandLineOld(int argc, const char ** argv,
     cmdlineP->left = cmdlineP->right = cmdlineP->top = cmdlineP->bottom = 0;
     cmdlineP->xalign = cmdlineP->yalign = 0.5;
     cmdlineP->white = cmdlineP->verbose = FALSE;
+    cmdlineP->reportonly = FALSE;
+    cmdlineP->topSpec = cmdlineP->bottomSpec =
+        cmdlineP->leftSpec = cmdlineP->rightSpec = TRUE;
+    cmdlineP->mwidth = cmdlineP->mheight = 1;
 
     while (argc >= 2 && argv[1][0] == '-') {
         if (strcmp(argv[1]+1,"black") == 0) cmdlineP->white = FALSE;
@@ -297,8 +301,8 @@ computePadSizeBeforeMult(unsigned int   const unpaddedSize,
 -----------------------------------------------------------------------------*/
     if (sizeSpec) {
         if (begPadSpec && endPadSpec) {
-            if (begPadReq + unpaddedSize + endPadReq < unpaddedSize) {
-                pm_error("Beginning adding (%u), and end "
+            if (begPadReq + unpaddedSize + endPadReq < sizeReq) {
+                pm_error("Beginning padding (%u), and end "
                          "padding (%u) are insufficient to bring the "
                          "image size of %u up to %u.",
                          begPadReq, endPadReq, unpaddedSize, sizeReq);