From 2ac4933a6a67e5760e52d86c52bbaabb95b26553 Mon Sep 17 00:00:00 2001
From: Fedora Release Engineering The frame options are additive. All the parts of the image
@@ -89,31 +105,20 @@ diff -urNp old/userguide/pamperspective.html new/userguide/pamperspective.html
--include (or their defaults) are in the visible part. The
visible part is the smallest possible rectangle that contains the
parts specified those three ways.
-diff -urNp old/converter/pbm/pbmtoepson.c new/converter/pbm/pbmtoepson.c
---- old/converter/pbm/pbmtoepson.c 2018-01-04 14:26:14.740024843 +0100
-+++ new/converter/pbm/pbmtoepson.c 2018-01-04 14:28:47.970518766 +0100
-@@ -75,7 +75,7 @@ parseCommandLine(int ar
- &dpiSpec, 0);
- OPTENT3(0, "adjacent", OPT_FLAG, NULL,
- &adjacentSpec, 0);
-- OPTENT3(0, "nonadjacent", OPT_FLAG, NULL,
-+ OPTENT3(0, "noadjacent", OPT_FLAG, NULL,
- &nonadjacentSpec, 0);
-
- opt.opt_table = option_def;
-diff -urNp old/userguide/pbmtoepson.html new/userguide/pbmtoepson.html
---- old/userguide/pbmtoepson.html 2018-01-04 14:26:14.586024719 +0100
-+++ new/userguide/pbmtoepson.html 2018-01-04 14:27:56.466847698 +0100
-@@ -18,7 +18,7 @@ pbmtoepson - convert a PBM image into Ep
+diff --git a/userguide/pbmtoepson.html b/userguide/pbmtoepson.html
+index baacf7b..e74a7fe 100644
+--- a/userguide/pbmtoepson.html
++++ b/userguide/pbmtoepson.html
+@@ -16,7 +16,7 @@ pbmtoepson - convert a PBM image into Epson printer graphics
[-dpi=n]
- [-protocol={escp9|escp}]
+ [-protocol={escp9|escp}]
[-adjacent]
-[-nonadjacent]
+[-noadjacent]
- [pbmfile]
+ [pbmfile]
-@@ -74,7 +74,7 @@ print density for you consistent with yo
+@@ -75,7 +75,7 @@ print density for you consistent with your other options.
This option was new in Netpbm 10.23 (July 2004).
Updated: 7 February 2010 avstopam - convert an AVS X image to a Netpbm image
++ avstopam - convert an AVS X image to a Netpbm image avstopam
+ [avsfile]
+
+ This program is part of Netpbm.
++ This program is part of Netpbm. avstopam reads a Stardent AVS X image as input and produces a Netpbm
+-image as output.
++image as output. avsfile is the input file, which defaults to Standard Input.
+ Output is always on Standard Output.
+@@ -30,26 +34,26 @@ Output is always on Standard Output.
+ There are no command line options defined specifically
+ for avstopam, but it recognizes the options common to all
+ programs based on libnetpbm (See
+-Common Options.)
++Common Options.) Copyright © 2010 Scott Pakin,
+-scott+pbm@pakin.org.
++scott+pbm@pakin.org. This page, part of the Netpbm user's guide,
@@ -38,147 +102,1364 @@ diff -urNp old/userguide/faxformat.html new/userguide/faxformat.html
The ITU (formerly CCITT) publishes standards for operation of fax machines
(the idea is to provide a way to be sure that a fax machine is able to receive
a fax sent by another). These standards incidentally specify graphics file
-diff -urNp old/userguide/pampaintspill.html new/userguide/pampaintspill.html
---- old/userguide/pampaintspill.html 2017-09-05 13:58:08.338559550 +0200
-+++ new/userguide/pampaintspill.html 2017-09-05 14:03:32.625351620 +0200
-@@ -1,8 +1,7 @@
-
--
-+
- Updated: 09 February 2020
+ pampaintspill - smoothly spill colors into the background pampaintspill - smoothly spill colors into the background
- Table Of Contents
+ avstopam
+-Updated: 07 February 2010
+-
++
++NAME
+
+-SYNOPSIS
++SYNOPSIS
+
+ DESCRIPTION
+
+-AUTHOR
+
+ SEE ALSO
+
+-
+
+
+
+ Table Of Contents
+
+-
+
+
+diff --git a/userguide/escp2topbm.html b/userguide/escp2topbm.html
+index 9e808b7..33b19a0 100644
+--- a/userguide/escp2topbm.html
++++ b/userguide/escp2topbm.html
+@@ -8,6 +8,7 @@ Updated: 14 July 2015
+
+ NAME
+NAME
escp2topbm - convert an ESC/P2 printer file to a PBM image
- SYNOPSIS
-diff -urNp old/userguide/faxformat.html new/userguide/faxformat.html
---- old/userguide/faxformat.html 2017-09-05 13:58:08.337559553 +0200
-+++ new/userguide/faxformat.html 2017-09-05 14:02:33.322571279 +0200
+ SYNOPSIS
+diff --git a/userguide/faxformat.html b/userguide/faxformat.html
+index 44b1ba5..827ffc8 100644
+--- a/userguide/faxformat.html
++++ b/userguide/faxformat.html
@@ -5,10 +5,11 @@
Updated: 03 December 2008
-
+
+SYNOPSIS
pampaintspill
+-Updated: 09 February 2020
++
+-Table Of Contents
++Table Of ContentsNAME
+-pampaintspill - smoothly spill colors into the background
++NAME
- SYNOPSIS
- SYNOPSIS
-diff -urNp old/userguide/pamrecolor.html new/userguide/pamrecolor.html
---- old/userguide/pamrecolor.html 2017-09-05 13:58:08.336559557 +0200
-+++ new/userguide/pamrecolor.html 2017-09-05 14:04:34.714122098 +0200
-@@ -1,8 +1,7 @@
--
-+
-
-
-
Minimum unique abbreviations of option are acceptable. You may use + double hyphens instead of single hyphen to denote options. You may use + white space in place of the equals sign to separate an option name +-from its value. ++from its value.
+ +This program is part of Netpbm. ++
This program is part of Netpbm.
+ +pampaintspill produces a smooth color gradient from all of the + non-background-colored pixels in an input image, effectively "spilling + paint" onto the background. pampaintspill is similar to +-pamgradient but differs in the following characteristics: ++pamgradient but differs in the following characteristics:
+ +Results are generally best when the input image contains just a few, crisp + spots of color. Use your drawing program's pencil tool — as opposed to a +-paintbrush or airbrush tool — with a small nib. ++paintbrush or airbrush tool — with a small nib.
+ +In addition to the options common to all programs based on libnetpbm + (most notably -quiet, see + Common Options), pampaintspill recognizes the following +-command line options: ++command line options:
+ +Updated: 31 July 2010
- -- +-Updated: 31 July 2010
++ + ++ ++ ++pamrecolor - alter colors without affecting luminance
+ +Minimum unique abbreviation of option is acceptable. You may use double +@@ -30,7 +34,7 @@ space in place of the equals sign to separate an option name from its value. +
This program is part of Netpbm. ++
This program is part of Netpbm.
+ +pamrecolor changes an image's colors to be as close as + possible to given target colors but with the constraint that the +@@ -39,7 +43,7 @@ image will look identical if both are converted to grayscale + (e.g. with + ppmtopgm). You can have pamrecolor select + target colors randomly, specify a single hue for the entire image, or take the +-target colors from a target image. ++target colors from a target image.
+ +pamrecolor works on pseudo-Netpbm images based on arbitrary + color spaces. You can define the color space explicitly or choose one +@@ -49,7 +53,7 @@ of many that pamrecolor knows by name. + exact format of the PAM. If you want a PNM (PBM, PGM, or PPM) image, + use pamtopnm on the output. There is no + need to convert if you will use the image as input to a current Netpbm +-program, but many other programs don't know what a PAM is. ++program, but many other programs don't know what a PAM is.
+ + +In addition to the options common to all programs based on libnetpbm + (most notably -quiet, see + Common Options), pamrecolor recognizes the following +-command line options: ++command line options:
+ +The default is "ntsc" because this is the color space that the Netpbm + formats and many graphics utilities use. As a counterexample, + GIMP uses sRGB as its native color +-space. ++space.
+ +The luminance values pamrecolor uses for each of the above come from + Bruce Lindbloom's + +-Computing RGB-to-XYZ and XYZ-to-RGB matrices page. ++Computing RGB-to-XYZ and XYZ-to-RGB matrices page.
+ +If you specify neither --targetcolor nor + --colorfile, pamrecolor will randomly select a target color for +-each pixel of the input image. ++each pixel of the input image.
+ +You may not specify both -targetcolor and -colorfile. + +@@ -154,7 +158,7 @@ image to be repeated in a tile pattern. + +
If you specify neither --targetcolor nor + --colorfile, pamrecolor will randomly select a target color for +-each pixel of the input image. ++each pixel of the input image.
+ +You may not specify both -targetcolor and -colorfile. + +@@ -176,23 +180,23 @@ invocations. + +
This command tints an image yellow: ++
This command tints an image yellow:
+ ++- pamrecolor --targetcolor=yellow colorpic.pam > yellowpic.pam ++ pamrecolor --targetcolor=yellow colorpic.pam > yellowpic.pam ++ +
This command takes the colors from colorpicture.ppm and applies +-them to graypicture.pgm: ++them to graypicture.pgm:
+ ++- pamrecolor --colorfile=colorpic.ppm graypic.pgm > colorizedpic.pam ++ pamrecolor --colorfile=colorpic.ppm graypic.pgm > colorizedpic.pam ++ +
The grayscale version of colorizedpic.pam will look just like + graypic.pgm. Note that if you use a non-Netpbm tool to do the conversion to + grayscale, you may additionally need to specify an +-appropriate --colorspace value for your conversion tool. ++appropriate --colorspace value for your conversion tool.
+ + +Scott Pakin wrote pamrecolor in July 2010. ++
Scott Pakin wrote pamrecolor in July 2010.
+ +pamrecolor was new in Netpbm 10.52 (September 2010). + +@@ -229,7 +233,7 @@ photograph of the late 1800s). +
Copyright (C) 2010 Scott +-Pakin, scott+pbm@pakin.org. ++Pakin, scott+pbm@pakin.org.
+ + +Updated: 19 June 2015
- -- ++ +Updated: 5 April 2009
++ + ++ + +pamsistoaglyph - convert a single-image stereogram to a red/cyan ++anaglyphic image
-All options can be abbreviated to their shortest unique prefix. You + may use either white space or an equals sign between an option name +-and its value. ++and its value.
+ + +This program is part of Netpbm. + +
pamsistoaglyph reads a Netpbm image as input and +-produces a Netpbm image as output. ++produces a Netpbm image as output.
+ +pamsistoaglyph takes a single-image stereogram + (SIS) such as those produced by pamsistoaglyph is to help people who have trouble +-viewing single-image stereograms see the intriguing 3-D effect. ++viewing single-image stereograms see the intriguing 3-D effect.
+ +pamsistoaglyph can convert single-image random-dot + stereograms (SIRDS), wallpaper stereograms, and even dual-image +-stereograms to anaglyphic images. ++stereograms to anaglyphic images.
+ + +In addition to the options common to all programs based on libnetpbm + (most notably -quiet, see + Common Options), pamsistoaglyph recognizes the following +-command line options: ++command line options:
+ +For most images, no command-line options need to be specified. The +-following options are available, however, for unusual circumstances. ++following options are available, however, for unusual circumstances.
+ +The registration algorithm used by pamsistoaglyph + was developed specifically for this program. As far as the author + knows, there are no existing algorithms for converting stereograms to +-anaglyphs. The algorithm works as follows: ++anaglyphs. The algorithm works as follows:
+ +Copyright (C) 2009 Scott +-Pakin, scott+pbm@pakin.org. ++Pakin, scott+pbm@pakin.org.
+ + +Updated: 10 May 2020
++ ++ ++ + +pamstereogram - create a single-image stereogram from a PAM ++depth map
+ +This program is part of Netpbm. ++
This program is part of Netpbm.
+ +pamstereogram inputs a depth map (a map of the distances + from your eye of the points in a scene) and outputs a single-image +@@ -54,22 +57,22 @@ eyes. What's exciting about single-image stereograms is that they + don't require special glasses to view, although it does require a bit + of practice to train your eyes to unfocus properly. The + pamstereogram program provides a wealth of control over how the +-stereogram is generated, including the following: ++stereogram is generated, including the following:
+ +The output is a PAM image on standard output. Options control +@@ -79,7 +82,7 @@ if you will use the image as input to a current Netpbm program, but + many other programs don't know what a PAM is. + +
To make a red/green type of stereogram (that you view with 3-D +-glasses) instead, see ppm3d. ++glasses) instead, see ppm3d.
+ + +In addition to the options common to all programs based on libnetpbm + (most notably -quiet, see + Common Options), pamstereogram recognizes the following +-command line options: ++command line options:
+ +You may use either single or double hyphens to denote options. You + may use either whitespace or an equals sign to separate an option name +-from its value. ++from its value.
+ +This option was new in Netpbm 10.71 (June 2015). + +-
This option was new in Netpbm 10.53 (December 2010). +- ++
This option was new in Netpbm 10.53 (December 2010).
++This option was new in Netpbm 10.53 (December 2010). +- ++
This option was new in Netpbm 10.53 (December 2010).
++This option was new in Netpbm 10.53 (December 2010). Before +-Netpbm 10.61 (December 2012), it has no effect without -texfile. ++Netpbm 10.61 (December 2012), it has no effect without -texfile.
++This option was new in Netpbm 10.61 (December 2012). Before that, + the presence of -guidesize, with a positive value, has the same + effect. +- ++
Before Netpbm 10.53 (December 2010), the default was 96 DPI. +- ++
Before Netpbm 10.53 (December 2010), the default was 96 DPI.
++Before Netpbm 10.53 (December 2010), pamstereogram used higher + (lighter) numbers for things closer to the eye without +--crosseyed and vice versa. ++-crosseyed and vice versa.
++The number of distinct 3-D depths is far +@@ -299,10 +302,10 @@ parameters (distance between eyes and tradeoff between perceptibility + and depth) while -planes is a more computer-centric way (pixel + distances in the resulting stereogram). + +-
This option was new in Netpbm 10.59 (June 2012). +- ++
This option was new in Netpbm 10.59 (June 2012).
++This is irrelevant if you use a pattern file (-patfile + option), because there is no random element to pamstereogram's +-behavior. ++behavior.
+ +-This option was new in Netpbm 10.32 (February 2006). ++
This option was new in Netpbm 10.32 (February 2006).
++This option was new in Netpbm 10.91 (June 2020). ++
This option was new in Netpbm 10.91 (June 2020).
The only parameter, infile, is the name of an input file + that is a depth map image. If you don't specify infile, the +-input is from standard input. ++input is from standard input.
+ +The input is a PAM image of depth 1. Each sample represents the + distance from the eye that the 3-D image at that location should +@@ -344,10 +348,10 @@ be. Lower (darker) numbers mean further from the eye. +
pamstereogram pays no attention to the image's tuple type and +-ignores all planes other than plane 0. ++ignores all planes other than plane 0.
+ +Like any Netpbm program, pamstereogram will accept PNM +-input as if it were the PAM equivalent. ++input as if it were the PAM equivalent.
+ +You create an MTS with pamstereogram by passing the filename + of a PAM "texture image" with a -texfile option. A + texture image portrays the same 3-D object as the depth-map image but +-indicates the colors that the program should apply to the object. ++indicates the colors that the program should apply to the object.
+ +pamstereogram ignores the texture image's background color when it + overlaps copies of the 3-D object. This prevents, for example, a bright-red +@@ -370,32 +374,32 @@ object remains bright red. A consequence of this feature is that an MTS looks + best when the objects in the texture image have a crisp outline. Smooth + transitions to the background color result in unwanted color artifacts around + edges because the program ignores only exact matches with the +-background color. ++background color.
+ +You should specify a larger-than-normal value for -eyesep + (and/or -dpi) when producing an MTS. Otherwise, the 3-D object will + repeat so many times that most colored pixels will overlap other colored +-pixels, reducing the number of true-colored pixels that remain. ++pixels, reducing the number of true-colored pixels that remain.
+ +An MTS can employ a background pattern (-patfile). In this + case, pamstereogram replaces background pixels with pattern pixels in +-the final step of generating the image. ++the final step of generating the image.
+ + +A good initial test is to input an image consisting of a solid + shape of distance 0 within a large field of maximum distance (e.g., a +-white square on a black background). ++white square on a black background).
+ +With the default values for -dpi and -eyesep, pattern +-images that are 128 pixels wide can tile seamlessly. ++images that are 128 pixels wide can tile seamlessly.
+ + +Generate a SIRDS out of small, brightly colored squares and +-prepare it for display on an 87 DPI monitor: ++prepare it for display on an 87 DPI monitor:
+ ++ pamstereogram depthmap.pam \ +@@ -406,7 +410,7 @@ prepare it for display on an 87 DPI monitor: +Generate a SIS by tiling a PPM file (a prior run with + -verbose indicates how wide the pattern file should be for + seamless tiling, although any width is acceptable for producing +-SISes): ++SISes):
+ ++ pamstereogram depthmap.pam -patfile mypattern.ppm >3d.pam +@@ -416,7 +420,7 @@ SISes): +Generate an MTS by associating colors with a depth-mapped object + (using a large eye separation to reduce the number of repetitions of + the texture image) and twice smoothing over background-colored +-speckles: ++speckles:
+ ++ pamstereogram depthmap.pam \ +@@ -427,21 +431,21 @@ speckles: + +SEE ALSO
+
Copyright © 2006-2020 Scott Pakin, scott+pbm@pakin.org. ++
Copyright © 2006-2020 Scott Pakin, scott+pbm@pakin.org.
+ +Updated: 7 February 2010
++ ++ ++ + +pamtoavs - convert a Netpbm image to an AVS X image ++
pamtoavs - convert a Netpbm image to an AVS X image
+ +This program is part of Netpbm. ++
This program is part of Netpbm.
+ +pamtoavs reads a Netpbm image as input and produces a Stardent + AVS +@@ -27,14 +29,14 @@ href="http://www.gnuplot.info/">Gnuplot v4.2 and later can use. +
netpbmfile is the input file, which defaults to Standard Input. + Output is always on Standard Output. + +-
Try the following: ++
Try the following:
+ ++ gnuplot> plot 'myimage.avs' binary filetype=avs with rgbimage ++ +
See the Gnuplot +-manual for more information. ++manual for more information.
+ + +There are no command line options defined specifically + for pamtoavs, but it recognizes the options common to all + programs based on libnetpbm (See +-Common Options.) ++Common Options.)
+ +Copyright © 2010 Scott Pakin, +-scott+pbm@pakin.org. ++scott+pbm@pakin.org.
+ +avstopam, + gnuplot, +-pam ++pam
+ +Updated: 27 June 2007
+-Table Of Contents
++
++
Updated: 27 June 2007
++Table Of Contents
pamtooctaveimg - convert a Netpbm image to a GNU Octave image ++
pamtooctaveimg - convert a Netpbm image to a GNU Octave image
+ +This program is part of Netpbm. ++
This program is part of Netpbm.
+ +pamtooctaveimg reads a Netpbm image as input and produces a GNU Octave image file as output. +@@ -45,7 +45,7 @@ Image Processing chapter of the GNU Octave manual for details. +
There are no command line options defined specifically + for pamtooctaveimg, but it recognizes the options common to all + programs based on libnetpbm (See +-Common Options.) ++Common Options.)
+ +There is no octavetopam program. However, GNU Octave's +-saveimage command can save images in PPM format. ++saveimage command can save images in PPM format.
++ + +Copyright (C) 2007 Scott Pakin, +-scott+pbm@pakin.org. ++scott+pbm@pakin.org.
+ +pnmflip - replaced by pamflip
+ +This program is part of Netpbm. ++
This program is part of Netpbm.
+pnmflip was replaced in Netpbm 10.13 (December 2002) by pamflip. -+
pamflip is mostly backward compatible with pnmflip, - but works on PAM images too. ++
pamflip is mostly backward compatible with pnmflip, +-but works on PAM images too. ++but works on PAM images too.
+ +One way pamflip is not backward compatible with pnmflip + is that pnmflip lets you specify any number of basic flip options, +@@ -23,12 +24,12 @@ whereas pamflip requires exactly one. (pamflip provides + the -xform option for requesting multiple transformations, though). + Because of this incompatibility, pnmflip still exists as a + separate program, and all it does is translate its options to pamflip +-style and run pamflip. ++style and run pamflip.
+ +You should not make any new use of pnmflip and if you modify an + existing use, you should upgrade to pamflip. But note that if you + write a program that might have to be used with very old +-Netpbm, pnmflip is the only way to do that. ++Netpbm, pnmflip is the only way to do that.
+ + + +diff --git a/userguide/pnmmercator.html b/userguide/pnmmercator.html +index 998f7fb..65576ac 100644 +--- a/userguide/pnmmercator.html ++++ b/userguide/pnmmercator.html +@@ -18,11 +18,12 @@ projection and vice-versa + [filename] + +Minimum unique abbreviation of option is acceptable. +-You may use double hyphens instead of single hyphen to denote options. ++You may use double hyphens instead of single hyphen to denote options.
+ +This program is part of Netpbm. ++
This program is part of Netpbm.
+ +The pnmmercator utility, converts a rectangular projection worldmap + to a Mercator projection format, as used for maps.google.com and many other +@@ -31,34 +32,34 @@ online maps. The map used as input for pnmmercator must have rows for + file will typically be twice as wide as high, but this is not a + requirement. The output file will be using the Mercator +-projection and will get double the height of the input file. ++projection and will get double the height of the input file.
+ +Maps using the Mercator projection are stretched more the closer a row is + to the North or South Pole. The last few degrees (> 85 or < -85 degrees) + are not part of a Mercator map at all because they would be stretched too much + and the rows close to the edge will show banding, because they originate from +-the same row in the original map. ++the same row in the original map.
+ +To overcome this, the program will by default do interpolation of pixel + colors, which will eliminate the banding effect, but will cause some blurring + of the output. With the -nomix option, this interpolation of colors isn't + applied. You can obtain the highest quality output by starting with an input + map of high resolution, so that you can follow the pnmmercator +-transformation with a pamscale reduction in size. ++transformation with a pamscale reduction in size.
+ +This program can also convert a Mercator projection map back to a + rectangular projection based. As said, the Mercator map doesn't have + information about the latitudes close to the poles. Therefore the top rows in + the output image will be identical and copied from the row corresponding with +-latitude of 85 degrees. The same at the bottom of the map. ++latitude of 85 degrees. The same at the bottom of the map.
+ +Pnmmercator doesn't have any provision for scaling the image. You can scale + by piping the output of the program through Netpbm programs such as +-pamscale. ++pamscale.
+ +You can find maps to be used as input at flatplanet.sourceforge.net +-or uic.edu/pape. ++or uic.edu/pape.
+ +The point of a Mercator projection map is that compass directions work on + it. If you draw a straight line northeast from some point on the Mercator +@@ -78,33 +79,33 @@ proportional to angular longitude. +
filename is the name of the input file. If you don't specify +-this, pnmmercator reads the image from standard Input. ++this, pnmmercator reads the image from standard Input.
+ +In addition to the options common to all programs based on libnetpbm + (most notably -quiet, see + Common Options), pnmmercator recognizes the following +-command line options: ++command line options:
+ +With this option a conversion from Mercator to degrees is applied.The +-output image will have half the height of the input map. ++output image will have half the height of the input map.
+Default behaviour is that color blending is applied in between two adjacent + rows. If you specify the -nomix parameter there is no blending. The + consequence is a banding at the top and bottom of the map. With this option, +-the output map will also consist of exactly the same colors as the input. ++the output map will also consist of exactly the same colors as the input.
+This parameter outputs some additional information. If you double the 'v', + it will output debug data about the lat/long degree and Mercator +-conversions. ++conversions.
+pnmmercator was new in Netpbm 10.49 (December 2009). ++
pnmmercator was new in Netpbm 10.49 (December 2009).
+ +Willem van Schaik (of + pnmtopng/pngtopnm fame) wrote this program in October 2009 and +-suggested it for inclusion in Netpbm. ++suggested it for inclusion in Netpbm.
+ +This program is part of Netpbm. ++
ppmtogif - replaced by pamtogif
++This program is part of Netpbm.
-diff -urNp old/userguide/pnmmercator.html new/userguide/pnmmercator.html ---- old/userguide/pnmmercator.html 2017-09-05 13:58:08.334559565 +0200 -+++ new/userguide/pnmmercator.html 2017-09-05 14:08:08.305214742 +0200 -@@ -1,7 +1,6 @@ -- -+ - - -- -ppmtogif was replaced in Netpbm 10.37 (December 2006) by - pamtogif. +-pamtogif. ++pamtogif.
-+pamtogif is mostly backward compatible with ppmtogif. ++
pamtogif is mostly backward compatible with ppmtogif. -+
One way pamtogif is not backward compatible with ppmtogif ++
One way pamtogif is not backward compatible with ppmtogif is that to specify a transparency (alpha) mask with ppmtogif, you supply the transparency as a separate pseudo-PGM image and use the +@@ -77,8 +76,8 @@ the alpha image need not have the same maxval as the input. + ppmtogif interprets the alpha file using the alpha file's + maxval. + +-
You cannot specify both -transparent and -alpha. ++
You cannot specify both -transparent and -alpha.
+ + +- +- ++ ++ diff --git a/netpbm-manual-pages.patch b/netpbm-manual-pages.patch index d52c8eb..df35cbb 100644 --- a/netpbm-manual-pages.patch +++ b/netpbm-manual-pages.patch @@ -1,9 +1,9 @@ diff --git a/userguide/libnetpbm_ug.html b/userguide/libnetpbm_ug.html -index 94d4fd4..bb1c77e 100644 +index 92df98a..60ccc88 100644 --- a/userguide/libnetpbm_ug.html +++ b/userguide/libnetpbm_ug.html @@ -374,7 +374,7 @@ plain format. -The Libnetpbm Netpbm Image -Processing Manual describes the the libnetpbm functions for @@ -12,10 +12,10 @@ index 94d4fd4..bb1c77e 100644
The Libnetpbm Utility Manual diff --git a/userguide/pamfunc.html b/userguide/pamfunc.html -index d158393..e0fe96a 100644 +index 60d53d6..80f90f2 100644 --- a/userguide/pamfunc.html +++ b/userguide/pamfunc.html -@@ -57,7 +57,7 @@ output image. +@@ -60,7 +60,7 @@ output image. and bit string (such as and with 01001000). For the arithmetic functions, the function arguments and results are the fraction that a sample is of the maxval, i.e. normal interpretation of PAM tuples. But for the bit string @@ -25,49 +25,55 @@ index d158393..e0fe96a 100644
In addition to the options common to all programs based on libnetpbm + (most notably -quiet, see + Common Options), pbmtog3 recognizes the following +-command line options: ++command line options:
+ +Before Netpbm 10.79 (June 2017), there was a different program by the same -name in Netpbm, which was written by by Paul Haeberli +name in Netpbm, which was written by Paul Haeberli - <paul@manray.sgi.com> in 1989 + <paul@manray.sgi.com> in 1989 and then modified extensively by others. diff --git a/userguide/ppmtompeg.html b/userguide/ppmtompeg.html deleted file mode 100644 -index a1ce767..0000000 +index af5a8d7..0000000 --- a/userguide/ppmtompeg.html +++ /dev/null -@@ -1,1291 +0,0 @@ -- -- --
--This program is part of Netpbm. - --
ppmtompeg produces an MPEG-1 video stream. MPEG-1 is the +-
ppmtompeg produces an MPEG-1 video stream. MPEG-1 is the -first great video compression method, and is what is used in Video CDs -(VCD). ppmtompeg originated in the year 1995. DVD uses a more -advanced method, MPEG-2. There is an even newer method called MPEG-4 @@ -93,21 +99,21 @@ index a1ce767..0000000 -input files and other parameters. The file is described in detail -below. - --
To understand this program, you need to understand something about +-
To understand this program, you need to understand something about -the complex MPEG-1 format. One source of information about this -standard format is the section Introduction to MPEG in the Compression FAQ. - --
The -gop, -combine_gops, -frames, and --combine_frames options are all mutually exclusive. - --
The parameter file must contain the following +-
The parameter file must contain the following -lines (except when using the -combine_gops or -combine_frames -options): - --
See I Frames, P Frames, B Frames. - --
There are three types of lines between INPUT and END_INPUT. First, -a line may simply be the name of an input file. Second, the line @@ -336,13 +343,13 @@ index a1ce767..0000000 - -
-If input is from Standard Input (per the INPUT_DIR statement), --ppmtompeg ignores the INPUT/END_INPUT block, but +-ppmtompeg ignores the INPUT/END_INPUT block, but -it still must be present. - --
@@ -360,7 +367,7 @@ index a1ce767..0000000 -- -
Otherwise, conversion_command is a shell command that causes --an image in the format your specified with BASE_FILE_FORMAT to +-an image in the format your specified with BASE_FILE_FORMAT to -be written to Standard Output. ppmtompeg executes the command -once for each line between INPUT and END_INPUT (which is -normally, but not necessarily, a file name). In the conversion @@ -387,7 +394,7 @@ index a1ce767..0000000 - -as described above. - --
See Group Of Pictures. - --
| Reference | -Compression | -Speed | @@ -506,20 +512,20 @@ index a1ce767..0000000 -Quality B | -||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Decoded | --1000 | --1000 | --1000 | --969 | --919 | +-Decoded | +-1000 | +-1000 | +-1000 | +-969 | +-919 | -
| Original | --885 | --1373 | --1000 | --912 | --884 | +-Original | +-885 | +-1373 | +-1000 | +-912 | +-884 | -
The following lines are optional: - --
ratio must be 1.0, 0.6735, 0.7031, 0.7615, 0.8055, 0.8437, -0.8935, 0.9157, 0.9815, 1.0255, 1.0695, 1.0950, 1.1575, or 1.2015. - --
rate must be 23.976, 24, 25, 29.97, 30, 50, 59.94, or 60. - --
rate must be an integer. - --
If you specify the WARN_VBV_UNDERFLOW statement, +-
If you specify the WARN_VBV_UNDERFLOW statement, -ppmtompeg issues a warning each time the simulation underflows -the buffer, which suggests that an underflow would occur on playback, -which suggests the buffer is too small. - --
If you specify the WARN_VBV_OVERFLOW statement, +-
If you specify the WARN_VBV_OVERFLOW statement, -ppmtompeg issues a warning each time the simulation overflows -the buffer, which suggests that an overflow would occur on playback, -which suggests the buffer is too small. - --
These options were new in Netpbm 10.26 (January 2005). Before that, -ppmtompeg issued the warnings always. - --
You may specify only one of PARALLEL_TIME_CHUNKS, PARALLEL_CHUNK_TAPER, -and PARALLEL_PERFECT. PARALLEL_CHUNK_TAPER is usually best. - --
You may specify only one of PARALLEL_TIME_CHUNKS, PARALLEL_CHUNK_TAPER, -and PARALLEL_PERFECT. PARALLEL_CHUNK_TAPER is usually best. - --
On some HP machines, rsh is the restricted shell, and you want -to specify remsh. - --
This option was new in Netpbm 10.26 (January 2005). - --
If you use the -combine_gops option, then you need to specify +-
If you use the -combine_gops option, then you need to specify -only the SIZE and OUTPUT values in the parameter file. In -addition, the parameter file may specify input GOP files in the same -manner as normal input files -- except instead of using INPUT_DIR, @@ -765,27 +771,27 @@ index a1ce767..0000000 -parameter file for normal usage and for -combine_gops and --combine_frames. - --
The file format is case-sensitive so all keywords should be in +-
The file format is case-sensitive so all keywords should be in -upper case. - --
The statements may appear in any order, except that the order within +-
The statements may appear in any order, except that the order within -a block statement (such as INPUT ... END INPUT) is significant. - --
ppmtompeg is prepared to handle up to 16 B frames between +-
ppmtompeg is prepared to handle up to 16 B frames between -reference frames when encoding with input from stdin. (To build a -modified ppmtompeg with a higher limit, change the constant -B_FRAME_RUN in frame.c and recompile). - --
The quantization scale values (qscale) give a trade-off between -quality and compression. Using different Qscale values has very little -effect on speed. The qscale values can be set separately for I, P, and -B frames. - --
You select the qscale values with the IQSCALE, +-
You select the qscale values with the IQSCALE, -PQSCALE, and BSCALE parameter file statements. - -
A qscale value is an integer from 1 to 31. Larger numbers give @@ -797,117 +803,116 @@ index a1ce767..0000000 - -
Flower garden tests: - --
| Qscale | -I Frames | -P Frames | -B Frames | -||||
|---|---|---|---|---|---|---|---|
| 1 | --43.2 | --46.3 | --46.5 | +-1 | +-43.2 | +-46.3 | +-46.5 | -
| 6 | --32.6 | --34.6 | --34.3 | +-6 | +-32.6 | +-34.6 | +-34.3 | -
| 11 | --28.6 | --29.5 | --30.0 | +-11 | +-28.6 | +-29.5 | +-30.0 | -
| 16 | --26.3 | --26.8 | --28.6 | +-16 | +-26.3 | +-26.8 | +-28.6 | -
| 21 | --24.7 | --25.0 | --27.9 | +-21 | +-24.7 | +-25.0 | +-27.9 | -
| 26 | --23.5 | --23.9 | --27.5 | +-26 | +-23.5 | +-23.9 | +-27.5 | -
| 31 | --22.6 | --23.0 | --27.3 | +-31 | +-22.6 | +-23.0 | +-27.3 | -
| Qscale | -I Frames | -P Frames | -B Frames | -||||
|---|---|---|---|---|---|---|---|
| 1 | --2 | --2 | --2 | +-1 | +-2 | +-2 | +-2 | -
| 6 | --7 | --10 | --15 | +-6 | +-7 | +-10 | +-15 | -
| 11 | --11 | --18 | --43 | +-11 | +-11 | +-18 | +-43 | -
| 16 | --15 | --29 | --97 | +-16 | +-15 | +-29 | +-97 | -
| 21 | --19 | --41 | --173 | +-21 | +-19 | +-41 | +-173 | -
| 26 | --24 | --56 | --256 | +-26 | +-24 | +-56 | +-256 | -
| 31 | --28 | --73 | --330 | +-31 | +-28 | +-73 | +-330 | -
There are several different motion vector search techniques -available. There are different techniques available for P frame @@ -925,71 +930,69 @@ index a1ce767..0000000 -P frame search, and Cross2 and Simple for B frame search. Here are -some numbers comparing the different search methods: - --
| Technique | -Compression1 | -Speed 2 | -Quality 3 | -||||
|---|---|---|---|---|---|---|---|
| Exhaustive | --1000 | --1000 | --1000 | +-Exhaustive | +-1000 | +-1000 | +-1000 | -
| SubSample | --1008 | --2456 | --1000 | +-SubSample | +-1008 | +-2456 | +-1000 | -
| TwoLevel | --1009 | --3237 | --1000 | +-TwoLevel | +-1009 | +-3237 | +-1000 | -
| Logarithmic | --1085 | --8229 | --998 | +-Logarithmic | +-1085 | +-8229 | +-998 | -
| Technique | -Compression1 | -Speed2 | -Quality3 | -||||
|---|---|---|---|---|---|---|---|
| Exhaustive | --1000 | --1000 | --1000 | +-Exhaustive | +-1000 | +-1000 | +-1000 | -
| Cross2 | --975 | --1000 | --996 | +-Cross2 | +-975 | +-1000 | +-996 | -
| Simple | --938 | --1765 | --991 | +-Simple | +-938 | +-1765 | +-991 | -
For some reason, Simple seems to give better compression, but it -depends on the image sequence. - --
Select the search techniques with the PSEARCH_ALG and --BSEARCH_ALG parameter file statements. +-
Select the search techniques with the PSEARCH_ALG and +-BSEARCH_ALG parameter file statements. - - -- --
A Group of Pictures (GOP) is a roughly independently decodable -sequence of frames. An MPEG video stream is made of one or more @@ -1023,7 +1025,7 @@ index a1ce767..0000000 -with the -combine_gops command option. - - --
A slice is an independently decodable unit in a frame. It can be -as small as one macroblock, or it can be as big as the entire frame. @@ -1033,7 +1035,7 @@ index a1ce767..0000000 -usually errors are not such a problem, we usually just use one slice -per frame. - --
Control the slice size with the SLICES_PER_FRAME parameter +-
Control the slice size with the SLICES_PER_FRAME parameter -file statement. - -
Some MPEG playback systems require that each slice consist of whole @@ -1048,12 +1050,12 @@ index a1ce767..0000000 - - - --
The search window is the window in which ppmtompeg searches -for motion vectors. The window is a square. You can specify the size -of the square, and whether to allow half-pixel motion vectors or not, --with the RANGE and PIXEL parameter file statements. +-with the RANGE and PIXEL parameter file statements. - -
| Frame Type | -Size | -Speed | -Quality | -||||
|---|---|---|---|---|---|---|---|
| I frames | --1000 | --1000 | --1000 | +-I frames | +-1000 | +-1000 | +-1000 | -
| P frames | --409 | --609 | --969 | +-P frames | +-409 | +-609 | +-969 | -
| B frames | --72 | --260 | --919 | +-B frames | +-72 | +-260 | +-919 | -
A standard sequence is IBBPBBPBBPBBPBB. - --
Select the sequence with the PATTERN parameter file statement. +-
Select the sequence with the PATTERN parameter file statement. - -
Since the last MPEG frame cannot be a B frame (see above), if the -pattern you specify indicates a B frame for the last movie frame of @@ -1138,17 +1139,17 @@ index a1ce767..0000000 -respectively. - - --
Specify the input frame images with the INPUT_DIR, --INPUT, END_INPUT, BASE_FILE_FORMAT, --SIZE, YUV_FORMAT and INPUT_CONVERT parameter +-
Specify the input frame images with the INPUT_DIR, +-INPUT, END_INPUT, BASE_FILE_FORMAT, +-SIZE, YUV_FORMAT and INPUT_CONVERT parameter -file statements. - -
Specify the output file with the OUTPUT parameter file statement. - - --
ppmtompeg can generate a variety of statistics about the -encoding. See the -stat, -snr, -mv_histogram, @@ -1156,9 +1157,9 @@ index a1ce767..0000000 -options. - - --
You can run ppmtompeg on multiple machines at once, encoding +-
You can run ppmtompeg on multiple machines at once, encoding -the same MPEG stream. When you do, the machines are used as shown in -the following diagram. We call this "parallel mode." - @@ -1183,12 +1184,12 @@ index a1ce767..0000000 -
-machine user executable - --
The executable is normally ppmtompeg (you may need to give +-
The executable is normally ppmtompeg (you may need to give -the complete path if you've built for different architectures). If -the machine does not have filesystem access to the input files, the line -is: - --
REMOTE machine user executable +-
REMOTE machine user executable -parameter file - -
The -max_machines command option limits the number of @@ -1205,8 +1206,8 @@ index a1ce767..0000000 -using an NFS filesystem, you must make sure it is mounted at the same -mountpoint on all systems). - --
Because not all of the processes involved in parallel operation --have easy access to the input files, you must specify the SIZE +-
Because not all of the processes involved in parallel operation +-have easy access to the input files, you must specify the SIZE -parameter file statement when you do parallel operation. - -
The machine on which you originally invoke ppmtompeg is the @@ -1238,39 +1239,38 @@ index a1ce767..0000000 -long-running CPU load will have minimal impact on other, possibly -interactive, users of the systems. - -- --
Here is a look at ppmtompeg speed, in single-node (not parallel) -operation: - --
| Machine Type | -Macroblocks per second1 | -||
|---|---|---|---|
| HP 9000/755 | --280 | +-HP 9000/755 | +-280 | -
| DEC 3000/400 | --247 | +-DEC 3000/400 | +-247 | -
| HP 9000/750 | --191 | +-HP 9000/750 | +-191 | -
| Sparc 10 | --104 | +-Sparc 10 | +-104 | -
| DEC 5000 | --68 | +-DEC 5000 | +-68 | -
pammixmulti - blend together multiple PAM images ++
pammixmulti - blend together multiple PAM images
+ + +Minimum unique abbreviation of an option is acceptable. You can use a + single hyphen instead of double hyphens to denote options. You can use white + space in place of the equals sign to separate an option name from its +-value. ++value.
+ + +This file is part of Netpbm. ++
This file is part of Netpbm.
+ +pammixmulti mixes two or more images to produce a new image. The + program provides multiple ways to interpret "mix." +@@ -37,7 +37,7 @@ program provides multiple ways to interpret "mix." +
In addition to the options common to all programs based on libnetpbm + (most notably -quiet, see + Common Options), pammixmulti recognizes the following +-command line options: ++command line options:
+ +mask, each pixel in the output is produced by a
+ weighted average of the corresponding pixels from all the input images based
+-on the grayscale level of an additional mask image.
++on the grayscale level of an additional mask image.
+
+
+ You supply the names of the files to mix as non-option arguments. ++
You supply the names of the files to mix as non-option arguments.
+ + +Average a bunch of PPM images to produce a new PAM image: ++
Average a bunch of PPM images to produce a new PAM image:
+
+ pammixmulti input*.ppm >output.ppm
+
+
+ Mix these same images by taking each pixel from a randomly selected input +-image: ++image:
+ +
+ pammixmulti --blend=random input*.ppm >output.ppm
+
+
+ Use a mask image to control the fading among input images on a +-pixel-by-pixel basis: ++pixel-by-pixel basis:
+ +
+ pammixmulti --blend=mask --maskfile=mask.pgm >output.pam \
+ one.pam two.pam three.pam four.pam
+
+
+-Do the same but with more abrupt transitions: ++
Do the same but with more abrupt transitions:
+ +
+ pammixmulti --blend=mask --maskfile=mask.pgm --stdev=0.0 >output.pam \
+ one.pam two.pam three.pam four.pam
+
+
+-and now with more gradual transitions: ++
and now with more gradual transitions:
+ +
+ pammixmulti --blend=mask --maskfile=mask.pgm --stdev=1.0 >output.pam \
+@@ -138,7 +138,7 @@ pixel-by-pixel basis:
+
+ AUTHOR
+
+-Copyright 2018 Scott Pakin, scott+pbm@pakin.org.
++
Copyright 2018 Scott Pakin, scott+pbm@pakin.org.
+
+ SEE ALSO
+
+@@ -152,14 +152,14 @@ pixel-by-pixel basis:
+ Table Of Contents
+
+
+-- SYNOPSIS
+-
- DESCRIPTION
+-
- OPTIONS
+-
- ARGUMENTS
+-
- EXAMPLES
+-
- HISTORY
+-
- AUTHOR
+-
- SEE ALSO
++
- SYNOPSIS
++- DESCRIPTION
++- OPTIONS
++- ARGUMENTS
++- EXAMPLES
++- HISTORY
++- AUTHOR
++- SEE ALSO
+
+
+
diff --git a/netpbm.spec b/netpbm.spec
index 95ce72e..d8ce976 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 10.90.00
-Release: 2%{?dist}
+Version: 10.92.00
+Release: 1%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -24,14 +24,13 @@ Patch9: netpbm-xwdfix.patch
Patch10: netpbm-multilib.patch
Patch11: netpbm-glibc.patch
Patch12: netpbm-docfix.patch
-Patch13: netpbm-fiasco-overflow.patch
-Patch14: netpbm-cmuwtopbm.patch
-Patch15: netpbm-pamtojpeg2k.patch
-Patch16: netpbm-manfix.patch
-Patch17: netpbm-manual-pages.patch
-Patch18: netpbm-jasper.patch
-Patch19: netpbm-userguide.patch
-Patch20: netpbm-libdir-so.patch
+Patch13: netpbm-cmuwtopbm.patch
+Patch14: netpbm-pamtojpeg2k.patch
+Patch15: netpbm-manfix.patch
+Patch16: netpbm-manual-pages.patch
+Patch17: netpbm-jasper.patch
+Patch18: netpbm-userguide.patch
+Patch19: netpbm-libdir-so.patch
BuildRequires: libjpeg-devel, libpng-devel, libtiff-devel, flex, gcc, jbigkit-devel
BuildRequires: libX11-devel, perl-generators, python3, jasper-devel, libxml2-devel
@@ -230,6 +229,9 @@ popd
%doc userguide/*
%changelog
+* Wed Oct 07 2020 Josef Ridky - 10.92.00-1
+- New upstream release 10.92.00 (#1851753)
+
* Tue Jul 28 2020 Fedora Release Engineering - 10.90.00-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
From e8ffa0347758e32b9e9c4c788e808f5cd727ed46 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Wed, 7 Oct 2020 14:28:18 +0200
Subject: [PATCH 03/42] New sources
---
.gitignore | 1 +
sources | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index 274d7eb..cb12c92 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,4 @@
/netpbm-10.88.00.tar.xz
/netpbm-10.89.00.tar.xz
/netpbm-10.90.00.tar.xz
+/netpbm-10.92.00.tar.xz
diff --git a/sources b/sources
index 81e946b..3a7ec07 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-10.90.00.tar.xz) = 9f80244e9d8eaaf96f8fa846ca70f000f88f68585df273cbd7e738d0cce1d3570f8d9a8e762029a090b110dbcb230d978b0dff0e57d130168323bd7f4becf391
+SHA512 (netpbm-10.92.00.tar.xz) = 8737c7c644029fc256eb645a8dda3be6a9f2cf23c1634877f6bc6e7f5b5a453db5eae116a2dcde47e15dd3faf5816a01eb0185545d7acdabd475886924cb16c4
From a23721174b513cc3277ef9961dc72da8942938e2 Mon Sep 17 00:00:00 2001
From: Tom Stellard
Date: Thu, 7 Jan 2021 05:41:48 +0000
Subject: [PATCH 04/42] Add BuildRequires: make
https://fedoraproject.org/wiki/Changes/Remove_make_from_BuildRoot
---
netpbm.spec | 1 +
1 file changed, 1 insertion(+)
diff --git a/netpbm.spec b/netpbm.spec
index d8ce976..a730fa1 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -32,6 +32,7 @@ Patch17: netpbm-jasper.patch
Patch18: netpbm-userguide.patch
Patch19: netpbm-libdir-so.patch
+BuildRequires: make
BuildRequires: libjpeg-devel, libpng-devel, libtiff-devel, flex, gcc, jbigkit-devel
BuildRequires: libX11-devel, perl-generators, python3, jasper-devel, libxml2-devel
BuildRequires: perl(Config), perl(Cwd), perl(English), perl(Fcntl), perl(File::Basename)
From 8db855745fcdeec6da6390d678a673968fb1fb0d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Tue, 26 Jan 2021 14:30:04 +0100
Subject: [PATCH 05/42] Resolves: #1911159 - new upstream version 10.93.00
---
.gitignore | 1 +
netpbm-manfix.patch | 1053 ++++++++++++++++++++++---------------------
netpbm.spec | 5 +-
sources | 2 +-
4 files changed, 551 insertions(+), 510 deletions(-)
diff --git a/.gitignore b/.gitignore
index cb12c92..6c496c0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,4 @@
/netpbm-10.89.00.tar.xz
/netpbm-10.90.00.tar.xz
/netpbm-10.92.00.tar.xz
+/netpbm-10.93.00.tar.xz
diff --git a/netpbm-manfix.patch b/netpbm-manfix.patch
index bab0e6c..82a06b0 100644
--- a/netpbm-manfix.patch
+++ b/netpbm-manfix.patch
@@ -569,514 +569,6 @@ index 1ca53ac..e545986 100644
-diff --git a/userguide/pamstereogram.html b/userguide/pamstereogram.html
-index 759ca28..eec0e66 100644
---- a/userguide/pamstereogram.html
-+++ b/userguide/pamstereogram.html
-@@ -2,13 +2,16 @@
- Pamstereogram User Manual
-
- pamstereogram
--Updated: 10 May 2020
--
--Table Of Contents
-+
-+Updated: 10 May 2020
-+
-+
-+
-
- NAME
-
--pamstereogram - create a single-image stereogram from a PAM depth map
-+pamstereogram - create a single-image stereogram from a PAM
-+depth map
-
- SYNOPSIS
-
-@@ -38,13 +41,13 @@ pamstereogram - create a single-image stereogram from a PAM depth map
- [-randomseed=integer]
- [-tileable]
- [infile]
--
-+
-
-
-
- DESCRIPTION
-
--This program is part of Netpbm.
-+
This program is part of Netpbm.
-
- pamstereogram inputs a depth map (a map of the distances
- from your eye of the points in a scene) and outputs a single-image
-@@ -54,22 +57,22 @@ eyes. What's exciting about single-image stereograms is that they
- don't require special glasses to view, although it does require a bit
- of practice to train your eyes to unfocus properly. The
- pamstereogram program provides a wealth of control over how the
--stereogram is generated, including the following:
-+stereogram is generated, including the following:
-
-
--- black and white, grayscale, or color output
-+
- black and white, grayscale, or color output
-
- - single-image random-dot stereograms (SIRDS), single-image
- stereograms (SIS) using a tiled image, or mapped-texture stereograms
--(MTS)
-+(MTS)
-
--- images targeting a given device resolution and eye separation
-+
- images targeting a given device resolution and eye separation
-
--- optional guide boxes to assist in focusing
-+
- optional guide boxes to assist in focusing
-
--- the ability to trade off depth levels for easier viewing
-+
- the ability to trade off depth levels for easier viewing
-
--- choice of wall-eyed or cross-eyed stereograms
-+
- choice of wall-eyed or cross-eyed stereograms
-
-
- The output is a PAM image on standard output. Options control
-@@ -79,7 +82,7 @@ if you will use the image as input to a current Netpbm program, but
- many other programs don't know what a PAM is.
-
-
To make a red/green type of stereogram (that you view with 3-D
--glasses) instead, see ppm3d.
-+glasses) instead, see ppm3d.
-
-
- OPTIONS
-@@ -87,36 +90,36 @@ glasses) instead, see ppm3d.
- In addition to the options common to all programs based on libnetpbm
- (most notably -quiet, see
- Common Options), pamstereogram recognizes the following
--command line options:
-+command line options:
-
- You may use either single or double hyphens to denote options. You
- may use either whitespace or an equals sign to separate an option name
--from its value.
-+from its value.
-
-
-
--- -verbose
-+
- -verbose
- - Display messages about image sizes and formats and properties
--of the stereogram being generated.
-+of the stereogram being generated.
-
--- -blackandwhite
-+
- -blackandwhite
- - Produce a single-image random-dot black-and-white stereogram.
--This is the default.
-+This is the default.
-
--- -grayscale
--
- Produce a single-image random-dot grayscale stereogram.
-+
- -grayscale
-+- Produce a single-image random-dot grayscale stereogram.
-
--- -color
--
- Produce a single-image random-dot color stereogram.
-+
- -color
-+- Produce a single-image random-dot color stereogram.
-
--- -maxval=value
-+
- -maxval=value
- - Designate the maximum value of each gray/color component, i.e.
- the color resolution. Smaller values make the output image have
- smaller numbers of unique grays/colors. If you don't specify
- -maxval, pamstereogram uses the maxval of the input
--image. This option has no effect with -blackandwhite.
-+image. This option has no effect with -blackandwhite.
-
--- -patfile=pamfile
-+
- -patfile=pamfile
- - Specify an image to use as a repeated background pattern for
- the stereogram instead of a random-dot pattern. Intricate images
- generally produce a crisper 3-D effect that simpler images. The
-@@ -125,9 +128,9 @@ grayscale or color) as the pattern file. You cannot specify the
- -patfile option along with -blackandwhite,
- -grayscale, -color, or -maxval. The
- -verbose option will give you information on the ideal
--dimensions of the pattern file.
-+dimensions of the pattern file.
-
--
- -xbegin=pixels
-+
- -xbegin=pixels
- - Specify the horizontal coordinate at which to begin stereogram generation.
- The background pattern will be minimally distorted at this point and more
- distorted at greater distances. Consider using this in conjunction
-@@ -141,7 +144,7 @@ and pamstereogram actually ignores it with respect to -texfile
-
-
This option was new in Netpbm 10.71 (June 2015).
-
--
- -texfile=pamfile
-+
- -texfile=pamfile
- - Specify an image to use as the texture for a mapped-texture
- stereogram. The idea is that the depth-map image provides the depth
- values of the 3-D object/scene while the texture image provides the
-@@ -150,10 +153,10 @@ the depth-map image. (Note that it's required to have the same
- dimensions.) The texture image's background color is ignored when
- blending colors.
-
--
This option was new in Netpbm 10.53 (December 2010).
--
-+
This option was new in Netpbm 10.53 (December 2010).
-+
-
--- -bgcolor=color
-+
- -bgcolor=color
- - Use color as the texture image's background color instead
- of letting pamstereogram determine it automatically. Specify
- the color as described for the
-@@ -161,10 +164,10 @@ the color as described for the
- routine. The -bgcolor option is meaningful only in conjunction
- with -texfile.
-
--
This option was new in Netpbm 10.53 (December 2010).
--
-+
This option was new in Netpbm 10.53 (December 2010).
-+
-
--- -smoothing=pixels
-+
- -smoothing=pixels
- - When used without -texfile, attempt to eliminate artifacts
- introduced by edges in the depth map if pixels is greater than zero.
-
-@@ -175,29 +178,29 @@ by the stereogram's color constraints when producing a mapped-texture
- stereogram. In this case, the -smoothing option is helpful
- when the texture image includes smooth color transitions (as in a
- photograph) but makes crisp texture images (as in a line drawing)
--appear blurry.
-+appear blurry.
-
-
This option was new in Netpbm 10.53 (December 2010). Before
--Netpbm 10.61 (December 2012), it has no effect without -texfile.
-+Netpbm 10.61 (December 2012), it has no effect without -texfile.
-+
-
--
--- -xshift=pixels
-+
- -xshift=pixels
- - Shift the pattern image (designated by -patfile) to the
- right by pixels pixels (default: 0).
--
--This option is valid only along with -patfile.
-+
-+This option is valid only along with -patfile.
-
--- -yshift pixels
-+
- -yshift pixels
- - Shift the pattern image (designated by -patfile)
- downwards by pixels pixels (default: 0). This option is
--valid only along with -patfile.
-+valid only along with -patfile.
-
--- -magnifypat=scale
-+
- -magnifypat=scale
- - Magnify each pixel in the pattern file or each random dot by
- integral scaling factor scale. Note that
- pamstereogram applies the pattern magnification
- after pattern shifting (-xshift and
---yshift).
-+-yshift).
-
- - -guidebottom
-
-
-@@ -211,7 +214,7 @@ square. At that point, a crisp, 3-D image will appear.
-
This option was new in Netpbm 10.61 (December 2012). Before that,
- the presence of -guidesize, with a positive value, has the same
- effect.
--
-+
-
- - -guidetop
-
-
-@@ -221,7 +224,7 @@ Same as -guidebottom, except the guides go at the top of the image.
- the presence of -guidesize, with a negative value, has the same
- effect.
-
--
- -guidesize=pixels
-+
- -guidesize=pixels
-
- - The size (width and height) of each guide box.
-
-@@ -236,15 +239,15 @@ too, and if you specify it with a negative value, it behaves as if you
- specified -guidetop and specified guidesize with the absolute
- value of that negative value.
-
--
- -dpi=resolution
-+
- -dpi=resolution
- - Specify the resolution of the output device in dots per inch.
- The default is 100 DPI, which represents a fairly crisp screen
- resolution.
-
--
Before Netpbm 10.53 (December 2010), the default was 96 DPI.
--
-+
Before Netpbm 10.53 (December 2010), the default was 96 DPI.
-+
-
--- -crosseyed
-+
- -crosseyed
- - Invert the gray levels in the depth map (input image) so that the 3-D
- image pops out of the page where it would otherwise sink into the page and
- vice versa. Some people are unable to diverge their eyes and can only cross
-@@ -255,10 +258,10 @@ colors are farther from the eye.
-
-
Before Netpbm 10.53 (December 2010), pamstereogram used higher
- (lighter) numbers for things closer to the eye without
---crosseyed and vice versa.
-+-crosseyed and vice versa.
-+
-
--
--- -makemask
-+
- -makemask
- - Instead of a stereogram, output a PAM mask image showing
- coloring constraints. New pixels will be taken from the pattern
- file where the mask is black. Copies of existing pixels will be
-@@ -266,30 +269,30 @@ taken from the pattern file where the mask is white. The
- -makemask option can be used to help create more
- sophisticated pattern files (to use with -patfile) Note that
- -makemask ignores -magnifypat; it always produces
--masks that assume a pattern magnification of 1.
-+masks that assume a pattern magnification of 1.
-
--- -eyesep=inches
-+
- -eyesep=inches
- - Specify the separation in inches between your eyes. The
- default, 2.5 inches (6.4 cm), should be sufficient for most people
--and probably doesn't need to be changed.
-+and probably doesn't need to be changed.
-
--- -depth=fraction
-+
- -depth=fraction
- - Specify the output image's depth of field. That is,
- fraction represents the fractional distance of the near
- plane from the far plane. Smaller numbers make the 3-D image easier
- to perceive but flatter. Larger numbers make the 3-D image more
- difficult to perceive but deeper. The default, 0.3333, generally
--works fairly well.
-+works fairly well.
-
--- -planes=near_pixels,far_pixels
-+
- -planes=near_pixels,far_pixels
- - Explicitly specify the distance between repeated pixels in the near plane
- and in the far plane. This is an alternative to
- -eyesep and -depth. The following equalities hold:
-
-
-- - eyesep = 2 * far
-+
- eyesep = 2 * far
- - depth = 2 * (far − near) /
-- (2 * far − near)
-+ (2 * far − near)
-
-
- The number of distinct 3-D depths is far
-@@ -299,10 +302,10 @@ parameters (distance between eyes and tradeoff between perceptibility
- and depth) while -planes is a more computer-centric way (pixel
- distances in the resulting stereogram).
-
--
This option was new in Netpbm 10.59 (June 2012).
--
-+
This option was new in Netpbm 10.59 (June 2012).
-+
-
--- -randomseed=integer
-+
- -randomseed=integer
- - Specify a seed to be used for the random number generator.
- The default is to use a seed based on the time of day, to one second
- granularity.
-@@ -313,18 +316,19 @@ every time you run pamstereogram.
-
-
This is irrelevant if you use a pattern file (-patfile
- option), because there is no random element to pamstereogram's
--behavior.
-+behavior.
-
--This option was new in Netpbm 10.32 (February 2006).
-+
This option was new in Netpbm 10.32 (February 2006).
-+
-
--- -tileable
-+
- -tileable
-
- - Make the generated image horizontally tileable. This works by
- blending a left-to-right rendering (the equivalent
- of -xbegin=0) with a right-to-left rendering (the equivalent
- of -xbegin=width−1).
-
--
This option was new in Netpbm 10.91 (June 2020).
-+
This option was new in Netpbm 10.91 (June 2020).
-
-
-
-@@ -333,7 +337,7 @@ of -xbegin=width−1).
-
- The only parameter, infile, is the name of an input file
- that is a depth map image. If you don't specify infile, the
--input is from standard input.
-+input is from standard input.
-
- The input is a PAM image of depth 1. Each sample represents the
- distance from the eye that the 3-D image at that location should
-@@ -344,10 +348,10 @@ be. Lower (darker) numbers mean further from the eye.
-
Input Images
-
- pamstereogram pays no attention to the image's tuple type and
--ignores all planes other than plane 0.
-+ignores all planes other than plane 0.
-
- Like any Netpbm program, pamstereogram will accept PNM
--input as if it were the PAM equivalent.
-+input as if it were the PAM equivalent.
-
- Mapped-texture Stereograms
-
-@@ -355,12 +359,12 @@ input as if it were the PAM equivalent.
- drawn with true colors. Unlike a SIRDS or tiled-image SIS, however,
- the image portrayed by an MTS is apparent in normal 2-D viewing. It
- appears repeated multiple times and overlapped with itself, but it is
--not hidden.
-+not hidden.
-
- You create an MTS with pamstereogram by passing the filename
- of a PAM "texture image" with a -texfile option. A
- texture image portrays the same 3-D object as the depth-map image but
--indicates the colors that the program should apply to the object.
-+indicates the colors that the program should apply to the object.
-
- pamstereogram ignores the texture image's background color when it
- overlaps copies of the 3-D object. This prevents, for example, a bright-red
-@@ -370,32 +374,32 @@ object remains bright red. A consequence of this feature is that an MTS looks
- best when the objects in the texture image have a crisp outline. Smooth
- transitions to the background color result in unwanted color artifacts around
- edges because the program ignores only exact matches with the
--background color.
-+background color.
-
- You should specify a larger-than-normal value for -eyesep
- (and/or -dpi) when producing an MTS. Otherwise, the 3-D object will
- repeat so many times that most colored pixels will overlap other colored
--pixels, reducing the number of true-colored pixels that remain.
-+pixels, reducing the number of true-colored pixels that remain.
-
- An MTS can employ a background pattern (-patfile). In this
- case, pamstereogram replaces background pixels with pattern pixels in
--the final step of generating the image.
-+the final step of generating the image.
-
-
- Miscellaneous
-
- A good initial test is to input an image consisting of a solid
- shape of distance 0 within a large field of maximum distance (e.g., a
--white square on a black background).
-+white square on a black background).
-
- With the default values for -dpi and -eyesep, pattern
--images that are 128 pixels wide can tile seamlessly.
-+images that are 128 pixels wide can tile seamlessly.
-
-
- EXAMPLES
-
- Generate a SIRDS out of small, brightly colored squares and
--prepare it for display on an 87 DPI monitor:
-+prepare it for display on an 87 DPI monitor:
-
-
- pamstereogram depthmap.pam \
-@@ -406,7 +410,7 @@ prepare it for display on an 87 DPI monitor:
- Generate a SIS by tiling a PPM file (a prior run with
- -verbose indicates how wide the pattern file should be for
- seamless tiling, although any width is acceptable for producing
--SISes):
-+SISes):
-
-
- pamstereogram depthmap.pam -patfile mypattern.ppm >3d.pam
-@@ -416,7 +420,7 @@ SISes):
- Generate an MTS by associating colors with a depth-mapped object
- (using a large eye separation to reduce the number of repetitions of
- the texture image) and twice smoothing over background-colored
--speckles:
-+speckles:
-
-
- pamstereogram depthmap.pam \
-@@ -427,21 +431,21 @@ speckles:
-
- SEE ALSO
-
--- pam
-+
- pam
-
--- pamsistoaglyph
-+
- pamsistoaglyph
-
--- ppm3d
-+
- ppm3d
-
- - Harold W. Thimbleby, Stuart Inglis, and Ian H. Witten.
- Displaying 3D Images: Algorithms for Single Image Random Dot
- Stereograms. In IEEE Computer, 27(10):38-48,
- October 1994. DOI: 10.1109/2.318576.
-+href="http://dx.doi.org/10.1109/2.318576">10.1109/2.318576.
-
- - W. A. Steer.
- Stereograms: Technical Details.
--URL: http://www.techmind.org/stereo/stech.html.
-+URL: http://www.techmind.org/stereo/stech.html.
-
-
-
-@@ -457,24 +461,25 @@ Netpbm 10.61 (December 2012).
-
-
- AUTHOR
--Copyright © 2006-2020 Scott Pakin, scott+pbm@pakin.org.
-+
Copyright © 2006-2020 Scott Pakin, scott+pbm@pakin.org.
-
- Table Of Contents
-
--- SYNOPSIS
--
- DESCRIPTION
--
- OPTIONS
--
- PARAMETERS
-+
- SYNOPSIS
-+- DESCRIPTION
-+- OPTIONS
-+- PARAMETERS
- - NOTES
--
-- - Input Images
--
- Mapped-texture Stereograms
--
- Miscellaneous
-+
-+ - Input Images
-+ - Mapped-texture Stereograms
-+ - Miscellaneous
-
-- - EXAMPLES
--
- SEE ALSO
--
- HISTORY
--
- AUTHOR
-+
-+- EXAMPLES
-+- SEE ALSO
-+- HISTORY
-+- AUTHOR
-
-
-
diff --git a/userguide/pamtoavs.html b/userguide/pamtoavs.html
index 5d0ae35..bee1a40 100644
--- a/userguide/pamtoavs.html
@@ -1463,3 +955,548 @@ index 513133a..fa72e09 100644
-
+
+
+diff -urNp a/userguide/pamstereogram.html b/userguide/pamstereogram.html
+--- a/userguide/pamstereogram.html 2021-01-26 13:41:35.057401508 +0100
++++ b/userguide/pamstereogram.html 2021-01-26 14:23:22.076294594 +0100
+@@ -9,7 +9,8 @@
+
+ NAME
+
+-pamstereogram - create a single-image stereogram from a PAM depth map
++pamstereogram - create a single-image stereogram from a PAM
++depth map
+
+ SYNOPSIS
+
+@@ -39,13 +40,13 @@ pamstereogram - create a single-image st
+ [-randomseed=integer]
+ [-tileable]
+ [infile]
+-
++
+
+
+
+ DESCRIPTION
+
+-This program is part of Netpbm.
++
This program is part of Netpbm.
+
+ pamstereogram inputs a depth map (a map of the distances
+ from your eye of the points in a scene) and outputs a single-image
+@@ -55,22 +56,22 @@ eyes. What's exciting about single-image
+ don't require special glasses to view, although it does require a bit
+ of practice to train your eyes to unfocus properly. The
+ pamstereogram program provides a wealth of control over how the
+-stereogram is generated, including the following:
++stereogram is generated, including the following:
+
+
+-- black and white, grayscale, or color output
++
- black and white, grayscale, or color output
+
+ - single-image random-dot stereograms (SIRDS), single-image
+ stereograms (SIS) using a tiled image, or mapped-texture stereograms
+-(MTS)
++(MTS)
+
+-- images targeting a given device resolution and eye separation
++
- images targeting a given device resolution and eye separation
+
+-- optional guide boxes to assist in focusing
++
- optional guide boxes to assist in focusing
+
+-- the ability to trade off depth levels for easier viewing
++
- the ability to trade off depth levels for easier viewing
+
+-- choice of wall-eyed or cross-eyed stereograms
++
- choice of wall-eyed or cross-eyed stereograms
+
+
+ The output is a PAM image on standard output. Options control
+@@ -80,7 +81,7 @@ if you will use the image as input to a
+ many other programs don't know what a PAM is.
+
+
To make a red/cyan type of stereogram (that you view with 3-D
+-glasses) instead, see ppm3d.
++glasses) instead, see ppm3d.
+
+
+ OPTIONS
+@@ -92,32 +93,32 @@ from its value.
+ In addition to the options common to all programs based on libnetpbm
+ (most notably -quiet, see
+ Common Options), pamstereogram recognizes the following
+-command line options:
++command line options:
+
+
+
+-- -verbose
++
- -verbose
+ - Display messages about image sizes and formats and properties
+-of the stereogram being generated.
++of the stereogram being generated.
+
+-- -blackandwhite
++
- -blackandwhite
+ - Produce a single-image random-dot black-and-white stereogram.
+-This is the default.
++This is the default.
+
+-- -grayscale
+-
- Produce a single-image random-dot grayscale stereogram.
++
- -grayscale
-
++
- Produce a single-image random-dot grayscale stereogram.
+
+-- -color
+-
- Produce a single-image random-dot color stereogram.
++
- -color
++- Produce a single-image random-dot color stereogram.
+
+-- -maxval=value
++
- -maxval=value
+ - Designate the maximum value of each gray/color component, i.e.
+ the color resolution. Smaller values make the output image have
+ smaller numbers of unique grays/colors. If you don't specify
+ -maxval, pamstereogram uses the maxval of the input
+-image. This option has no effect with -blackandwhite.
++image. This option has no effect with -blackandwhite.
+
+-- -patfile=pamfile
++
- -patfile=pamfile
+ - Specify an image to use as a repeated background pattern for
+ the stereogram instead of a random-dot pattern. Intricate images
+ generally produce a crisper 3-D effect that simpler images. The
+@@ -126,9 +127,9 @@ grayscale or color) as the pattern file.
+ -patfile option along with -blackandwhite,
+ -grayscale, -color, or -maxval. The
+ -verbose option will give you information on the ideal
+-dimensions of the pattern file.
++dimensions of the pattern file.
+
+-- -xbegin=pixels
++
- -xbegin=pixels
+ - Specify the horizontal coordinate at which to begin stereogram generation.
+ The background pattern will be minimally distorted at this point and more
+ distorted at greater distances. Consider using this in conjunction
+@@ -136,38 +137,38 @@ with -xshift to align the horizon
+ horizontal start of stereogram generation. -xbegin is meaningful only
+ in conjunction with -patfile, -makemask, or -texfile,
+ and pamstereogram actually ignores it with respect to -texfile
+-(but may not in a future version of pamstereogram).
++(but may not in a future version of pamstereogram).
+
+-The default is to begin in the center.
++
The default is to begin in the center.
+
+-This option was new in Netpbm 10.71 (June 2015).
++
This option was new in Netpbm 10.71 (June 2015).
+
+-- -texfile=pamfile
++
- -texfile=pamfile
+ - Specify an image to use as the texture for a mapped-texture
+ stereogram. The idea is that the depth-map image provides the depth
+ values of the 3-D object/scene while the texture image provides the
+ true-color values. Consequently, the texture image should align with
+ the depth-map image. (Note that it's required to have the same
+ dimensions.) The texture image's background color is ignored when
+-blending colors.
++blending colors.
+
+-This option was new in Netpbm 10.53 (December 2010).
++
This option was new in Netpbm 10.53 (December 2010).
+
+
+-- -bgcolor=color
++
- -bgcolor=color
+ - Use color as the texture image's background color instead
+ of letting pamstereogram determine it automatically. Specify
+ the color as described for the
+ argument of the pnm_parsecolor() library
+ routine. The -bgcolor option is meaningful only in conjunction
+-with -texfile.
++with -texfile.
+
+-This option was new in Netpbm 10.53 (December 2010).
++
This option was new in Netpbm 10.53 (December 2010).
+
+
+-- -smoothing=pixels
++
- -smoothing=pixels
+ - When used without -texfile, attempt to eliminate artifacts
+-introduced by edges in the depth map if pixels is greater than zero.
++introduced by edges in the depth map if pixels is greater than zero.
+
+ When used with -texfile, horizontally blur non-background
+ colors into background pixels up to a distance of pixels pixels.
+@@ -176,22 +177,22 @@ by the stereogram's color constraints wh
+ stereogram. In this case, the -smoothing option is helpful
+ when the texture image includes smooth color transitions (as in a
+ photograph) but makes crisp texture images (as in a line drawing)
+-appear blurry.
++appear blurry.
+
+ This option was new in Netpbm 10.53 (December 2010). Before
+-Netpbm 10.61 (December 2012), it has no effect without -texfile.
++Netpbm 10.61 (December 2012), it has no effect without -texfile.
+
+
+-- -xshift=pixels
++
- -xshift=pixels
+ - Shift the pattern image (designated by -patfile) to the
+-right by pixels pixels (default: 0).
+-
+-This option is valid only along with -patfile.
++right by pixels pixels (default: 0).
++
++This option is valid only along with -patfile.
+
+-- -yshift pixels
++
- -yshift pixels
+ - Shift the pattern image (designated by -patfile)
+ downwards by pixels pixels (default: 0). This option is
+-valid only along with -patfile.
++valid only along with -patfile.
+
+ - -yfillshift pixels
+ - Shift the pattern image (designated by -patfile) downwards
+@@ -200,77 +201,77 @@ population of the pattern. (If used wit
+ shifts are summed.) A small -yfillshift helps reduce visual
+ artifacts in the 3-D image. Steer's website, referenced under
+ SEE ALSO, recommends a shift of approximately
+-1/16" (6–7 pixels at pamstereogram's default of 100 DPI).
++1/16" (6–7 pixels at pamstereogram's default of 100 DPI).
+
+-This option was new in Netpbm 10.94 (March 2021).
++
This option was new in Netpbm 10.94 (March 2021).
+
+-- -magnifypat=scale
++
- -magnifypat=scale
+ - Magnify each pixel in the pattern file or each random dot by
+ integral scaling factor scale. Note that
+ pamstereogram applies the pattern magnification
+ after pattern shifting (-xshift and
+--yshift).
++-yshift).
+
+-- -guidebottom
++
- -guidebottom
+ -
+ Draw a pair of black squares on a white background underneath the stereogram
+ proper. These squares help you guide your eyes into proper focus to view the
+ 3-D image. The trick is to focus your eyes some distance behind the image,
+ causing you to see four black squares, then continue altering your focus
+ distance until the middle two black squares fuse into a single black
+-square. At that point, a crisp, 3-D image will appear.
++square. At that point, a crisp, 3-D image will appear.
+
+ This option was new in Netpbm 10.61 (December 2012). Before that,
+ the presence of -guidesize, with a positive value, has the same
+-effect.
++effect.
+
+
+-- -guidetop
++
- -guidetop
+ -
+-Same as -guidebottom, except the guides go at the top of the image.
++Same as -guidebottom, except the guides go at the top of the image.
+
+ This option was new in Netpbm 10.61 (December 2012). Before that,
+ the presence of -guidesize, with a negative value, has the same
+-effect.
++effect.
+
+-- -guidesize=pixels
++
- -guidesize=pixels
+
+- - The size (width and height) of each guide box.
++
- The size (width and height) of each guide box.
+
+-This is valid only with -guidetop or -guidebottom.
++
This is valid only with -guidetop or -guidebottom.
+
+-Default is 20.
++
Default is 20.
+
+ Before Netpbm 10.61 (December 2012), if you don't specify this option,
+ pamstereogram draws no guides. If you specify it with a positive
+ value, pamstereogram behaves as if you specified -guidebottom
+ too, and if you specify it with a negative value, it behaves as if you
+ specified -guidetop and specified guidesize with the absolute
+-value of that negative value.
++value of that negative value.
+
+- - -dpi=resolution
++
- -dpi=resolution
+ - Specify the resolution of the output device in dots per inch.
+ The default is 100 DPI, which represents a fairly crisp screen
+-resolution.
++resolution.
+
+-Before Netpbm 10.53 (December 2010), the default was 96 DPI.
++
Before Netpbm 10.53 (December 2010), the default was 96 DPI.
+
+
+-- -crosseyed
++
- -crosseyed
+ - Invert the gray levels in the depth map (input image) so that the 3-D
+ image pops out of the page where it would otherwise sink into the page and
+ vice versa. Some people are unable to diverge their eyes and can only cross
+ them. The -crosseyed option enables such people to see the 3-D image as
+ intended. You can also specify the -crosseyed option if you prefer
+ using depth maps in which darker colors are closer to the eye and lighter
+-colors are farther from the eye.
++colors are farther from the eye.
+
+ Before Netpbm 10.53 (December 2010), pamstereogram used higher
+ (lighter) numbers for things closer to the eye without
+--crosseyed and vice versa.
++-crosseyed and vice versa.
+
+
+-- -makemask
++
- -makemask
+ - Instead of a stereogram, output a PAM mask image showing
+ coloring constraints. New pixels will be taken from the pattern
+ file where the mask is black. Copies of existing pixels will be
+@@ -278,30 +279,30 @@ taken from the pattern file where the ma
+ -makemask option can be used to help create more
+ sophisticated pattern files (to use with -patfile) Note that
+ -makemask ignores -magnifypat; it always produces
+-masks that assume a pattern magnification of 1.
++masks that assume a pattern magnification of 1.
+
+-- -eyesep=inches
++
- -eyesep=inches
+ - Specify the separation in inches between your eyes. The
+ default, 2.5 inches (6.4 cm), should be sufficient for most people
+-and probably doesn't need to be changed.
++and probably doesn't need to be changed.
+
+-- -depth=fraction
++
- -depth=fraction
+ - Specify the output image's depth of field. That is,
+ fraction represents the fractional distance of the near
+ plane from the far plane. Smaller numbers make the 3-D image easier
+ to perceive but flatter. Larger numbers make the 3-D image more
+ difficult to perceive but deeper. The default, 0.3333, generally
+-works fairly well.
++works fairly well.
+
+-- -planes=near_pixels,far_pixels
++
- -planes=near_pixels,far_pixels
+ - Explicitly specify the distance between repeated pixels in the near plane
+ and in the far plane. This is an alternative to
+ -eyesep and -depth. The following equalities hold:
+
+
+- - eyesep = 2 * far
++
- eyesep = 2 * far
+ - depth = 2 * (far − near) /
+- (2 * far − near)
++ (2 * far − near)
+
+
+ The number of distinct 3-D depths is far
+@@ -309,34 +310,35 @@ and in the far plane. This is an altern
+ and -depth are a more human-friendly way to specify stereoscopic
+ parameters (distance between eyes and tradeoff between perceptibility
+ and depth) while -planes is a more computer-centric way (pixel
+-distances in the resulting stereogram).
++distances in the resulting stereogram).
+
+-This option was new in Netpbm 10.59 (June 2012).
++
This option was new in Netpbm 10.59 (June 2012).
++
+
+
+-- -randomseed=integer
++
- -randomseed=integer
+ - Specify a seed to be used for the random number generator.
+ The default is to use a seed based on the time of day, to one second
+-granularity.
++granularity.
+
+ It is useful to specify the seed if you want to create reproducible
+ results. With the same random seed, you should get identical results
+-every time you run pamstereogram.
++every time you run pamstereogram.
+
+ This is irrelevant if you use a pattern file (-patfile
+ option), because there is no random element to pamstereogram's
+-behavior.
++behavior.
+
+-This option was new in Netpbm 10.32 (February 2006).
++
This option was new in Netpbm 10.32 (February 2006).
+
+-- -tileable
++
- -tileable
+
+ - Make the generated image horizontally tileable. This works by
+ blending a left-to-right rendering (the equivalent
+ of -xbegin=0) with a right-to-left rendering (the equivalent
+ of -xbegin=width−1).
+
+-
This option was new in Netpbm 10.91 (June 2020).
++
This option was new in Netpbm 10.91 (June 2020).
+
+
+
+@@ -345,21 +347,21 @@ of -xbegin=width−1).
+
+ The only parameter, infile, is the name of an input file
+ that is a depth map image. If you don't specify infile, the
+-input is from standard input.
++input is from standard input.
+
+ The input is a PAM image of depth 1. Each sample represents the
+ distance from the eye that the 3-D image at that location should
+-be. Lower (darker) numbers mean further from the eye.
++be. Lower (darker) numbers mean further from the eye.
+
+ NOTES
+
+ Input Images
+
+ pamstereogram pays no attention to the image's tuple type and
+-ignores all planes other than plane 0.
++ignores all planes other than plane 0.
+
+ Like any Netpbm program, pamstereogram will accept PNM
+-input as if it were the PAM equivalent.
++input as if it were the PAM equivalent.
+
+ Mapped-texture Stereograms
+
+@@ -367,12 +369,12 @@ input as if it were the PAM equivalent.
+ drawn with true colors. Unlike a SIRDS or tiled-image SIS, however,
+ the image portrayed by an MTS is apparent in normal 2-D viewing. It
+ appears repeated multiple times and overlapped with itself, but it is
+-not hidden.
++not hidden.
+
+ You create an MTS with pamstereogram by passing the filename
+ of a PAM "texture image" with a -texfile option. A
+ texture image portrays the same 3-D object as the depth-map image but
+-indicates the colors that the program should apply to the object.
++indicates the colors that the program should apply to the object.
+
+ pamstereogram ignores the texture image's background color when it
+ overlaps copies of the 3-D object. This prevents, for example, a bright-red
+@@ -382,32 +384,32 @@ object remains bright red. A consequenc
+ best when the objects in the texture image have a crisp outline. Smooth
+ transitions to the background color result in unwanted color artifacts around
+ edges because the program ignores only exact matches with the
+-background color.
++background color.
+
+ You should specify a larger-than-normal value for -eyesep
+ (and/or -dpi) when producing an MTS. Otherwise, the 3-D object will
+ repeat so many times that most colored pixels will overlap other colored
+-pixels, reducing the number of true-colored pixels that remain.
++pixels, reducing the number of true-colored pixels that remain.
+
+ An MTS can employ a background pattern (-patfile). In this
+ case, pamstereogram replaces background pixels with pattern pixels in
+-the final step of generating the image.
++the final step of generating the image.
+
+
+ Miscellaneous
+
+ A good initial test is to input an image consisting of a solid
+ shape of distance 0 within a large field of maximum distance (e.g., a
+-white square on a black background).
++white square on a black background).
+
+ With the default values for -dpi and -eyesep, pattern
+-images that are 128 pixels wide can tile seamlessly.
++images that are 128 pixels wide can tile seamlessly.
+
+
+ EXAMPLES
+
+ Generate a SIRDS out of small, brightly colored squares and
+-prepare it for display on an 87 DPI monitor:
++prepare it for display on an 87 DPI monitor:
+
+
+ pamstereogram depthmap.pam \
+@@ -439,21 +441,21 @@ speckles:
+
+ SEE ALSO
+
+-- pam
++
- pam
+
+-- pamsistoaglyph
++
- pamsistoaglyph
+
+-- ppm3d
++
- ppm3d
+
+ - Harold W. Thimbleby, Stuart Inglis, and Ian H. Witten.
+ Displaying 3D Images: Algorithms for Single Image Random Dot
+ Stereograms. In IEEE Computer, 27(10):38-48,
+ October 1994. DOI: 10.1109/2.318576.
++href="http://dx.doi.org/10.1109/2.318576">10.1109/2.318576.
+
+ - W. A. Steer.
+ Stereograms: Technical Details.
+-URL: http://www.techmind.org/stereo/stech.html.
++URL: http://www.techmind.org/stereo/stech.html.
+
+
+
+@@ -461,32 +463,32 @@ URL: AUTHOR
+-Copyright © 2006-2020 Scott Pakin, scott+pbm@pakin.org.
++
Copyright © 2006-2020 Scott Pakin, scott+pbm@pakin.org.
+
+ Table Of Contents
+
+-- SYNOPSIS
+-
- DESCRIPTION
+-
- OPTIONS
+-
- PARAMETERS
+-
- NOTES
++
- SYNOPSIS
++- DESCRIPTION
++- OPTIONS
++- PARAMETERS
++- NOTES
+
+- - Input Images
+-
- Mapped-texture Stereograms
+-
- Miscellaneous
++
- Input Images
++ - Mapped-texture Stereograms
++ - Miscellaneous
+
+-- EXAMPLES
+-
- SEE ALSO
+-
- HISTORY
+-
- AUTHOR
++
- EXAMPLES
++- SEE ALSO
++- HISTORY
++- AUTHOR
+
+
+
diff --git a/netpbm.spec b/netpbm.spec
index a730fa1..8c65173 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,6 +1,6 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 10.92.00
+Version: 10.93.00
Release: 1%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
@@ -230,6 +230,9 @@ popd
%doc userguide/*
%changelog
+* Mon Jan 25 2021 Josef Ridky - 10.93.00-1
+- New upstream release 10.93.00 (#1911159)
+
* Wed Oct 07 2020 Josef Ridky - 10.92.00-1
- New upstream release 10.92.00 (#1851753)
diff --git a/sources b/sources
index 3a7ec07..d5383d7 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-10.92.00.tar.xz) = 8737c7c644029fc256eb645a8dda3be6a9f2cf23c1634877f6bc6e7f5b5a453db5eae116a2dcde47e15dd3faf5816a01eb0185545d7acdabd475886924cb16c4
+SHA512 (netpbm-10.93.00.tar.xz) = 18ff08b1d3672d792dab78b69eb4ef1a9874266b1dfbf5801a53ca172c0dcbbae8d1269297a56e06ed45ccfdff6a6ae5399e60b4bafdcb9d2cb9de800e2bc07c
From 03a989cc4beadc7e51738a6170993c57e33d3853 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Tue, 26 Jan 2021 15:44:47 +0100
Subject: [PATCH 06/42] Update manfix patch
---
netpbm-manfix.patch | 499 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 499 insertions(+)
diff --git a/netpbm-manfix.patch b/netpbm-manfix.patch
index 82a06b0..c28beb4 100644
--- a/netpbm-manfix.patch
+++ b/netpbm-manfix.patch
@@ -1500,3 +1500,502 @@ diff -urNp a/userguide/pamstereogram.html b/userguide/pamstereogram.html
+diff -urNp a/userguide/pamhomography.html b/userguide/pamhomography.html
+--- a/userguide/pamhomography.html 2021-01-26 15:19:07.403345047 +0100
++++ b/userguide/pamhomography.html 2021-01-26 15:29:36.659652764 +0100
+@@ -9,7 +9,7 @@
+
+
+
+-pamhomography
++pamhomography
+
+ Updated: 03 January 2021
+
+@@ -29,7 +29,7 @@ Updated: 03 January 2021
+ [-mapfile=map_file]
+ [-view=coords]
+ [-fill=color]
+- [pam_file]
++ [pam_file]
+
+ You can abbreviate any option to its shortest unique prefix. You can use
+ two hyphens instead of one to delimit an option. You can separate an option
+@@ -42,7 +42,7 @@ from its value with whitespace instead o
+ of Netpbm.
+
+ pamhomography transforms a quadrilateral—not necessarily
+-rectangular—region of an image, producing a new image.
++rectangular—region of an image, producing a new image.
+
+ You can do any
+ affine image transformation: translation, reflection, scaling,
+@@ -111,9 +111,9 @@ quadrilateral.
+ This is the color with which the program fills all pixels that lie outside
+ of the target quadrilateral. Specify the color as described for the
+
+-argument of the pnm_parsecolor() library routine.
++argument of the pnm_parsecolor() library routine.
+
+-The default is black, and for images with a transparency plane, transparent.
++
The default is black, and for images with a transparency plane, transparent.
+
+
+ pamhomography's only parameter, pam_file, is the name of the + file containing the input image. If you don't specify pam_file, the +- image comes from Standard Input. ++ image comes from Standard Input.
+ + +pamhomography was new in Netpbm 10.94 (March 2021). ++
pamhomography was new in Netpbm 10.94 (March 2021).
+ + +Updated: 7 February 2010
++Updated: 07 February 2010
+ + -+ - Table Of Contentsavstopam - convert an AVS X image to a Netpbm image +
avstopam - convert an AVS X image to a Netpbm image
-+ --avstopam - [avsfile] +@@ -16,40 +17,40 @@ Updated: 07 February 2010
avsfile is the input file, which defaults to Standard Input. - Output is always on Standard Output. -@@ -30,26 +34,26 @@ Output is always on Standard Output. +-Output is always on Standard Output. ++Output is always on Standard Output.
+ +There are no command line options defined specifically
for avstopam, but it recognizes the options common to all
programs based on libnetpbm (See
@@ -48,8 +46,8 @@ index eb39766..d104518 100644
Copyright © 2010 Scott Pakin,
--scott+pbm@pakin.org.
-+scott+pbm@pakin.org.AUTHOR
This page, part of the Netpbm user's guide, describes FAX formats in relation to Netpbm facilities. - -+
The ITU (formerly CCITT) publishes standards for operation of fax machines (the idea is to provide a way to be sure that a fax machine is able to receive a fax sent by another). These standards incidentally specify graphics file -diff --git a/userguide/pampaintspill.html b/userguide/pampaintspill.html -index eeb1cac..e42db76 100644 ---- a/userguide/pampaintspill.html -+++ b/userguide/pampaintspill.html +diff -urNp a/userguide/libnetpbm_ug.html b/userguide/libnetpbm_ug.html +--- a/userguide/libnetpbm_ug.html 2021-06-02 12:56:59.584286425 +0200 ++++ b/userguide/libnetpbm_ug.html 2021-06-02 14:36:35.392293125 +0200 +@@ -374,7 +374,7 @@ plain format. +
The Libnetpbm Netpbm Image +-Processing Manual describes the the libnetpbm functions for ++Processing Manual describes the libnetpbm functions for + processing image data. + +
The Libnetpbm Utility Manual +diff -urNp a/userguide/pamfunc.html b/userguide/pamfunc.html +--- a/userguide/pamfunc.html 2021-06-02 12:56:59.585286434 +0200 ++++ b/userguide/pamfunc.html 2021-06-02 14:40:09.474375441 +0200 +@@ -60,7 +60,7 @@ output image. + and bit string (such as and with 01001000). For the arithmetic functions, the + function arguments and results are the fraction that a sample is of the + maxval, i.e. normal interpretation of PAM tuples. But for the bit string +-functions, the value is the the bit string whose value as a binary cipher is ++functions, the value is the bit string whose value as a binary cipher is + the sample value, and the maxval indicates the width of the bit string. + +
pammixmulti - blend together multiple PAM images ++
pammixmulti - blend together multiple PAM images
+ + +Minimum unique abbreviation of an option is acceptable. You can use a + single hyphen instead of double hyphens to denote options. You can use white + space in place of the equals sign to separate an option name from its +-value. ++value.
+ + +This file is part of Netpbm. ++
This file is part of Netpbm.
+ +pammixmulti mixes two or more images to produce a new image. The +-program provides multiple ways to interpret "mix." ++program provides multiple ways to interpret "mix."
+ + +In addition to the options common to all programs based on libnetpbm + (most notably -quiet, see + Common Options), pammixmulti recognizes the following +-command line options: ++command line options:
+ +mask, each pixel in the output is produced by a
+ weighted average of the corresponding pixels from all the input images based
+-on the grayscale level of an additional mask image.
++on the grayscale level of an additional mask image.
+
+
+ Use this to ensure you get the same image on separate invocations. ++
Use this to ensure you get the same image on separate invocations.
+ +You supply the names of the files to mix as non-option arguments. ++
You supply the names of the files to mix as non-option arguments.
+ + +Average a bunch of PPM images to produce a new PAM image: ++
Average a bunch of PPM images to produce a new PAM image:
+
+ pammixmulti input*.ppm >output.ppm
+
+
+ Mix these same images by taking each pixel from a randomly selected input +-image: ++image:
+ +
+ pammixmulti --blend=random input*.ppm >output.ppm
+
+
+ Use a mask image to control the fading among input images on a +-pixel-by-pixel basis: ++pixel-by-pixel basis:
+ +
+ pammixmulti --blend=mask --maskfile=mask.pgm >output.pam \
+ one.pam two.pam three.pam four.pam
+
+
+-Do the same but with more abrupt transitions: ++
Do the same but with more abrupt transitions:
+ +
+ pammixmulti --blend=mask --maskfile=mask.pgm --stdev=0.0 >output.pam \
+ one.pam two.pam three.pam four.pam
+
+
+-and now with more gradual transitions: ++
and now with more gradual transitions:
+ +
+ pammixmulti --blend=mask --maskfile=mask.pgm --stdev=1.0 >output.pam \
+@@ -133,12 +133,12 @@ pixel-by-pixel basis:
+
+ HISTORY
+
+-pammixmulti was new in Netpbm 10.85 (December 2018).
++
pammixmulti was new in Netpbm 10.85 (December 2018).
+
+
+ AUTHOR
+
+-Copyright 2018 Scott Pakin, scott+pbm@pakin.org.
++
Copyright 2018 Scott Pakin, scott+pbm@pakin.org.
+
+ SEE ALSO
+
+@@ -146,20 +146,20 @@ pixel-by-pixel basis:
+ ppmmix,
+ pamarith,
+ pnm,
+-pam
++pam
+
+
+ Table Of Contents
+
+
+-- SYNOPSIS
+-
- DESCRIPTION
+-
- OPTIONS
+-
- ARGUMENTS
+-
- EXAMPLES
+-
- HISTORY
+-
- AUTHOR
+-
- SEE ALSO
++
- SYNOPSIS
++- DESCRIPTION
++- OPTIONS
++- ARGUMENTS
++- EXAMPLES
++- HISTORY
++- AUTHOR
++- SEE ALSO
+
+
+
+diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
+--- a/userguide/pampaintspill.html 2021-06-02 12:56:59.575286342 +0200
++++ b/userguide/pampaintspill.html 2021-06-02 15:06:31.354767352 +0200
@@ -2,12 +2,12 @@
Pampaintspill User Manual
pampaintspill
--Updated: 09 February 2020
-+Updated: 09 February 2020
+-Updated: 06 March 2021
++
Updated: 06 March 2021
-Table Of Contents
+Table Of Contents
@@ -122,12 +296,13 @@ index eeb1cac..e42db76 100644
SYNOPSIS
-@@ -16,31 +16,31 @@ pampaintspill - smoothly spill colors into the background
- [--bgcolor=color]
+@@ -17,17 +17,17 @@ pampaintspill - smoothly spill colors in
[--wrap] [--all]
[--downsample=number]
--[--power=number] [filename]
-+[--power=number] [filename]
+ [--power=number] [filename]
+-[-randomseed=integer]
++[-randomseed=integer]
+
Minimum unique abbreviations of option are acceptable. You may use
double hyphens instead of single hyphen to denote options. You may use
@@ -142,11 +317,7 @@ index eeb1cac..e42db76 100644
pampaintspill produces a smooth color gradient from all of the
non-background-colored pixels in an input image, effectively "spilling
- paint" onto the background. pampaintspill is similar to
--pamgradient but differs in the following characteristics:
-+pamgradient but differs in the following characteristics:
-
-
+@@ -38,27 +38,27 @@ paint" onto the background. pampaint
- pampaintspill accepts any number of paint
sources (non-background-colored pixels), which can lie anywhere
on the canvas. pamgradient accepts exactly
@@ -160,7 +331,9 @@ index eeb1cac..e42db76 100644
- pampaintspill can produce tileable output and
can control how tightly the gradient colors bind to their source
-@@ -49,14 +49,14 @@ paint" onto the background. pampaintspill is similar to
+- pixels.
++ pixels.
+
Results are generally best when the input image contains just a few, crisp
spots of color. Use your drawing program's pencil tool — as opposed to a
@@ -177,40 +350,91 @@ index eeb1cac..e42db76 100644
- --bgcolor=color
-diff --git a/userguide/pamrecolor.html b/userguide/pamrecolor.html
-index 3f341d4..a5f2671 100644
---- a/userguide/pamrecolor.html
-+++ b/userguide/pamrecolor.html
-@@ -2,12 +2,15 @@
+@@ -107,42 +107,42 @@ command line options:
+ - This is the seed for the random number generator that generates the
+ pixels.
+
+-
Use this to ensure you get the same image on separate invocations.
++
Use this to ensure you get the same image on separate invocations.
+
+- This option was new in Netpbm 10.94 (March 2021).
++
This option was new in Netpbm 10.94 (March 2021).
+
+
+
+ SEE ALSO
+
+
+-- pamgradient
+-
- ppmmake,
+-
- ppmrainbow,
+-
- pgmramp,
+-
- ppmpat,
+-
- pam
++
- pamgradient
++- ppmmake,
++- ppmrainbow,
++- pgmramp,
++- ppmpat,
++- pam
+
+
+ HISTORY
+
+-pampaintspill was new in Netpbm 10.50 (March 2010).
++
pampaintspill was new in Netpbm 10.50 (March 2010).
+
+
+ COPYRIGHT
+
+ Copyright © 2010 Scott Pakin,
+-scott+pbm@pakin.org.
++scott+pbm@pakin.org.
+
+ Table Of Contents
+
+
+-- SYNOPSIS
+-
- DESCRIPTION
+-
- OPTIONS
+-
- SEE ALSO
+-
- HISTORY
+-
- COPYRIGHT
++
- SYNOPSIS
++- DESCRIPTION
++- OPTIONS
++- SEE ALSO
++- HISTORY
++- COPYRIGHT
+
+
+
+diff -urNp a/userguide/pamrecolor.html b/userguide/pamrecolor.html
+--- a/userguide/pamrecolor.html 2021-06-02 12:56:59.574286333 +0200
++++ b/userguide/pamrecolor.html 2021-06-02 15:09:53.837724488 +0200
+@@ -2,9 +2,9 @@
Pamrecolor User Manual
pamrecolor
-Updated: 31 July 2010
--
++Updated: 31 July 2010
+
-Table Of Contents
++Table Of Contents
--NAME
--pamrecolor - alter colors without affecting luminance
-+Updated: 31 July 2010
-+
-+
-+
-+
-+NAME
-+
-+pamrecolor - alter colors without affecting luminance
-
- SYNOPSIS
-
-@@ -22,6 +25,7 @@ pamrecolor - alter colors without affecting luminance
+ NAME
+ pamrecolor - alter colors without affecting luminance
+@@ -22,15 +22,15 @@ pamrecolor - alter colors without affect
[-randomseed=integer]
[infile]
+-
+
-
Minimum unique abbreviation of option is acceptable. You may use double
-@@ -30,7 +34,7 @@ space in place of the equals sign to separate an option name from its value.
+ hyphens instead of single hyphen to denote options. You may use white
+-space in place of the equals sign to separate an option name from its value.
++space in place of the equals sign to separate an option name from its value.
DESCRIPTION
@@ -219,16 +443,19 @@ index 3f341d4..a5f2671 100644
pamrecolor changes an image's colors to be as close as
possible to given target colors but with the constraint that the
-@@ -39,7 +43,7 @@ image will look identical if both are converted to grayscale
+@@ -39,17 +39,17 @@ image will look identical if both are co
(e.g. with
ppmtopgm). You can have pamrecolor select
target colors randomly, specify a single hue for the entire image, or take the
-target colors from a target image.
+target colors from a target image.
- pamrecolor works on pseudo-Netpbm images based on arbitrary
- color spaces. You can define the color space explicitly or choose one
-@@ -49,7 +53,7 @@ of many that pamrecolor knows by name.
+
In addition to real Netpbm images, pamrecolor works on pseudo-Netpbm
+ images based on arbitrary color spaces. You can define the color space
+-explicitly or choose one of many that pamrecolor knows by name.
++explicitly or choose one of many that pamrecolor knows by name.
+
+ The output is a PAM image on standard output. Options control the
exact format of the PAM. If you want a PNM (PBM, PGM, or PPM) image,
use pamtopnm on the output. There is no
need to convert if you will use the image as input to a current Netpbm
@@ -237,7 +464,7 @@ index 3f341d4..a5f2671 100644
OPTIONS
-@@ -57,7 +61,7 @@ program, but many other programs don't know what a PAM is.
+@@ -57,7 +57,7 @@ program, but many other programs don't k
In addition to the options common to all programs based on libnetpbm
(most notably -quiet, see
Common Options), pamrecolor recognizes the following
@@ -246,7 +473,19 @@ index 3f341d4..a5f2671 100644
-@@ -109,12 +113,12 @@ the format that uses sRGB.
+@@ -76,9 +76,9 @@ the raster have different meaning. Many
+ images actually use a variation with a different color space. For example,
+ GIMP uses sRGB internally and if you
+ have GIMP generate a Netpbm image file, it really generates a variation of
+-the format that uses sRGB.
++the format that uses sRGB.
+
+-pamrecolor knows the following color spaces (name values):
++
pamrecolor knows the following color spaces (name values):
+
+
+ - adobe
+@@ -109,7 +109,7 @@ the format that uses sRGB.
The default is "ntsc" because this is the color space that the Netpbm
formats and many graphics utilities use. As a counterexample,
GIMP uses sRGB as its native color
@@ -255,1747 +494,1346 @@ index 3f341d4..a5f2671 100644
The luminance values pamrecolor uses for each of the above come from
Bruce Lindbloom's
-
--Computing RGB-to-XYZ and XYZ-to-RGB matrices page.
-+Computing RGB-to-XYZ and XYZ-to-RGB matrices page.
-
- - --rmult=fraction
- - --gmult=fraction
-@@ -137,7 +141,7 @@ library routine (e.g., "hotpink" or "#ff69b4").
-
- If you specify neither --targetcolor nor
- --colorfile, pamrecolor will randomly select a target color for
--each pixel of the input image.
-+each pixel of the input image.
-
- You may not specify both -targetcolor and -colorfile.
-
-@@ -154,7 +158,7 @@ image to be repeated in a tile pattern.
-
-
If you specify neither --targetcolor nor
- --colorfile, pamrecolor will randomly select a target color for
--each pixel of the input image.
-+each pixel of the input image.
-
- You may not specify both -targetcolor and -colorfile.
-
-@@ -176,23 +180,23 @@ invocations.
-
-
EXAMPLES
-
--This command tints an image yellow:
-+
This command tints an image yellow:
-
-
-- pamrecolor --targetcolor=yellow colorpic.pam > yellowpic.pam
-+ pamrecolor --targetcolor=yellow colorpic.pam > yellowpic.pam
-
-
- This command takes the colors from colorpicture.ppm and applies
--them to graypicture.pgm:
-+them to graypicture.pgm:
-
-
-- pamrecolor --colorfile=colorpic.ppm graypic.pgm > colorizedpic.pam
-+ pamrecolor --colorfile=colorpic.ppm graypic.pgm > colorizedpic.pam
-
-
- The grayscale version of colorizedpic.pam will look just like
- graypic.pgm. Note that if you use a non-Netpbm tool to do the conversion to
- grayscale, you may additionally need to specify an
--appropriate --colorspace value for your conversion tool.
-+appropriate --colorspace value for your conversion tool.
-
-
- NOTES
-@@ -203,25 +207,25 @@ appropriate --colorspace value for your conversion tool.
-
- - Specify a color file that is identical to the input image but with
- some large, colored text added to it. The text will "magically"
--vanish when the image is converted to grayscale.
-+vanish when the image is converted to grayscale.
-
- - Provide a low-contrast grayscale image — perhaps a secret
- message written in similar shades of gray — as the input file and
- a colorful but completely different image as the color file. If done
- carefully, the grayscale image can be hidden by the colorful image.
- Only people who know to convert the result to grayscale can recover
--the original grayscale image.
-+the original grayscale image.
-
- - Use --targetcolor=tan to make an image look like an
- old-timey photograph (or, more precisely, a
- sepia-toned
--photograph of the late 1800s).
-+photograph of the late 1800s).
-
-
-
- HISTORY
-
--Scott Pakin wrote pamrecolor in July 2010.
-+
Scott Pakin wrote pamrecolor in July 2010.
-
- pamrecolor was new in Netpbm 10.52 (September 2010).
-
-@@ -229,7 +233,7 @@ photograph of the late 1800s).
-
AUTHOR
-
- Copyright (C) 2010 Scott
--Pakin, scott+pbm@pakin.org.
-+Pakin, scott+pbm@pakin.org.
-
-
- SEE ALSO
-@@ -246,14 +250,14 @@ Pakin, scott+pbm@pakin.org.
- Table Of Contents
-
-
--- SYNOPSIS
--
- DESCRIPTION
--
- OPTIONS
--
- EXAMPLES
--
- NOTES
--
- HISTORY
--
- AUTHOR
--
- SEE ALSO
-+
- SYNOPSIS
-+- DESCRIPTION
-+- OPTIONS
-+- EXAMPLES
-+- NOTES
-+- HISTORY
-+- AUTHOR
-+- SEE ALSO
-
-
-
-diff --git a/userguide/pamsistoaglyph.html b/userguide/pamsistoaglyph.html
-index 1ca53ac..e545986 100644
---- a/userguide/pamsistoaglyph.html
-+++ b/userguide/pamsistoaglyph.html
-@@ -1,15 +1,18 @@
-
- Pamsistoaglyph User Manual
-
-+
- pamsistoaglyph
--Updated: 05 April 2009
--
--Table Of Contents
-+
-+Updated: 5 April 2009
-+
-+
-+
-
- NAME
-
--pamsistoaglyph - convert a single-image stereogram to a red/cyan
--anaglyphic image
-+pamsistoaglyph - convert a single-image stereogram to a red/cyan
-+anaglyphic image
-
-
- SYNOPSIS
-@@ -20,11 +23,11 @@ anaglyphic image
- [--minsep=number]
- [--gray=number]
- [in_netpbmfile
--
-+
-
- All options can be abbreviated to their shortest unique prefix. You
- may use either white space or an equals sign between an option name
--and its value.
-+and its value.
-
-
- DESCRIPTION
-@@ -32,7 +35,7 @@ and its value.
- This program is part of Netpbm.
-
-
pamsistoaglyph reads a Netpbm image as input and
--produces a Netpbm image as output.
-+produces a Netpbm image as output.
-
- pamsistoaglyph takes a single-image stereogram
- (SIS) such as those produced by pamsistoaglyph is to help people who have trouble
--viewing single-image stereograms see the intriguing 3-D effect.
-+viewing single-image stereograms see the intriguing 3-D effect.
-
- pamsistoaglyph can convert single-image random-dot
- stereograms (SIRDS), wallpaper stereograms, and even dual-image
--stereograms to anaglyphic images.
-+stereograms to anaglyphic images.
-
-
- OPTIONS
-@@ -57,13 +60,13 @@ stereograms to anaglyphic images.
+diff -urNp a/userguide/pbmtog3.html b/userguide/pbmtog3.html
+--- a/userguide/pbmtog3.html 2021-06-02 12:56:59.585286434 +0200
++++ b/userguide/pbmtog3.html 2021-06-02 14:44:07.715692749 +0200
+@@ -36,7 +36,7 @@ use those encodings.
In addition to the options common to all programs based on libnetpbm
(most notably -quiet, see
- Common Options), pamsistoaglyph recognizes the following
+ Common Options), pbmtog3 recognizes the following
-command line options:
+command line options:
- For most images, no command-line options need to be specified. The
--following options are available, however, for unusual circumstances.
-+following options are available, however, for unusual circumstances.
-
--- --invert
-+
- --invert
- - Swap the left- and right-eye
- images. pamsistoaglyph assumes that its input
- represents a wall-eyed stereogram and generates the anaglyphic
-@@ -71,17 +74,17 @@ following options are available, however, for unusual circumstances.
- the page where it should pop out of the page (and vice versa),
- this typically implies that the input image represents a
- cross-eyed stereogram. Use --invert to correct
-- the image depth.
-+ the image depth.
-
--- --sep=number
-+
- --sep=number
- - Specify the distance in pixels between the left- and right-eye
- images. Essentially, this corresponds to the distance between
- repetitions of the background pattern. The --sep
- option should rarely be necessary
- as pamsistoaglyph is fairly good at determining
-- automatically the eye-separation distance.
-+ automatically the eye-separation distance.
-
--- --minsep=number
-+
- --minsep=number
- - This option is similar to --sep but
- constrains pamsistoaglyph only to
- a minimum eye-separation distance. Any distance larger
-@@ -90,9 +93,9 @@ following options are available, however, for unusual circumstances.
- as pamsistoaglyph is fairly good at determining
- automatically the eye-separation distance. The default value for
- the minimum eye-separation distance is 10% of the image width;
-- this value seems to work well in practice.
-+ this value seems to work well in practice.
-
--- --gray=number
-+
- --gray=number
- - Limit the number of gray levels to use when searching for the
- optimal eye-separation
- distance. Because pamsistoaglyph looks for
-@@ -103,7 +106,7 @@ following options are available, however, for unusual circumstances.
- unintentional color variations (such as those caused by conversion
- from a low-quality JPEG image, for example). The default of 63
- seems to work well so the --gray option should
-- rarely be necessary.
-+ rarely be necessary.
-
-
-
-@@ -112,22 +115,22 @@ following options are available, however, for unusual circumstances.
- The registration algorithm used by pamsistoaglyph
- was developed specifically for this program. As far as the author
- knows, there are no existing algorithms for converting stereograms to
--anaglyphs. The algorithm works as follows:
-+anaglyphs. The algorithm works as follows:
-
-
- - Convert the image to grayscale to increase the ability to identify
-- matches.
-+ matches.
-
- - Count the number of pixels that match N pixels ahead in the
-- image for all N in [1, width/2].
-+ image for all N in [1, width/2].
-
- - Maintain a running mean (μ) and standard deviation (σ) of
-- the number of matched pixels.
-+ the number of matched pixels.
-
- - Store the N corresponding to each spike in the number of
- matched pixels. A spike is defined as a tally that exceeds the
- mean plus one, two, or three standard deviations. Only the first
-- spike of a given standard-deviation multiplier is stored.
-+ spike of a given standard-deviation multiplier is stored.
-
- - If a tally greater than μ+3σ was encountered, return the
- corresponding N. If not, then if a tally greater than
-@@ -138,13 +141,13 @@ anaglyphs. The algorithm works as follows:
- produces the minimum average distance between matched pixels
- (i.e., #matches divided by #pixels). If no
- such N exceeds the minimum allowable eye-separation value,
-- return zero to indicate failure.
-+ return zero to indicate failure.
-
- - If the algorithm returned zero, rerun the algorithm independently
- on each row of the input image and return the median of
- all N that exceed the minimum allowable eye-separation
- value. If no such N exists, abort with an error
-- message.
-+ message.
-
-
- HISTORY
-@@ -156,7 +159,7 @@ in Netpbm in Release 10.47 (June 2009).
- AUTHOR
-
- Copyright (C) 2009 Scott
--Pakin, scott+pbm@pakin.org.
-+Pakin, scott+pbm@pakin.org.
-
-
- SEE ALSO
-@@ -174,13 +177,13 @@ Pakin, scott+pbm@pakin.org.
- Table Of Contents
-
-
--- SYNOPSIS
--
- DESCRIPTION
--
- OPTIONS
--
- NOTES
--
- HISTORY
--
- AUTHOR
--
- SEE ALSO
-+
- SYNOPSIS
-+- DESCRIPTION
-+- OPTIONS
-+- NOTES
-+- HISTORY
-+- AUTHOR
-+- SEE ALSO
-
-
-
-diff --git a/userguide/pamtoavs.html b/userguide/pamtoavs.html
-index 5d0ae35..bee1a40 100644
---- a/userguide/pamtoavs.html
-+++ b/userguide/pamtoavs.html
-@@ -2,13 +2,15 @@
- Pamtoavs User Manual
-
- pamtoavs
--Updated: 07 February 2010
--
--Table Of Contents
-+
-+Updated: 7 February 2010
-+
-+
-+
-
- NAME
-
--pamtoavs - convert a Netpbm image to an AVS X image
-+
pamtoavs - convert a Netpbm image to an AVS X image
-
- SYNOPSIS
-
-@@ -17,7 +19,7 @@ Updated: 07 February 2010
-
- DESCRIPTION
-
--This program is part of Netpbm.
-+
This program is part of Netpbm.
-
- pamtoavs reads a Netpbm image as input and produces a Stardent
- AVS
-@@ -27,14 +29,14 @@ href="http://www.gnuplot.info/">Gnuplot v4.2 and later can use.
-
netpbmfile is the input file, which defaults to Standard Input.
- Output is always on Standard Output.
-
--
Try the following:
-+
Try the following:
-
-
- gnuplot> plot 'myimage.avs' binary filetype=avs with rgbimage
-
-
- See the Gnuplot
--manual for more information.
-+manual for more information.
-
-
- OPTIONS
-@@ -42,29 +44,29 @@ manual for more information.
- There are no command line options defined specifically
- for pamtoavs, but it recognizes the options common to all
- programs based on libnetpbm (See
--Common Options.)
-+Common Options.)
-
- AUTHOR
-
- Copyright © 2010 Scott Pakin,
--scott+pbm@pakin.org.
-+scott+pbm@pakin.org.
-
- SEE ALSO
-
- avstopam,
- gnuplot,
--pam
-+pam
-
-
-
- Table Of Contents
-
-
--- SYNOPSIS
--
- DESCRIPTION
--
- OPTIONS
--
- AUTHOR
--
- SEE ALSO
-+
- SYNOPSIS
-+- DESCRIPTION
-+- OPTIONS
-+- AUTHOR
-+- SEE ALSO
-
-
-
-diff --git a/userguide/pamtooctaveimg.html b/userguide/pamtooctaveimg.html
-index 4e09e8e..d2cc50b 100644
---- a/userguide/pamtooctaveimg.html
-+++ b/userguide/pamtooctaveimg.html
-@@ -2,13 +2,13 @@
- Pamtooctaveimg User Manual
-
- pamtooctaveimg
--
--Updated: 27 June 2007
--Table Of Contents
-+
-+
Updated: 27 June 2007
-+Table Of Contents
-
- NAME
-
--pamtooctaveimg - convert a Netpbm image to a GNU Octave image
-+
pamtooctaveimg - convert a Netpbm image to a GNU Octave image
-
- SYNOPSIS
-
-@@ -17,7 +17,7 @@
-
- DESCRIPTION
-
--This program is part of Netpbm.
-+
This program is part of Netpbm.
-
- pamtooctaveimg reads a Netpbm image as input and produces a GNU Octave image file as output.
-@@ -45,7 +45,7 @@ Image Processing chapter of the GNU Octave manual for details.
-
There are no command line options defined specifically
- for pamtooctaveimg, but it recognizes the options common to all
- programs based on libnetpbm (See
--Common Options.)
-+Common Options.)
-
- ARGUMENTS
-
-@@ -77,7 +77,8 @@ specify netpbmfile, the input is from Standard Input.
- NOTES
-
- There is no octavetopam program. However, GNU Octave's
--saveimage command can save images in PPM format.
-+saveimage command can save images in PPM format.
-+
-
+ - -reversebits
+@@ -80,7 +80,7 @@ You cannot specify both.
HISTORY
-@@ -86,7 +87,7 @@ specify netpbmfile, the input is from Standard Input.
- AUTHOR
+ Before Netpbm 10.79 (June 2017), there was a different program by the same
+-name in Netpbm, which was written by by Paul Haeberli
++name in Netpbm, which was written by Paul Haeberli
+ <paul@manray.sgi.com> in 1989
+ and then modified extensively by others.
-
Copyright (C) 2007 Scott Pakin,
--scott+pbm@pakin.org.
-+scott+pbm@pakin.org.
-
- SEE ALSO
-
-@@ -98,15 +99,15 @@ href="http://www.gnu.org/software/octave/doc/interpreter/index.html">octave
-
- Table Of Contents
-
--- SYNOPSIS
--
- DESCRIPTION
--
- OPTIONS
--
- ARGUMENTS
--
- EXAMPLES
--
- NOTES
--
- HISTORY
--
- AUTHOR
--
- SEE ALSO
-+
- SYNOPSIS
-+- DESCRIPTION
-+- OPTIONS
-+- ARGUMENTS
-+- EXAMPLES
-+- NOTES
-+- HISTORY
-+- AUTHOR
-+- SEE ALSO
-
-
-
-diff --git a/userguide/pnmflip.html b/userguide/pnmflip.html
-index 2bd7368..8a1916e 100644
---- a/userguide/pnmflip.html
-+++ b/userguide/pnmflip.html
-@@ -5,17 +5,18 @@
-
- NAME
-
--pnmflip - replaced by pamflip
-+pnmflip - replaced by pamflip
-
- DESCRIPTION
-
--This program is part of Netpbm.
-+
This program is part of Netpbm.
-
- pnmflip was replaced in Netpbm 10.13 (December 2002) by
- pamflip.
-
-+
DESCRIPTION
- pamflip is mostly backward compatible with pnmflip,
--but works on PAM images too.
-+but works on PAM images too.
-
- One way pamflip is not backward compatible with pnmflip
- is that pnmflip lets you specify any number of basic flip options,
-@@ -23,12 +24,12 @@ whereas pamflip requires exactly one. (pamflip provides
- the -xform option for requesting multiple transformations, though).
- Because of this incompatibility, pnmflip still exists as a
- separate program, and all it does is translate its options to pamflip
--style and run pamflip.
-+style and run pamflip.
-
- You should not make any new use of pnmflip and if you modify an
- existing use, you should upgrade to pamflip. But note that if you
- write a program that might have to be used with very old
--Netpbm, pnmflip is the only way to do that.
-+Netpbm, pnmflip is the only way to do that.
-
-
-
-diff --git a/userguide/pnmmercator.html b/userguide/pnmmercator.html
-index 998f7fb..65576ac 100644
---- a/userguide/pnmmercator.html
-+++ b/userguide/pnmmercator.html
-@@ -18,11 +18,12 @@ projection and vice-versa
- [filename]
-
- Minimum unique abbreviation of option is acceptable.
--You may use double hyphens instead of single hyphen to denote options.
-+You may use double hyphens instead of single hyphen to denote options.
-
- DESCRIPTION
-
--This program is part of Netpbm.
-+
This program is part of Netpbm.
-
- The pnmmercator utility, converts a rectangular projection worldmap
- to a Mercator projection format, as used for maps.google.com and many other
-@@ -31,34 +32,34 @@ online maps. The map used as input for pnmmercator must have rows for
- file will typically be twice as wide as high, but this is not a
- requirement. The output file will be using the Mercator
--projection and will get double the height of the input file.
-+projection and will get double the height of the input file.
-
- Maps using the Mercator projection are stretched more the closer a row is
- to the North or South Pole. The last few degrees (> 85 or < -85 degrees)
- are not part of a Mercator map at all because they would be stretched too much
- and the rows close to the edge will show banding, because they originate from
--the same row in the original map.
-+the same row in the original map.
-
- To overcome this, the program will by default do interpolation of pixel
- colors, which will eliminate the banding effect, but will cause some blurring
- of the output. With the -nomix option, this interpolation of colors isn't
- applied. You can obtain the highest quality output by starting with an input
- map of high resolution, so that you can follow the pnmmercator
--transformation with a pamscale reduction in size.
-+transformation with a pamscale reduction in size.
-
- This program can also convert a Mercator projection map back to a
- rectangular projection based. As said, the Mercator map doesn't have
- information about the latitudes close to the poles. Therefore the top rows in
- the output image will be identical and copied from the row corresponding with
--latitude of 85 degrees. The same at the bottom of the map.
-+latitude of 85 degrees. The same at the bottom of the map.
-
- Pnmmercator doesn't have any provision for scaling the image. You can scale
- by piping the output of the program through Netpbm programs such as
--pamscale.
-+pamscale.
-
- You can find maps to be used as input at flatplanet.sourceforge.net
--or uic.edu/pape.
-+or uic.edu/pape.
-
- The point of a Mercator projection map is that compass directions work on
- it. If you draw a straight line northeast from some point on the Mercator
-@@ -78,33 +79,33 @@ proportional to angular longitude.
-
PARAMETERS
-
- filename is the name of the input file. If you don't specify
--this, pnmmercator reads the image from standard Input.
-+this, pnmmercator reads the image from standard Input.
-
- OPTIONS
-
- In addition to the options common to all programs based on libnetpbm
- (most notably -quiet, see
- Common Options), pnmmercator recognizes the following
--command line options:
-+command line options:
-
-
- - -inverse
- -
-
With this option a conversion from Mercator to degrees is applied.The
--output image will have half the height of the input map.
-+output image will have half the height of the input map.
-
- - -nomix
- -
-
Default behaviour is that color blending is applied in between two adjacent
- rows. If you specify the -nomix parameter there is no blending. The
- consequence is a banding at the top and bottom of the map. With this option,
--the output map will also consist of exactly the same colors as the input.
-+the output map will also consist of exactly the same colors as the input.
-
- - -verbose and -vverbose
- -
-
This parameter outputs some additional information. If you double the 'v',
- it will output debug data about the lat/long degree and Mercator
--conversions.
-+conversions.
-
-
-
-@@ -114,25 +115,26 @@ conversions.
- ppmglobe
-
- HISTORY
--pnmmercator was new in Netpbm 10.49 (December 2009).
-+
pnmmercator was new in Netpbm 10.49 (December 2009).
-
- AUTHORS
-
- Willem van Schaik (of
- pnmtopng/pngtopnm fame) wrote this program in October 2009 and
--suggested it for inclusion in Netpbm.
-+suggested it for inclusion in Netpbm.
-
-
-
- Table Of Contents
-
- - SYNOPSIS
--
- DESCRIPTION
--
- PARAMETERS
--
- OPTIONS
--
- SEE ALSO
--
- HISTORY
--
- AUTHORS
-+
- DESCRIPTION
-+
- PARAMETERS
-+
- OPTIONS
-+
- SEE ALSO
-+
- HISTORY
-+
- AUTHORS
-+
-
-
-
-diff --git a/userguide/ppmtogif.html b/userguide/ppmtogif.html
-index 513133a..fa72e09 100644
---- a/userguide/ppmtogif.html
-+++ b/userguide/ppmtogif.html
-@@ -5,17 +5,16 @@
+diff -urNp a/userguide/ppmtogif.html b/userguide/ppmtogif.html
+--- a/userguide/ppmtogif.html 2021-06-02 12:56:59.574286333 +0200
++++ b/userguide/ppmtogif.html 2021-06-02 15:48:19.167930575 +0200
+@@ -5,17 +5,17 @@
NAME
-ppmtogif - replaced by pamtogif
-
-DESCRIPTION
--
--This program is part of Netpbm.
+
ppmtogif - replaced by pamtogif
-+This program is part of Netpbm.
- ppmtogif was replaced in Netpbm 10.37 (December 2006) by
--pamtogif.
-+pamtogif.
+ This program is part of Netpbm.
+
SYNOPSIS
+ ppmtogif was replaced in Netpbm 10.37 (December 2006) by
+ pamtogif.
+
pamtogif is mostly backward compatible with ppmtogif.
+
DESCRIPTION
One way pamtogif is not backward compatible with ppmtogif
is that to specify a transparency (alpha) mask with ppmtogif, you
supply the transparency as a separate pseudo-PGM image and use the
-@@ -77,8 +76,8 @@ the alpha image need not have the same maxval as the input.
- ppmtogif interprets the alpha file using the alpha file's
- maxval.
-
--
You cannot specify both -transparent and -alpha.
-+
You cannot specify both -transparent and -alpha.
-
-
--
--
-+
-+
-diff -urNp a/userguide/pamstereogram.html b/userguide/pamstereogram.html
---- a/userguide/pamstereogram.html 2021-01-26 13:41:35.057401508 +0100
-+++ b/userguide/pamstereogram.html 2021-01-26 14:23:22.076294594 +0100
-@@ -9,7 +9,8 @@
-
- NAME
-
--pamstereogram - create a single-image stereogram from a PAM depth map
-+pamstereogram - create a single-image stereogram from a PAM
-+depth map
-
- SYNOPSIS
-
-@@ -39,13 +40,13 @@ pamstereogram - create a single-image st
- [-randomseed=integer]
- [-tileable]
- [infile]
+diff -urNp a/userguide/ppmtompeg.html b/userguide/ppmtompeg.html
+--- a/userguide/ppmtompeg.html 2021-06-02 12:56:59.580286388 +0200
++++ b/userguide/ppmtompeg.html 1970-01-01 01:00:00.000000000 +0100
+@@ -1,1294 +0,0 @@
+-
+-Ppmtompeg User Manual
+-
+-ppmtompeg
+-Updated: 23 July 2006
+-
+-Table Of Contents
+-
+-NAME
+-ppmtompeg - encode an MPEG-1 bitstream
+-
+-SYNOPSIS
+-
+-ppmtompeg
+-[options]
+-parameter-file
+-
+-DESCRIPTION
-
-+
-
-
-
- DESCRIPTION
-
-This program is part of Netpbm.
-+
This program is part of Netpbm.
-
- pamstereogram inputs a depth map (a map of the distances
- from your eye of the points in a scene) and outputs a single-image
-@@ -55,22 +56,22 @@ eyes. What's exciting about single-image
- don't require special glasses to view, although it does require a bit
- of practice to train your eyes to unfocus properly. The
- pamstereogram program provides a wealth of control over how the
--stereogram is generated, including the following:
-+stereogram is generated, including the following:
-
-
--- black and white, grayscale, or color output
-+
- black and white, grayscale, or color output
-
- - single-image random-dot stereograms (SIRDS), single-image
- stereograms (SIS) using a tiled image, or mapped-texture stereograms
--(MTS)
-+(MTS)
-
--- images targeting a given device resolution and eye separation
-+
- images targeting a given device resolution and eye separation
-
--- optional guide boxes to assist in focusing
-+
- optional guide boxes to assist in focusing
-
--- the ability to trade off depth levels for easier viewing
-+
- the ability to trade off depth levels for easier viewing
-
--- choice of wall-eyed or cross-eyed stereograms
-+
- choice of wall-eyed or cross-eyed stereograms
-
-
- The output is a PAM image on standard output. Options control
-@@ -80,7 +81,7 @@ if you will use the image as input to a
- many other programs don't know what a PAM is.
-
-
To make a red/cyan type of stereogram (that you view with 3-D
--glasses) instead, see ppm3d.
-+glasses) instead, see ppm3d.
-
-
- OPTIONS
-@@ -92,32 +93,32 @@ from its value.
- In addition to the options common to all programs based on libnetpbm
- (most notably -quiet, see
- Common Options), pamstereogram recognizes the following
--command line options:
-+command line options:
-
-
-
--- -verbose
-+
- -verbose
- - Display messages about image sizes and formats and properties
--of the stereogram being generated.
-+of the stereogram being generated.
-
--- -blackandwhite
-+
- -blackandwhite
- - Produce a single-image random-dot black-and-white stereogram.
--This is the default.
-+This is the default.
-
--- -grayscale
--
- Produce a single-image random-dot grayscale stereogram.
-+
- -grayscale
-
-+
- Produce a single-image random-dot grayscale stereogram.
-
--- -color
--
- Produce a single-image random-dot color stereogram.
-+
- -color
-+- Produce a single-image random-dot color stereogram.
-
--- -maxval=value
-+
- -maxval=value
- - Designate the maximum value of each gray/color component, i.e.
- the color resolution. Smaller values make the output image have
- smaller numbers of unique grays/colors. If you don't specify
- -maxval, pamstereogram uses the maxval of the input
--image. This option has no effect with -blackandwhite.
-+image. This option has no effect with -blackandwhite.
-
--- -patfile=pamfile
-+
- -patfile=pamfile
- - Specify an image to use as a repeated background pattern for
- the stereogram instead of a random-dot pattern. Intricate images
- generally produce a crisper 3-D effect that simpler images. The
-@@ -126,9 +127,9 @@ grayscale or color) as the pattern file.
- -patfile option along with -blackandwhite,
- -grayscale, -color, or -maxval. The
- -verbose option will give you information on the ideal
--dimensions of the pattern file.
-+dimensions of the pattern file.
-
--- -xbegin=pixels
-+
- -xbegin=pixels
- - Specify the horizontal coordinate at which to begin stereogram generation.
- The background pattern will be minimally distorted at this point and more
- distorted at greater distances. Consider using this in conjunction
-@@ -136,38 +137,38 @@ with -xshift to align the horizon
- horizontal start of stereogram generation. -xbegin is meaningful only
- in conjunction with -patfile, -makemask, or -texfile,
- and pamstereogram actually ignores it with respect to -texfile
--(but may not in a future version of pamstereogram).
-+(but may not in a future version of pamstereogram).
-
--The default is to begin in the center.
-+
The default is to begin in the center.
-
--This option was new in Netpbm 10.71 (June 2015).
-+
This option was new in Netpbm 10.71 (June 2015).
-
--- -texfile=pamfile
-+
- -texfile=pamfile
- - Specify an image to use as the texture for a mapped-texture
- stereogram. The idea is that the depth-map image provides the depth
- values of the 3-D object/scene while the texture image provides the
- true-color values. Consequently, the texture image should align with
- the depth-map image. (Note that it's required to have the same
- dimensions.) The texture image's background color is ignored when
--blending colors.
-+blending colors.
-
--This option was new in Netpbm 10.53 (December 2010).
-+
This option was new in Netpbm 10.53 (December 2010).
-
-
--- -bgcolor=color
-+
- -bgcolor=color
- - Use color as the texture image's background color instead
- of letting pamstereogram determine it automatically. Specify
- the color as described for the
- argument of the pnm_parsecolor() library
- routine. The -bgcolor option is meaningful only in conjunction
--with -texfile.
-+with -texfile.
-
--This option was new in Netpbm 10.53 (December 2010).
-+
This option was new in Netpbm 10.53 (December 2010).
-
-
--- -smoothing=pixels
-+
- -smoothing=pixels
- - When used without -texfile, attempt to eliminate artifacts
--introduced by edges in the depth map if pixels is greater than zero.
-+introduced by edges in the depth map if pixels is greater than zero.
-
- When used with -texfile, horizontally blur non-background
- colors into background pixels up to a distance of pixels pixels.
-@@ -176,22 +177,22 @@ by the stereogram's color constraints wh
- stereogram. In this case, the -smoothing option is helpful
- when the texture image includes smooth color transitions (as in a
- photograph) but makes crisp texture images (as in a line drawing)
--appear blurry.
-+appear blurry.
-
- This option was new in Netpbm 10.53 (December 2010). Before
--Netpbm 10.61 (December 2012), it has no effect without -texfile.
-+Netpbm 10.61 (December 2012), it has no effect without -texfile.
-
-
--- -xshift=pixels
-+
- -xshift=pixels
- - Shift the pattern image (designated by -patfile) to the
--right by pixels pixels (default: 0).
+-
+-
ppmtompeg produces an MPEG-1 video stream. MPEG-1 is the
+-first great video compression method, and is what is used in Video CDs
+-(VCD). ppmtompeg originated in the year 1995. DVD uses a more
+-advanced method, MPEG-2. There is an even newer method called MPEG-4
+-which is also called Divx. I don't know where one finds that used.
+-
+-
There's technically a difference between a compression method for
+-video and an actual file (stream) format for a movie, and I don't know
+-if it can be validly said that the format of the stream
+-ppmtompeg produces is MPEG-1.
+-
+-
Mencoder from the Mplayer
+-package is probably superior for most video format generation
+-needs, if for no other reason than that it is more popular.
+-
+-
The programming library PM2V
+-generates MPEG-2 streams.
+-
+-
Use Mplayer (not part of Netpbm)
+-to do the reverse conversion: to create a series of PNM files from an MPEG
+-stream.
+-
+-
param_file is a parameter file which includes a list of
+-input files and other parameters. The file is described in detail
+-below.
+-
+-
To understand this program, you need to understand something about
+-the complex MPEG-1 format. One source of information about this
+-standard format is the section Introduction to MPEG in the Compression FAQ.
+-
+-
OPTIONS
+-
+-The -gop, -combine_gops, -frames, and
+--combine_frames options are all mutually exclusive.
+-
+-
+-- -stat stat_file
+-
+-
- This option causes ppmtompeg to append the statistics that
+-it write to Standard Output to the file stat_file as well. The
+-statistics use the following abbreviations: bits per block (bpb), bits
+-per frame (bpf), seconds per frame (spf), and bits per second (bps).
+-
+-
These statistics include how many I, P, and B frames there were,
+-and information about compression and quality.
+-
+-
+-
- -quiet num_seconds
+-
+-
- causes ppmtompeg not to report remaining time more often
+-than every num_seconds seconds (unless the time estimate rises,
+-which will happen near the beginning of the run). A negative value
+-tells ppmtompeg not to report at all. 0 is the default
+-(reports once after each frame). Note that the time remaining is an
+-estimate and does not take into account time to read in frames.
+-
+-
- -realquiet
- causes ppmtompeg to run silently,
+-with the only screen output being errors. Particularly useful when
+-reading input from stdin. The equivalent of the -quiet
+-common option of most other Netpbm programs.
+-
+-
-
+--no_frame_summary
+-
+-
- This option prevents ppmtompeg from printing a summary
+-line for each frame
+-
+-
- -float_dct
+-
+-
- forces ppmtompeg to use a more accurate, yet more
+-computationally expensive version of the DCT.
+-
+-
- -gop gop_num
+-
-
+-causes ppmtompeg to encode only the numbered GOP (first GOP is 0). The
+-parameter file is the same as for normal usage. The output file will be
+-the normal output file with the suffix .gop.gop_num.
+-ppmtompeg does not output any sequence information.
+-
+-
- -combine_gops
+-
+-
- causes ppmtompeg simply to combine some GOP files into a
+-single MPEG output stream. ppmtompeg inserts a sequence header
+-and trailer. In this case, the parameter file needs only to contain
+-the SIZE value, an output file, and perhaps a list of input GOP
+-files (see below).
+-
+-If you don't supply a list of input GOP files is used, then
+-ppmtompeg assumes you're using the same parameter file you used
+-when you created the input (with the -gop option) and
+-calculates the corresponding gop filenames itself. If this is not the
+-case, you can specify input GOP files in the same manner as normal
+-input files -- except instead of using INPUT_DIR, INPUT, and
+-END_INPUT, use GOP_INPUT_DIR, GOP_INPUT, and GOP_END_INPUT. If no
+-input GOP files are specified, then the default is to use the output
+-file name with suffix .gop.gop_num, with gop_num
+-starting from 0, as the input files.
+-
+-
Thus, unless you're mixing and matching GOP files from different
+-sources, you can simply use the same parameter file for creating the
+-GOP files (-gop) and for later turning them into an MPEG stream
+-(-combine_gops).
+-
+-
+-
- -frames first_frame last_frame
+-
+-
- This option causes ppmtompeg to encode only the frames numbered
+-first_frame to last_frame, inclusive. The parameter
+-file is the same as for normal usage. The output will be placed in
+-separate files, one per frame, with the file names being the normal
+-output file name with the suffix .frame.frame_num. No
+-GOP header information is output. (Thus, the parameter file need not
+-include the GOP_SIZE value)
+-
+-
Use ppmtompeg -combine_frames to combine these frames later into
+-an MPEG stream.
+-
+-
+-
- -combine_frames
+-
+-
- This option causes ppmtompeg simply to combine some
+-individual MPEG frames (such as you might have created with an earlier
+-run of ppmtompeg -frames) into a single MPEG stream. Sequence
+-and GOP headers are inserted appropriately. In this case, the
+-parameter file needs to contain only the SIZE value, the GOP_SIZE
+-value, an output file, and perhaps a list of frame files (see below).
+-
+-
The parameter file may specify input frame files in the same manner
+-as normal input files -- except instead of using INPUT_DIR, INPUT, and
+-END_INPUT, use FRAME_INPUT_DIR, FRAME_INPUT, and FRAME_END_INPUT. If
+-no input frame files are specified, then the default is to use the
+-output file name with suffix .frame.frame_num, with
+-frame_num starting from 0, as the input files.
+-
+-
+-
+-
- -nice
+-
+-
- This option causes ppmtompeg to run any remote processes
+-"nicely," i.e. at low priority. (This is relevant only if you are
+-running ppmtompeg in parallel mode. Otherwise, there are no
+-remote processes). See 'man nice.'
+-
+-
- -max_machines num_machines
+-
+-
- This option causes ppmtompeg to use no more than
+-num_machines machines as slaves for use in parallel encoding.
+-
+-
- -snr
+-
+-
- This option causes ppmtompeg to include the signal-to-noise
+-ratio in the reported statistics. Prints SNR (Y U V) and peak SNR (Y
+-U V) for each frame. In summary, prints averages of luminance only
+-(Y). SNR is defined as 10*log(variance of original/variance of
+-error). Peak SNR is defined as 20*log(255/RMSE). Note that
+-ppmtompeg runs a little slower when you use this option.
+-
+-
- -mse
+-
+-
- This option causes ppmtompeg to report the mean squared
+-error per block. It also automatically reports the quality of the
+-images, so there is no need to specify -snr then.
+-
+-
- -bit_rate_info rate_file
+-
+-
- This option makes ppmtompeg write bit rate information
+-into the file rate_file. Bit rate information is bits per frame, and
+-also bits per I-frame-to-I-frame.
+-
+-
- -mv_histogram
+-
+-
- This option causes ppmtompeg to print a histogram of the
+-motion vectors as part of statistics. There are three histograms --
+-one for P frame, one for forward B frame, and one for backward B frame
+-motion vectors.
+-
+-
The output is in the form of a matrix, each entry corresponding to one
+-motion vector in the search window. The center of the matrix
+-represents (0,0) motion vectors.
+-
+-
- -debug_sockets
+-
+-
- This option causes ppmtompeg to print to Standard Output
+-messages that narrate the communication between the machines when you run
+-ppmtompeg in parallel mode.
+-
+-
- -debug_machines
+-
+-
- This option causes ppmtompeg to print to Standard Output
+-messages that narrate the progress of the conversion on the various
+-machines when you run ppmtompeg in parallel
+-mode.
+-
+-
+-
+-PARAMETER FILE
+-
+-The parameter file must contain the following
+-lines (except when using the -combine_gops or -combine_frames
+-options):
+-
+-
+-
+-- PATTERN pattern
+-
+-
- This statement specifies the pattern (sequence) of I frames, P frames,
+-and B frames. pattern is just a sequence of the letters I, P, and
+-B with nothing between. Example:
+-
+-
+- PATTERN IBBPBBPBBPBBPBB
+-
+-
+-See I Frames, P Frames, B Frames.
+-
+-
- OUTPUT output file
+-
- This names the file where the output MPEG stream goes.
+-
+-
- INPUT_DIR directory
+-
+-
- This statement tells where the input images (frames) come from.
+-If each frame is in a separate file, directory is the directory
+-where they all are. You may use . to refer to the current
+-directory. A null directory refers to the root directory of the
+-system file tree.
+-
+-
To have ppmtompeg read all the frames serially from Standard
+-Input, specify
+-
+- INPUT_DIR stdin
+-
+-
+- - INPUT
+-
-
+-This line must be followed by a list of the input files (in display order)
+-and then the line END_INPUT.
+-
+-
There are three types of lines between INPUT and END_INPUT. First,
+-a line may simply be the name of an input file. Second, the line
+-may be of the form single_star_expr
+-[x-y].
+-single_star_expr can have a single * in it. It is
+-replaced by all the numbers between x and y inclusive. So, for
+-example, the line tennis*.ppm [12-15] refers to the files
+-tennis12.ppm, tennis13.ppm, tennis14.ppm, tennis15.ppm.
+-
+-
Uniform zero-padding occurs, as well. For example, the line
+-football.*.ppm [001-130] refers to the files football.001.ppm,
+-football.002.ppm, ..., football.009.ppm, football.010.ppm, ...,
+-football.130.ppm.
+-
+-
The third type of line is: single_star_expr
+-[x-y+s], where the
+-line is treated exactly as above, except that we skip by s. Thus, the
+-line football.*.ppm [001-130+4] refers to the files
+-football.001.ppm, football.005.ppm, football.009.ppm,
+-football.013.ppm, etc.
+-
+-
Furthermore, a line may specify a shell command to execute to
+-generate lines to be interpreted as described above, as if those lines
+-were in the parameter file instead. Use back ticks, like in the
+-Bourne Shell, like this:
+-
+-
+- `cat myfilelist`
+-
+-
-
--This option is valid only along with -patfile.
-+right by pixels pixels (default: 0).
-+
-+This option is valid only along with -patfile.
-
--- -yshift pixels
-+
- -yshift pixels
- - Shift the pattern image (designated by -patfile)
- downwards by pixels pixels (default: 0). This option is
--valid only along with -patfile.
-+valid only along with -patfile.
-
- - -yfillshift pixels
- - Shift the pattern image (designated by -patfile) downwards
-@@ -200,77 +201,77 @@ population of the pattern. (If used wit
- shifts are summed.) A small -yfillshift helps reduce visual
- artifacts in the 3-D image. Steer's website, referenced under
- SEE ALSO, recommends a shift of approximately
--1/16" (6–7 pixels at pamstereogram's default of 100 DPI).
-+1/16" (6–7 pixels at pamstereogram's default of 100 DPI).
-
--This option was new in Netpbm 10.94 (March 2021).
-+
This option was new in Netpbm 10.94 (March 2021).
-
--- -magnifypat=scale
-+
- -magnifypat=scale
- - Magnify each pixel in the pattern file or each random dot by
- integral scaling factor scale. Note that
- pamstereogram applies the pattern magnification
- after pattern shifting (-xshift and
---yshift).
-+-yshift).
-
--- -guidebottom
-+
- -guidebottom
- -
- Draw a pair of black squares on a white background underneath the stereogram
- proper. These squares help you guide your eyes into proper focus to view the
- 3-D image. The trick is to focus your eyes some distance behind the image,
- causing you to see four black squares, then continue altering your focus
- distance until the middle two black squares fuse into a single black
--square. At that point, a crisp, 3-D image will appear.
-+square. At that point, a crisp, 3-D image will appear.
-
- This option was new in Netpbm 10.61 (December 2012). Before that,
- the presence of -guidesize, with a positive value, has the same
--effect.
-+effect.
-
-
--- -guidetop
-+
- -guidetop
- -
--Same as -guidebottom, except the guides go at the top of the image.
-+Same as -guidebottom, except the guides go at the top of the image.
-
- This option was new in Netpbm 10.61 (December 2012). Before that,
- the presence of -guidesize, with a negative value, has the same
--effect.
-+effect.
-
--- -guidesize=pixels
-+
- -guidesize=pixels
-
-- - The size (width and height) of each guide box.
-+
- The size (width and height) of each guide box.
-
--This is valid only with -guidetop or -guidebottom.
-+
This is valid only with -guidetop or -guidebottom.
-
--Default is 20.
-+
Default is 20.
-
- Before Netpbm 10.61 (December 2012), if you don't specify this option,
- pamstereogram draws no guides. If you specify it with a positive
- value, pamstereogram behaves as if you specified -guidebottom
- too, and if you specify it with a negative value, it behaves as if you
- specified -guidetop and specified guidesize with the absolute
--value of that negative value.
-+value of that negative value.
-
-- - -dpi=resolution
-+
- -dpi=resolution
- - Specify the resolution of the output device in dots per inch.
- The default is 100 DPI, which represents a fairly crisp screen
--resolution.
-+resolution.
-
--Before Netpbm 10.53 (December 2010), the default was 96 DPI.
-+
Before Netpbm 10.53 (December 2010), the default was 96 DPI.
-
-
--- -crosseyed
-+
- -crosseyed
- - Invert the gray levels in the depth map (input image) so that the 3-D
- image pops out of the page where it would otherwise sink into the page and
- vice versa. Some people are unable to diverge their eyes and can only cross
- them. The -crosseyed option enables such people to see the 3-D image as
- intended. You can also specify the -crosseyed option if you prefer
- using depth maps in which darker colors are closer to the eye and lighter
--colors are farther from the eye.
-+colors are farther from the eye.
-
- Before Netpbm 10.53 (December 2010), pamstereogram used higher
- (lighter) numbers for things closer to the eye without
---crosseyed and vice versa.
-+-crosseyed and vice versa.
-
-
--- -makemask
-+
- -makemask
- - Instead of a stereogram, output a PAM mask image showing
- coloring constraints. New pixels will be taken from the pattern
- file where the mask is black. Copies of existing pixels will be
-@@ -278,30 +279,30 @@ taken from the pattern file where the ma
- -makemask option can be used to help create more
- sophisticated pattern files (to use with -patfile) Note that
- -makemask ignores -magnifypat; it always produces
--masks that assume a pattern magnification of 1.
-+masks that assume a pattern magnification of 1.
-
--- -eyesep=inches
-+
- -eyesep=inches
- - Specify the separation in inches between your eyes. The
- default, 2.5 inches (6.4 cm), should be sufficient for most people
--and probably doesn't need to be changed.
-+and probably doesn't need to be changed.
-
--- -depth=fraction
-+
- -depth=fraction
- - Specify the output image's depth of field. That is,
- fraction represents the fractional distance of the near
- plane from the far plane. Smaller numbers make the 3-D image easier
- to perceive but flatter. Larger numbers make the 3-D image more
- difficult to perceive but deeper. The default, 0.3333, generally
--works fairly well.
-+works fairly well.
-
--- -planes=near_pixels,far_pixels
-+
- -planes=near_pixels,far_pixels
- - Explicitly specify the distance between repeated pixels in the near plane
- and in the far plane. This is an alternative to
- -eyesep and -depth. The following equalities hold:
-
-
-- - eyesep = 2 * far
-+
- eyesep = 2 * far
- - depth = 2 * (far − near) /
-- (2 * far − near)
-+ (2 * far − near)
-
-
- The number of distinct 3-D depths is far
-@@ -309,34 +310,35 @@ and in the far plane. This is an altern
- and -depth are a more human-friendly way to specify stereoscopic
- parameters (distance between eyes and tradeoff between perceptibility
- and depth) while -planes is a more computer-centric way (pixel
--distances in the resulting stereogram).
-+distances in the resulting stereogram).
-
--This option was new in Netpbm 10.59 (June 2012).
-+
This option was new in Netpbm 10.59 (June 2012).
-+
-
-
--- -randomseed=integer
-+
- -randomseed=integer
- - Specify a seed to be used for the random number generator.
- The default is to use a seed based on the time of day, to one second
--granularity.
-+granularity.
-
- It is useful to specify the seed if you want to create reproducible
- results. With the same random seed, you should get identical results
--every time you run pamstereogram.
-+every time you run pamstereogram.
-
- This is irrelevant if you use a pattern file (-patfile
- option), because there is no random element to pamstereogram's
--behavior.
-+behavior.
-
--This option was new in Netpbm 10.32 (February 2006).
-+
This option was new in Netpbm 10.32 (February 2006).
-
--- -tileable
-+
- -tileable
-
- - Make the generated image horizontally tileable. This works by
- blending a left-to-right rendering (the equivalent
- of -xbegin=0) with a right-to-left rendering (the equivalent
- of -xbegin=width−1).
-
--
This option was new in Netpbm 10.91 (June 2020).
-+
This option was new in Netpbm 10.91 (June 2020).
-
-
-
-@@ -345,21 +347,21 @@ of -xbegin=width−1).
-
- The only parameter, infile, is the name of an input file
- that is a depth map image. If you don't specify infile, the
--input is from standard input.
-+input is from standard input.
-
- The input is a PAM image of depth 1. Each sample represents the
- distance from the eye that the 3-D image at that location should
--be. Lower (darker) numbers mean further from the eye.
-+be. Lower (darker) numbers mean further from the eye.
-
- NOTES
-
- Input Images
-
- pamstereogram pays no attention to the image's tuple type and
--ignores all planes other than plane 0.
-+ignores all planes other than plane 0.
-
- Like any Netpbm program, pamstereogram will accept PNM
--input as if it were the PAM equivalent.
-+input as if it were the PAM equivalent.
-
- Mapped-texture Stereograms
-
-@@ -367,12 +369,12 @@ input as if it were the PAM equivalent.
- drawn with true colors. Unlike a SIRDS or tiled-image SIS, however,
- the image portrayed by an MTS is apparent in normal 2-D viewing. It
- appears repeated multiple times and overlapped with itself, but it is
--not hidden.
-+not hidden.
-
- You create an MTS with pamstereogram by passing the filename
- of a PAM "texture image" with a -texfile option. A
- texture image portrays the same 3-D object as the depth-map image but
--indicates the colors that the program should apply to the object.
-+indicates the colors that the program should apply to the object.
-
- pamstereogram ignores the texture image's background color when it
- overlaps copies of the 3-D object. This prevents, for example, a bright-red
-@@ -382,32 +384,32 @@ object remains bright red. A consequenc
- best when the objects in the texture image have a crisp outline. Smooth
- transitions to the background color result in unwanted color artifacts around
- edges because the program ignores only exact matches with the
--background color.
-+background color.
-
- You should specify a larger-than-normal value for -eyesep
- (and/or -dpi) when producing an MTS. Otherwise, the 3-D object will
- repeat so many times that most colored pixels will overlap other colored
--pixels, reducing the number of true-colored pixels that remain.
-+pixels, reducing the number of true-colored pixels that remain.
-
- An MTS can employ a background pattern (-patfile). In this
- case, pamstereogram replaces background pixels with pattern pixels in
--the final step of generating the image.
-+the final step of generating the image.
-
-
- Miscellaneous
-
- A good initial test is to input an image consisting of a solid
- shape of distance 0 within a large field of maximum distance (e.g., a
--white square on a black background).
-+white square on a black background).
-
- With the default values for -dpi and -eyesep, pattern
--images that are 128 pixels wide can tile seamlessly.
-+images that are 128 pixels wide can tile seamlessly.
-
-
- EXAMPLES
-
- Generate a SIRDS out of small, brightly colored squares and
--prepare it for display on an 87 DPI monitor:
-+prepare it for display on an 87 DPI monitor:
-
-
- pamstereogram depthmap.pam \
-@@ -439,21 +441,21 @@ speckles:
-
- SEE ALSO
-
--- pam
-+
- pam
-
--- pamsistoaglyph
-+
- pamsistoaglyph
-
--- ppm3d
-+
- ppm3d
-
- - Harold W. Thimbleby, Stuart Inglis, and Ian H. Witten.
- Displaying 3D Images: Algorithms for Single Image Random Dot
- Stereograms. In IEEE Computer, 27(10):38-48,
- October 1994. DOI: 10.1109/2.318576.
-+href="http://dx.doi.org/10.1109/2.318576">10.1109/2.318576.
-
- - W. A. Steer.
- Stereograms: Technical Details.
--URL: http://www.techmind.org/stereo/stech.html.
-+URL: http://www.techmind.org/stereo/stech.html.
-
-
-
-@@ -461,32 +463,32 @@ URL: AUTHOR
--Copyright © 2006-2020 Scott Pakin, scott+pbm@pakin.org.
-+
Copyright © 2006-2020 Scott Pakin, scott+pbm@pakin.org.
-
- Table Of Contents
-
+-If input is from Standard Input (per the INPUT_DIR statement),
+-ppmtompeg ignores the INPUT/END_INPUT block, but
+-it still must be present.
+-
+-- BASE_FILE_FORMAT {PPM | PNM | YUV |
+- JPEG | JMOVIE}
+-
+-
- ppmtompeg must convert all input files to one of the
+-following formats as a first step of processing: PNM, YUV, JPEG(v4),
+-or JMOVIE. (The conversion may be trivial if your input files are
+-already in one of these formats). This line specifies which of the
+-four formats. PPM is actually a subset of PNM. The separate
+-specification is allowed for backward compatibility. Use PNM instead
+-of PPM in new applications.
+-
+-
- INPUT_CONVERT conversion_command
+-
+-
- You must specify how to convert a file to the base file format.
+-If no conversion is necessary, then you would just say:
+-
+-
+- INPUT_CONVERT *
+-
+-
+-Otherwise, conversion_command is a shell command that causes
+-an image in the format your specified with BASE_FILE_FORMAT to
+-be written to Standard Output. ppmtompeg executes the command
+-once for each line between INPUT and END_INPUT (which is
+-normally, but not necessarily, a file name). In the conversion
+-command, ppmtompeg replaces each '*' with the contents of that
+-line.
+-
+- If you had a bunch of gif files, you might say:
+-
+- INPUT_CONVERT giftopnm *
+-
+-
+- If you have a bunch of separate a.Y, a.U, and a.V files (where
+- the U and V have already been subsampled), then you might say:
+-
+-
+- INPUT_CONVERT cat *.Y *.U *.V
+-
+-
+-Input conversion is not allowed with input from stdin, so use
+-
+-
+- INPUT_CONVERT *
+-
+-
+-as described above.
+-
+- - SIZE widthxheight
+-
+-
-
+-
+-
width and height are the width and height of each
+-frame in pixels.
+-
+-
When ppmtompeg can get this information from the input image
+-files, it ignores the SIZE parameter and you may omit it.
+-
+-
When the image files are in YUV format, the files don't contain
+-dimension information, so SIZE is required.
+-
+-
When ppmtompeg is running in parallel mode, not all of the
+-processes in the network have access to the image files, so
+-SIZE is required and must give the same dimensions as the
+-input image files.
+-
+-
- YUV_SIZE widthxheight
+-
+-
- This is an obsolete synonym of SIZE.
+-
+-
- YUV_FORMAT {ABEKAS | PHILLIPS | UCB |
+- EYUV | pattern}
+-
+-
- This is meaningful only when BASE_FILE_FORMAT specifies
+-YUV format, and then it is required. It specifies the sub-format of
+-the YUV class.
+-
+-
+-
- GOP_SIZE n
+-
+-
- n is the number of frames in a Group of Pictures. Except that
+-because a GOP must start with an I frame, ppmtompeg makes a GOP as
+-much longer than n as it has to to make the next GOP start with an
+-I frame.
+-
+-
Normally, it makes sense to make your GOP size a multiple of your
+-pattern length (the latter is determined by the PATTERN parameter file
+-statement).
+-
+-
See Group Of Pictures.
+-
+-
- SLICES_PER_FRAME n
+-
- n is roughly the number of slices per frame. Note, at
+-least one MPEG player may complain if slices do not start at the left
+-side of an image. To ensure this does not happen, make sure the
+-number of rows is divisible by SLICES_PER_FRAME.
+-
+-
- PIXEL {FULL | HALF}
+-
+-
- use half-pixel motion vectors, or just full-pixel ones It is
+-usually important that you use half-pixel motion vectors, because it
+-results in both better quality and better compression.
+-
+-
+-
- RANGE n
+-
- Use a search range of n pixels in each of the four directions
+-from a subject pixel. (So the search window is a square n*2 pixels
+-on a side).
+-
+-
- PSEARCH_ALG {EXHAUSTIVE | TWOLEVEL |
+- SUBSAMPLE | LOGARITHMIC}
+-
+-
- This statement tells ppmtompeg what kind of search
+- technique (algorithm) to use for P frames. You select the desired
+- combination of speed and compression. EXHAUSTIVE gives the
+- best compression, but LOGARITHMIC is the fastest.
+- TWOLEVEL is an exhaustive full-pixel search, followed by a
+- local half- pixel search around the best full-pixel vector (the
+- PIXEL option is ignored for this search technique).
+-
+-
- BSEARCH_ALG {SIMPLE | CROSS2 | EXHAUSTIVE}
+-
+-
- This statement tells ppmtompeg what kind of search
+- technique (algorithm) to use for B frames. SIMPLE means
+- find best forward and backward vectors, then interpolate.
+- CROSS2 means find those two vectors, then see what backward
+- vector best matches the best forward vector, and vice versa.
+- EXHAUSTIVE does an n-squared search and is
+- extremely slow in relation to the others (CROSS2
+- is about half as fast as SIMPLE).
+-
+-
- IQSCALE n
+-
- Use n as the qscale for I frames.
+- See Qscale.
+-
+-
- PQSCALE n
+-
- Use n as the qscale for P frames.
+- See Qscale.
+-
+-
- BQSCALE n
+-
- Use n as the qscale for B frames.
+- See Qscale.
+-
+-
- REFERENCE_FRAME {ORIGINAL | DECODED}
- This
+-statement determines whether ppmtompeg uses the original images
+-or the decoded images when computing motion vectors. Using decoded
+-images is more accurate and should increase the playback quality of
+-the output, but it makes the encoding take longer and seems to give
+-worse compression. It also causes some complications with parallel
+-encoding. (see the section on parallel encoding). One thing you can
+-do as a trade-off is select ORIGINAL here, and lower the
+-qscale (see QSCALE if the quality is not good enough.
+-
+-
+- Original or Decoded? (Normalized)
+-
+-
+-
+- Reference
+- Compression
+- Speed
+- Quality I
+- Quality P
+- Quality B
+-
+-
+- Decoded
+- 1000
+- 1000
+- 1000
+- 969
+- 919
+-
+-
+- Original
+- 885
+- 1373
+- 1000
+- 912
+- 884
+-
+-
+-
+-
+-
+-
+-
+-The following lines are optional:
+-
+-
+-
+-- FORCE_ENCODE_LAST_FRAME
+-
+-
- This statement is obsolete. It does nothing.
+-
+-
Before Netpbm 10.26 (January 2005), ppmtompeg would drop
+-trailing B frames from your movie, since a movie can't end with a B
+-frame. (See I Frames, P Frames, B Frames.)
+-You would have to specify FORCE_ENCODE_LAST_FRAME to stop
+-that from happening and get the same function that ppmtompeg
+-has today.
+-
+-
+-
- NIQTABLE
+-
+-
- This statement specifies a custom non-intra quantization table.
+-If you don't specify this statement, ppmtompeg uses a default
+-non-intra quantization table.
+-
+-
+-The 8 lines immediately following NIQTABLE specify the quantization
+-table. Each line defines a table row and consists of 8 integers,
+-whitespace-delimited, which define the table columns.
+-
+-
- IQTABLE
+-
+-
- This is analogous to NIQTABLE, but for the intra quantization table.
+-
+-
- ASPECT_RATIO ratio
+-
+-
- This statement specifies the aspect ratio for ppmtompeg to
+-specify in the MPEG output. I'm not sure what this is used for.
+-
+-
ratio must be 1.0, 0.6735, 0.7031, 0.7615, 0.8055, 0.8437,
+-0.8935, 0.9157, 0.9815, 1.0255, 1.0695, 1.0950, 1.1575, or 1.2015.
+-
+-
- FRAME_RATE rate
+-
- This specifies the frame rate for ppmtompeg to specify in the
+-MPEG output. Some players use this value to determine the playback rate.
+-
+-
rate must be 23.976, 24, 25, 29.97, 30, 50, 59.94, or 60.
+-
+-
- BIT_RATE rate
+-
- This specifies the bit rate for Constant Bit Rate (CBR) encoding.
+-
+-
rate must be an integer.
+-
+-
- BUFFER_SIZE size
+-
+-
- This specifies the value
+-ppmtompeg is to specify in the MPEG output for the Video
+-Buffering Verifier (VBV) buffer size needed to decode the sequence.
+-
+-
A Video Verifying Buffer is a buffer in which a decoder keeps the
+-decoded bits in order to match the uneven speed of the decoding with
+-the required constant playback speed.
+-
+-
As ppmtompeg encodes the image, it simulates the decoding
+-process in terms of how many bits would be in the VBV as each frame gets
+-decoded, assuming a VBV of the size you indicate.
+-
+-
If you specify the WARN_VBV_UNDERFLOW statement,
+-ppmtompeg issues a warning each time the simulation underflows
+-the buffer, which suggests that an underflow would occur on playback,
+-which suggests the buffer is too small.
+-
+-
If you specify the WARN_VBV_OVERFLOW statement,
+-ppmtompeg issues a warning each time the simulation overflows
+-the buffer, which suggests that an overflow would occur on playback,
+-which suggests the buffer is too small.
+-
+-
- WARN_VBV_UNDERFLOW
+-
- WARN_VBV_OVERFLOW
+-
+-
- See BUFFER_SIZE.
+-
+-
These options were new in Netpbm 10.26 (January 2005). Before that,
+-ppmtompeg issued the warnings always.
+-
+-
+-
+-
+-The following statements apply only to parallel operation:
+-
+-
+-
+-- PARALLEL
+-
+-
- This statement, paired with END PARALLEL, is what causes
+-ppmtompeg to operate in parallel mode. See Parallel Operation.
+-
+-
- END PARALLEL
+-
+-
- This goes with PARALLEL.
+-
+-
- PARALLEL_TEST_FRAMES n
+-
+-
- The master starts off by measuring each slave's speed. It does
+-this by giving each slave n frames to encode and noting how
+-long the slave takes to finish. These are not just test frames,
+-though -- they're real frames and the results become part of the
+-output.
+-ppmtompeg is old and measures time in undivided seconds, so
+-to get useful timings, specify enough frames that it will take at
+-least 5 seconds to process them. The default is 10.
+-
+-
If you specify FORCE_I_ALIGN, ppmtompeg will increase
+-the test frames value enough to maintain the alignment.
+-
+-
If there aren't enough frames for every slave to have the indicated
+-number of test frames, ppmtompeg will give some slaves fewer.
+-
+-
+-
- PARALLEL_TIME_CHUNKS t
+-
+-
- When you specify this statement, the master attempts to feed work
+-to the slaves in chunks that take t seconds to process. It uses
+-the speed measurement it made when it started up (see PARALLEL_TEST_FRAMES)
+-to decide how many frames to put in the chunk. This statement obviously
+-doesn't affect the first batch of work sent to each slave, which is the
+-one used to measure the slave's speed.
+-
+-
Smaller values of t increase communication, but improve load
+-balancing. The default is 30 seconds.
+-
+-
You may specify only one of PARALLEL_TIME_CHUNKS, PARALLEL_CHUNK_TAPER,
+-and PARALLEL_PERFECT. PARALLEL_CHUNK_TAPER is usually best.
+-
+-
- PARALLEL_CHUNK_TAPER
+-
+-
- When you specify this statement, the master distributes work like
+-with PARALLEL_TIME_CHUNKS, except that the master chooses the number
+-of seconds for the chunks. It starts with a large number and, as it
+-gets closer to finishing the job, reduces it. That way, it reduces
+-scheduling overhead when precise scheduling isn't helpful, but still
+-prevents a slave from finishing early after all the work has already
+-been handed out to the other slaves, and then sitting idle while
+-there's still work to do.
+-
+-
You may specify only one of PARALLEL_TIME_CHUNKS, PARALLEL_CHUNK_TAPER,
+-and PARALLEL_PERFECT. PARALLEL_CHUNK_TAPER is usually best.
+-
+-
+-
- PARALLEL_PERFECT
+-
+-
- If this statement is present, ppmtompeg schedules on the
+-assumption that each machine is about the same speed. The master will
+-simply divide up the frames evenly between the slaves -- each
+-slave gets the same number of frames. If some slaves are faster than
+-others, they will finish first and remain idle while the slower slaves
+-continue.
+-
+-
This has the advantage of minimal scheduling overhead. Where slaves
+-have different speeds, though, it makes inefficient use of the fast
+-ones. Where slaves are the same speed, it also has the disadvantage
+-that they all finish at the same time and feed their output to the
+-single Combine Server in a burst, which makes less efficient use of
+-the Combine Server and thus can increase the total elapsed time.
+-
+-
You may specify only one of PARALLEL_TIME_CHUNKS, PARALLEL_CHUNK_TAPER,
+-and PARALLEL_PERFECT. PARALLEL_CHUNK_TAPER is usually best.
+-
+-
- RSH remote_shell_command
+-
+-
- ppmtompeg executes the shell command
+-remote_shell_command to start a process on another machine.
+-The default command is rsh, and whatever command you specify
+-must have compatible semantics. ssh is usually compatible.
+-The command ppmtompeg uses is one like this:
+-ssh remote.host.com -l username shellcommand.
+-
+-
Be sure to set up .rhosts files or SSH key authorizations
+-where needed. Otherwise, you'll have to type in passwords.
+-
+-
On some HP machines, rsh is the restricted shell, and you want
+-to specify remsh.
+-
+-
- FORCE_I_ALIGN
+-
+-
- This statement forces each slave to encode a chunk of frames which
+-is a multiple of the pattern length (see PATTERN). Since the
+-first frame in any pattern is an I frame, this forces each chunk
+-encoded by a slave to begin with an I frame.
+-
+-
This document used to say there was an argument to
+-FORCE_I_ALIGN which was the number of frames ppmtompeg
+-would use (and was required to be a multiple of the pattern length).
+-But ppmtompeg has apparently always ignored that argument, and
+-it does now.
+-
+-
- KEEP_TEMP_FILES
+-
+-
- This statement causes ppmtompeg not to delete the temporary
+-files it uses to transmit encoded frames to the combine server. This
+-means you will be left with a file for each frame, the same as you
+-would get with the -frames option.
+-
+-
This is mostly useful for debugging.
+-
+-
This works only if you're using a shared filesystem to communicate
+-between the servers.
+-
+-
This option was new in Netpbm 10.26 (January 2005).
+-
+-
+-
+-
+-Parameter File Notes
+-
+- If you use the -combine_gops option, then you need to specify
+-only the SIZE and OUTPUT values in the parameter file. In
+-addition, the parameter file may specify input GOP files in the same
+-manner as normal input files -- except instead of using INPUT_DIR,
+-INPUT, and END_INPUT, use GOP_INPUT_DIR, GOP_INPUT, and GOP_END_INPUT.
+-If you specify no input GOP files, then ppmtompeg uses by default the
+-output file name with suffix .gop.gop_num, with gop_num
+-starting from 0, as the input files.
+-
+-
If you use the -combine_frames option, then you need to
+-specify only the SIZE, GOP_SIZE, and OUTPUT values in the
+-parameter file. In addition, the parameter file may specify input
+-frame files in the same manner as normal input files -- except instead
+-of using INPUT_DIR, INPUT, and END_INPUT, use FRAME_INPUT_DIR,
+-FRAME_INPUT, and FRAME_END_INPUT. If no input frame files are
+-specified, then the default is to use the output file name with suffix
+-.frame.frame_num, with frame_num starting from 0,
+-as the input files.
+-
+-
Any number of spaces and tabs may come between each option and value. Lines
+-beginning with # are ignored. Any other lines are ignored except for
+-those between INPUT and END_INPUT. This allows you to use the same
+-parameter file for normal usage and for -combine_gops and
+--combine_frames.
+-
+-
The file format is case-sensitive so all keywords should be in
+-upper case.
+-
+-
The statements may appear in any order, except that the order within
+-a block statement (such as INPUT ... END INPUT) is significant.
+-
+-
ppmtompeg is prepared to handle up to 16 B frames between
+-reference frames when encoding with input from stdin. (To build a
+-modified ppmtompeg with a higher limit, change the constant
+-B_FRAME_RUN in frame.c and recompile).
+-
+-
GENERAL USAGE INFORMATION
+-
+-Qscale
+-
+-The quantization scale values (qscale) give a trade-off between
+-quality and compression. Using different Qscale values has very little
+-effect on speed. The qscale values can be set separately for I, P, and
+-B frames.
+-
+-
You select the qscale values with the IQSCALE,
+-PQSCALE, and BSCALE parameter file statements.
+-
+-
A qscale value is an integer from 1 to 31. Larger numbers give
+-better compression, but worse quality. In the following, the quality
+-numbers are peak signal-to-noise ratio, defined as:
+-
+-where MSE is the mean squared error.
+-
+-
+-
Flower garden tests:
+-
+-
+- Qscale vs Quality
+-
+-
+-
+- Qscale
+- I Frames
+- P Frames
+- B Frames
+-
+-
+- 1
+- 43.2
+- 46.3
+- 46.5
+-
+-
+- 6
+- 32.6
+- 34.6
+- 34.3
+-
+-
+- 11
+- 28.6
+- 29.5
+- 30.0
+-
+-
+- 16
+- 26.3
+- 26.8
+- 28.6
+-
+-
+- 21
+- 24.7
+- 25.0
+- 27.9
+-
+-
+- 26
+- 23.5
+- 23.9
+- 27.5
+-
+-
+- 31
+- 22.6
+- 23.0
+- 27.3
+-
+-
+-
+-
+- Qscale vs Compression
+-
+-
+-
+- Qscale
+- I Frames
+- P Frames
+- B Frames
+-
+-
+- 1
+- 2
+- 2
+- 2
+-
+-
+- 6
+- 7
+- 10
+- 15
+-
+-
+- 11
+- 11
+- 18
+- 43
+-
+-
+- 16
+- 15
+- 29
+- 97
+-
+-
+- 21
+- 19
+- 41
+- 173
+-
+-
+- 26
+- 24
+- 56
+- 256
+-
+-
+- 31
+- 28
+- 73
+- 330
+-
+-
+-
+-
+-Search Techniques
+-
+-There are several different motion vector search techniques
+-available. There are different techniques available for P frame
+-search and B frame search. Using different search techniques present
+-little difference in quality, but a large difference in compression
+-and speed.
+-
+-
There are 4 types of P frame search: Exhaustive, TwoLevel,
+-SubSample, and Logarithmic.
+-
+-
There are 3 types of B frame search: Exhaustive, Cross2, and
+-Simple.
+-
+-The recommended search techniques are TwoLevel and Logarithmic for
+-P frame search, and Cross2 and Simple for B frame search. Here are
+-some numbers comparing the different search methods:
+-
+-
+- P frame Motion Vector Search (Normalized)
+-
+-
+-
+- Technique
+- Compression1
+- Speed 2
+- Quality 3
+-
+-
+- Exhaustive
+- 1000
+- 1000
+- 1000
+-
+-
+- SubSample
+- 1008
+- 2456
+- 1000
+-
+-
+- TwoLevel
+- 1009
+- 3237
+- 1000
+-
+-
+- Logarithmic
+- 1085
+- 8229
+- 998
+-
+-
+-
+-
+- B frame Motion Vector Search (Normalized)
+-
+-
+-
+- Technique
+- Compression1
+- Speed2
+- Quality3
+-
+-
+- Exhaustive
+- 1000
+- 1000
+- 1000
+-
+-
+- Cross2
+- 975
+- 1000
+- 996
+-
+-
+- Simple
+- 938
+- 1765
+- 991
+-
+-
+-
+- 1Smaller numbers are better
+-compression.
+-
+- 2Larger numbers mean faster
+-execution.
+-
+- 3Larger numbers mean better quality.
+-
+-For some reason, Simple seems to give better compression, but it
+-depends on the image sequence.
+-
+-
Select the search techniques with the PSEARCH_ALG and
+-BSEARCH_ALG parameter file statements.
+-
+-
+-
Group Of Pictures (GOP)
+-
+-A Group of Pictures (GOP) is a roughly independently decodable
+-sequence of frames. An MPEG video stream is made of one or more
+-GOP's. You may specify how many frames should be in each GOP with the
+-GOP_SIZE parameter file statement. A GOP always starts with an
+-I frame.
+-
+-
Instead of encoding an entire sequence, you can encode a single
+-GOP. To do this, use the -gop command option. You can later
+-join the resulting GOP files at any time by running ppmtompeg
+-with the -combine_gops command option.
+-
+-
+-
Slices
+-
+-A slice is an independently decodable unit in a frame. It can be
+-as small as one macroblock, or it can be as big as the entire frame.
+-Barring transmission error, adding slices does not change quality or
+-speed; the only effect is slightly worse compression. More slices are
+-used for noisy transmission so that errors are more recoverable. Since
+-usually errors are not such a problem, we usually just use one slice
+-per frame.
+-
+-
Control the slice size with the SLICES_PER_FRAME parameter
+-file statement.
+-
+-
Some MPEG playback systems require that each slice consist of whole
+-rows of macroblocks. If you are encoding for this kind of player, if
+-the height of the image is H pixels, then you should set the
+-SLICES_PER_FRAME to some number which divides H/16. For example, if
+-the image is 240 pixels (15 macroblocks) high, then you should use
+-only 15, 5, 3, or 1 slices per frame.
+-
+-
Note: these MPEG playback systems are really wrong, since the MPEG
+-standard says this doesn't have to be so.
+-
+-
+-
+-
Search Window
+-
+-The search window is the window in which ppmtompeg searches
+-for motion vectors. The window is a square. You can specify the size
+-of the square, and whether to allow half-pixel motion vectors or not,
+-with the RANGE and PIXEL parameter file statements.
+-
+-
I Frames, P Frames, B Frames
+-
+-In MPEG-1, a movie is represented as a sequence of MPEG frames,
+-each of which is an I Frame, a P Frame, or a B Frame. Each represents
+-an actual frame of the movie (don't get confused by the dual use of
+-the word "frame." A movie frame is a graphical image. An MPEG frame
+-is a set of data that describes a movie frame).
+-
+-
An I frame ("intra" frame) describes a movie frame in isolation --
+-without respect to any other frame in the movie. A P frame
+-("predictive" frame) describes a movie frame by describing how it
+-differs from the movie frame described by the latest preceding I or
+-P frame. A B frame ("bidirectional" frame) describes a movie frame by
+-describing how it differs from the movie frames described by the
+-nearest I or P frame before and after it.
+-
+-
Note that the first frame of a movie must be described by an I
+-frame (because there is no previous movie frame) and the last movie
+-frame must be described by an I or P frame (because there is no
+-subsequent movie frame).
+-
+-
Beyond that, you can choose which frames are represented by which
+-types. You specify a pattern, such as IBPBP and ppmtompeg
+-simply repeats it over and over throughout the movie. The pattern
+-affects speed, quality, and stream size. Here is a chart which shows
+-some of the trade-offs:
+-
+-
+- Comparison of I/P/B Frames (Normalized)
+-
+-
+-
+- Frame Type
+- Size
+- Speed
+- Quality
+-
+-
+- I frames
+- 1000
+- 1000
+- 1000
+-
+-
+- P frames
+- 409
+- 609
+- 969
+-
+-
+- B frames
+- 72
+- 260
+- 919
+-
+-
+-
+-(this is with constant qscale)
+-
+-A standard sequence is IBBPBBPBBPBBPBB.
+-
+-
Select the sequence with the PATTERN parameter file statement.
+-
+-
Since the last MPEG frame cannot be a B frame (see above), if the
+-pattern you specify indicates a B frame for the last movie frame of
+-the movie, ppmtompeg makes it an I frame instead.
+-
+-
Before Netpbm 10.26 (January 2005), ppmtompeg instead drops
+-the trailing B frames by default, and you need the
+-FORCE_ENCODE_LAST_FRAME parameter file statement to make it do
+-this.
+-
+-
The MPEG frames don't appear in the MPEG-1 stream in the same order that
+-the corresponding movie frames appear in the movie -- the B frames come after
+-the I and P frames on which they are based. For example, if the movie is
+-4 frames that you will represent with the pattern IBBP, the MPEG-1 stream
+-will start with an I frame describing movie frame 0. The next frame in
+-the MPEG-1 stream is a P frame describing movie frame 3. The last two
+-frames in the MPEG-1 stream are B frames describing movie frames 1 and 2,
+-respectively.
+-
+-
+-
Specifying Input and Output Files
+-
+-Specify the input frame images with the INPUT_DIR,
+-INPUT, END_INPUT, BASE_FILE_FORMAT,
+-SIZE, YUV_FORMAT and INPUT_CONVERT parameter
+-file statements.
+-
+-
Specify the output file with the OUTPUT parameter file statement.
+-
+-
+-
Statistics
+-
+-ppmtompeg can generate a variety of statistics about the
+-encoding. See the -stat, -snr, -mv_histogram,
+--quiet, -no_frame_summary, and -bit_rate_info
+-options.
+-
+-
+-
PARALLEL OPERATION
+-
+-You can run ppmtompeg on multiple machines at once, encoding
+-the same MPEG stream. When you do, the machines are used as shown in
+-the following diagram. We call this "parallel mode."
+-
+-
+-
+-
To do parallel processing, put the statement
+-
+-
+- PARALLEL
+-
+-
+-in the parameter file, followed by a listing of the machines, one
+-machine per line, then
+-
+-
+- END_PARALLEL
+-
+-
+-Each of the machine lines must be in one of two forms. If the machine
+-has filesystem access to the input files, then the line is:
+-
+-
+-machine user executable
+-
+-
The executable is normally ppmtompeg (you may need to give
+-the complete path if you've built for different architectures). If
+-the machine does not have filesystem access to the input files, the line
+-is:
+-
+-
REMOTE machine user executable
+-parameter file
+-
+-
The -max_machines command option limits the number of
+-machines ppmtompeg will use. If you specify more machines in
+-the parameter file than -max_machines allows, ppmtompeg
+-uses only the machines listed first. This is handy if you want to
+-experiment with different amounts of parallelism.
+-
+-
In general, you should use full path file names when describing
+-executables and parameter files. This includes the parameter
+-file argument on the original invocation of ppmtompeg.
+-
+-
All file names must be the same on all systems (so if e.g. you're
+-using an NFS filesystem, you must make sure it is mounted at the same
+-mountpoint on all systems).
+-
+-
Because not all of the processes involved in parallel operation
+-have easy access to the input files, you must specify the SIZE
+-parameter file statement when you do parallel operation.
+-
+-
The machine on which you originally invoke ppmtompeg is the
+-master machine. It hosts a "combine server,", a
+-"decode server," and a number of "i/o servers,"
+-all as separate processes. The other machines in the network (listed
+-in the parameter file) are slave machines. Each hosts a single
+-process that continuously requests work from the master and does it.
+-The slave process does the computation to encode MPEG frames. It
+-processes frames in batches identified by the master.
+-
+-
The master uses a remote shell command to start a process on a
+-slave machine. By default, it uses an rsh shell command to do
+-this. But use the RSH parameter file statement to control
+-this. The shell command the master executes remotely is
+-ppmtompeg, but with options to indicate that it is to perform
+-slave functions.
+-
+-
The various machines talk to each other over TCP connections. Each
+-machine finds and binds to a free TCP port number and tells its
+-partners the port number. These port numbers are at least 2048.
+-
+-
Use the PARALLEL_TEST_FRAMES, PARALLEL_TIME_CHUNKS, and
+-PARALLEL_PERFECT parameter file statements to control the way the
+-master divides up work among the slaves.
+-
+-
Use the -nice command option to cause all slave processes to run
+-"nicely," i.e. as low priority processes. That way, this substantial and
+-long-running CPU load will have minimal impact on other, possibly
+-interactive, users of the systems.
+-
+-
SPEED
+-
+-Here is a look at ppmtompeg speed, in single-node (not parallel)
+-operation:
+-
+-
+- Compression Speed
+-
+-
+-
+- Machine Type
+- Macroblocks per second1
+-
+-
+- HP 9000/755
+- 280
+-
+-
+- DEC 3000/400
+- 247
+-
+-
+- HP 9000/750
+- 191
+-
+-
+- Sparc 10
+- 104
+-
+-
+- DEC 5000
+- 68
+-
+-
+-1A macroblock is a 16x16 pixel square
+-
+-The measurements in the table are with inputs and outputs via a
+-conventional locally attached filesystem. If you are using a network
+-filesystem over a single 10 MB/s Ethernet, that constrains your speed more
+-than your CPU speed. In that case, don't expect to get better than 4
+-or 5 frames per second no matter how fast your CPUs are.
+-
+-
Network speed is even more of a bottleneck when the slaves do not
+-have filesystem access to the input files -- i.e. you declare them
+-REMOTE.
+-
+-
Where I/O is the bottleneck, size of the input frames can make a big
+-difference. So YUV input is better than PPM, and JPEG is better than
+-both.
+-
+-
When you're first trying to get parallel mode working, be sure to
+-use the -debug_machines option so you can see what's going on.
+-Also, -debug_sockets can help you diagnose communication
+-problems.
+-
+-
+-
AUTHORS
+-
+-
+-
+-- Kevin Gong - University of California, Berkeley, keving@cs.berkeley.edu
+-
+-
- Ketan Patel - University of California, Berkeley, kpatel@cs.berkeley.edu
+-
+-
- Dan Wallach - University of California, Berkeley, dwallach@cs.berkeley.edu
+-
+-
- Darryl Brown - University of California, Berkeley, darryl@cs.berkeley.edu
+-
+-
- Eugene Hung - University of California, Berkeley, eyhung@cs.berkeley.edu
+-
+-
- Steve Smoot - University of California, Berkeley, smoot@cs.berkeley.edu
+-
+-
+-
+-
+-Table Of Contents
+-
-- SYNOPSIS
-
- DESCRIPTION
-
- OPTIONS
--
- PARAMETERS
--
- NOTES
-+
- SYNOPSIS
-+- DESCRIPTION
-+- OPTIONS
-+- PARAMETERS
-+- NOTES
-
-- - Input Images
--
- Mapped-texture Stereograms
--
- Miscellaneous
-+
- Input Images
-+ - Mapped-texture Stereograms
-+ - Miscellaneous
-
--- EXAMPLES
--
- SEE ALSO
--
- HISTORY
--
- AUTHOR
-+
- EXAMPLES
-+- SEE ALSO
-+- HISTORY
-+- AUTHOR
-
-
-
-diff -urNp a/userguide/pamhomography.html b/userguide/pamhomography.html
---- a/userguide/pamhomography.html 2021-01-26 15:19:07.403345047 +0100
-+++ b/userguide/pamhomography.html 2021-01-26 15:29:36.659652764 +0100
-@@ -9,7 +9,7 @@
-
-
-
--pamhomography
-+pamhomography
-
- Updated: 03 January 2021
-
-@@ -29,7 +29,7 @@ Updated: 03 January 2021
- [-mapfile=map_file]
- [-view=coords]
- [-fill=color]
-- [pam_file]
-+ [pam_file]
-
- You can abbreviate any option to its shortest unique prefix. You can use
- two hyphens instead of one to delimit an option. You can separate an option
-@@ -42,7 +42,7 @@ from its value with whitespace instead o
- of Netpbm.
-
- pamhomography transforms a quadrilateral—not necessarily
--rectangular—region of an image, producing a new image.
-+rectangular—region of an image, producing a new image.
-
- You can do any
- affine image transformation: translation, reflection, scaling,
-@@ -111,9 +111,9 @@ quadrilateral.
- This is the color with which the program fills all pixels that lie outside
- of the target quadrilateral. Specify the color as described for the
-
--argument of the pnm_parsecolor() library routine.
-+argument of the pnm_parsecolor() library routine.
-
--The default is black, and for images with a transparency plane, transparent.
-+
The default is black, and for images with a transparency plane, transparent.
-
-
-
-@@ -132,7 +132,7 @@ by map_file.
-
- pamhomography's only parameter, pam_file, is the name of the
- file containing the input image. If you don't specify pam_file, the
-- image comes from Standard Input.
-+ image comes from Standard Input.
-
-
- NOTES
-@@ -260,23 +260,23 @@ preceding examples:
- SEE ALSO
-
-
-- - pamcut
--
- pamenlarge
--
- pamflip
--
- pamperspective
--
- pamscale
--
- pamstretch
--
- pam
--
- pnmmargin
--
- pnmpad
--
- pnmrotate
--
- pnmshear
-+
- pamcut
-+ - pamenlarge
-+ - pamflip
-+ - pamperspective
-+ - pamscale
-+ - pamstretch
-+ - pam
-+ - pnmmargin
-+ - pnmpad
-+ - pnmrotate
-+ - pnmshear
-
-
-
- SEE ALSO
-
--pamhomography was new in Netpbm 10.94 (March 2021).
-+
pamhomography was new in Netpbm 10.94 (March 2021).
-
-
- AUTHOR
-diff -urNp a/userguide/pamhomography.1 b/userguide/pamhomography.1
---- a/userguide/pamhomography.1 1970-01-01 01:00:00.000000000 +0100
-+++ b/userguide/pamhomography.1 2021-01-26 15:23:06.759944223 +0100
-@@ -0,0 +1,407 @@
-+\
-+.\" This man page was generated by the Netpbm tool 'makeman' from HTML source.
-+.\" Do not hand-hack it! If you have bug fixes or improvements, please find
-+.\" the corresponding HTML page on the Netpbm website, generate a patch
-+.\" against that, and send it to the Netpbm maintainer.
-+.TH "pamhomography" 1 "03 January 2021" "netpbm documentation"
-+
-+
-+
-+
-+
-+
-+.UN NAME
-+.SH NAME
-+.PP
-+pamhomography - map one arbitrary quadrilateral image region to another
-+
-+
-+.UN SYNOPSIS
-+.SH SYNOPSIS
-+.PP
-+\fBpamhomography\fP
-+ [\fB-from\fP=\fIcoords\fP]
-+ [\fB-to\fP=\fIcoords\fP]
-+ [\fB-mapfile\fP=\fImap_file\fP]
-+ [\fB-view\fP=\fIcoords\fP]
-+ [\fB-fill\fP=\fIcolor\fP]
-+ [\fIpam_file\fP]
-+.PP
-+You can abbreviate any option to its shortest unique prefix. You can use
-+two hyphens instead of one to delimit an option. You can separate an option
-+from its value with whitespace instead of \f(CW=\fP.
-+
-+
-+.UN DESCRIPTION
-+.SH DESCRIPTION
-+.PP
-+This program is part
-+of
-+.UR http://netpbm.sourceforge.net/
-+Netpbm
-+.UE
-+\&.
-+.PP
-+\fBpamhomography\fP transforms a quadrilateral-not necessarily
-+rectangular-region of an image, producing a new image.
-+.PP
-+You can do any
-+.UR https://en.wikipedia.org/wiki/Affine_transformation#Image_transformation
-+affine image transformation
-+.UE
-+\&: translation, reflection, scaling,
-+rotation, and shearing/skewing. However, \fBpamhomography\fP additionally can
-+do \fIbilinear\fP transforms, which means it can warp any quadrilateral to any
-+other quadrilateral, even when this mapping cannot be described using a single
-+set of linear equations. This can be useful, for example, for creating
-+perspective views of rectangular images or for reverse-mapping a perspective
-+view back to a rectangular projection.
-+
-+
-+.UN OPTIONS
-+.SH OPTIONS
-+.PP
-+In addition to the options common to all programs based on libnetpbm (most
-+notably \fB-quiet\fP, see
-+.UR http://index.html#commonoptions
-+Common Options
-+.UE
-+\&), \fBpamhomography\fP recognizes the following command line
-+options:
-+
-+
-+
-+- \fB-from\fP=\fIcoords\fP
-+.sp
-+This defines the source quadrilateral. \fIcoords\fP is a list of four
-+ integer-valued (\fIx\fP, \fIy\fP) coordinates. If you do not
-+ specify \fB-from\fP, the source quadrilateral is taken to be the four
-+ corners of the input image in clockwise order, starting from the upper
-+ left.
-+
-+
-+
- \fB-to\fP=\fIcoords\fP
-+.sp
-+This defines the target quadrilateral. \fIcoords\fP is a list of four
-+integer-valued (\fIx\fP, \fIy\fP) coordinates. If you do not
-+specify \fB-to\fP, the target quadrilateral is taken to be the four corners
-+of the input image in clockwise order, starting from the upper left.
-+
-+
-+
- \fB-mapfile\fP=\fImap_file\fP
-+.sp
-+This names a text file that describes the mapping from the source to the
-+target quadrilateral. The file \fImap_file\fP must contain either eight
-+integer-valued (\fIx\fP, \fIy\fP) coordinates, being the four source
-+coordinates followed by the corresponding four target coordinates, or only
-+four (\fIx\fP, \fIy\fP) coordinates, being only the four target
-+coordinates. In the latter case, the source quadrilateral is taken to be the
-+four corners of the input image in clockwise order, starting from the upper
-+left.
-+
-+
-+
- \fB-view\fP=\fIcoords\fP
-+.sp
-+This defines the target view. \fIcoords\fP is a list of two integer-valued
-+(\fIx\fP, \fIy\fP) coordinates: the upper left and lower right boundaries,
-+respectively, of the pixels that will be visible in the output image. If
-+\fB-view\fP is not specified, the target view will fit precisely the target
-+quadrilateral.
-+
-+
-+
- \fB-fill\fP=\fIcolor\fP
-+.sp
-+This is the color with which the program fills all pixels that lie outside
-+of the target quadrilateral. Specify the color as described for the
-+.UR http://libnetpbm_image.html#colorname
-+ argument of the pnm_parsecolor() library routine
-+.UE
-+\&.
-+.sp
-+The default is black, and for images with a transparency plane, transparent.
-+
-+
-+
-+.PP
-+Cooordinates should normally be specified in clockwise order. The syntax is
-+fairly flexible: all characters other than the plus sign, minus sign, and
-+digits are treated as separators. Although coordinates need to be integers,
-+they may lie outside the image's boundary.
-+.PP
-+If you specify \fB-mapfile\fP along with \fB-from\fP and/or \fB-to\fP,
-+\fB-from\fP and \fB-to\fP override the quadrilaterals specified
-+by \fImap_file\fP.
-+
-+
-+.UN PARAMETERS
-+.SH PARAMETERS
-+.PP
-+\fBpamhomography\fP's only parameter, \fIpam_file\fP, is the name of the
-+ file containing the input image. If you don't specify \fIpam_file\fP, the
-+ image comes from Standard Input.
-+
-+
-+.UN NOTES
-+.SH NOTES
-+.PP
-+The output image uses the same Netpbm format as the input image.
-+.PP
-+Simple transformations are best handled by other Netpbm programs, such as
-+those listed in the
-+.UR #SEE-ALSO
-+\&'SEE ALSO'
-+.UE
-+\& section
-+below. Use \fBpamhomography\fP for more sophisticated transformations such as
-+perspective adjustments, rotations around an arbitrary point in the image,
-+extraction of non-rectangular quadrilaterals, shearings by coordinates rather
-+than by angle, and, in general, all transformations that are most easily
-+expressed as mapping four points in one image to four points in another
-+image.
-+
-+.UN EXAMPLES
-+.SH EXAMPLES
-+.PP
-+The following examples use the
-+.UR park_row.ppm
-+park_row.ppm
-+.UE
-+\& test image, which is a
-+.UR https://commons.wikimedia.org/wiki/File:15_Park_Row_3.JPG
-+ photograph of New York City's Park Row Building
-+.UE
-+\&, scaled to
-+441×640, converted to a PPM file, and redistributed under the terms of
-+the
-+.UR https://en.wikipedia.org/wiki/GNU_Free_Documentation_License
-+ GFDL
-+.UE
-+\&.
-+.PP
-+The first example showcases the real power of bilinear transformations.
-+Assuming \fIpark_row_rect.map\fP has the following contents:
-+
-+.nf\f(CW (147, 51) (316, 105) (402, 595) (92, 560)
-+ (0, 0) (440, 0) (440, 639) (0, 639)\fP
-+.PP
-+then
-+
-+.nf\f(CW pamhomography -mapfile park_row_rect.map park_row.ppm > park_row_rect.ppm\fP
-+.PP
-+projects the building's facade from a perspective view to a rectilinear
-+front-on view. Remember that \fBpamhomography\fP ignores the parentheses and
-+commas used in \fIpark_row_rect.map\fP; they merely make the file more
-+human-readable. We equivalently could have written
-+
-+.nf\f(CW 147 51 316 105 402 595 92 560 0 0 440 0 440 639 0 639\fP
-+.PP
-+or any of myriad other variations.
-+.PP
-+\fBpamhomography\fP can warp the image to a trapezoid to make it look like
-+it's leaning backwards in 3-D:
-+
-+.nf\f(CW pamhomography -to '50,0 390,0 440,200 0,200' park_row.ppm > park_row_trap.ppm\fP
-+.PP
-+As a very simple example,
-+
-+.nf\f(CW pamhomography -to '440,0 0,0 0,639 440,639' park_row.ppm > park_row_flip.ppm\fP
-+.PP
-+flips the image left-to-right. Note that in this case the target
-+quadrilateral's coordinates are listed in counterclockwise order because
-+that represents the correspondence between points (0, 0) ↔ (440, 0) and
-+(0, 639) ↔ (639, 0).
-+.PP
-+Scaling is also straightforward. The following command scales down the
-+image from 441×640 to 341×540:
-+
-+.nf\f(CW pamhomography -to '0,0 340,0 340,539 0,539' park_row.ppm > park_row_small.ppm\fP
-+.PP
-+Let's add 100 pixels of tan border to the above. We use \fB-view\fP and
-+\fB-fill\fP to accomplish that task:
-+
-+.nf\f(CW pamhomography -to '0,0 340,0 340,539 0,539' -view '-100,-100 440,639' -fill tan park_row.ppm > park_row_small_border.ppm\fP
-+.PP
-+We can add a border without having to scale the image:
-+
-+.nf\f(CW pamhomography -view '-100,-100 540,739' -fill tan park_row.ppm > park_row_border.ppm\fP
-+.PP
-+The \fB-view\fP option can also be used to extract a rectangle out of an
-+image, discarding the rest of the image:
-+
-+.nf\f(CW pamhomography -view '130,10 205,80' park_row.ppm > park_row_cut.ppm\fP
-+.PP
-+Specifying the same set of coordinates to \fB-from\fP and \fB-to\fP has
-+the same effect but also allows you to extract non-rectangular quadrilaterals
-+from an image:
-+
-+.nf\f(CW pamhomography -from '185,300 310,325 320,425 180,405' -to '185,300 310,325 320,425 180,405' park_row.ppm > park_row_cut_2.ppm\fP
-+.PP
-+Rotation is doable but takes some effort. The challenge is that you need to
-+compute the rotated coordinates yourself. The matrix expression to rotate
-+points \e((x_1, y_1)\e) \e((x_2, y_2)\e), \e((x_3, y_3)\e), and \e((x_4, y_4)\e)
-+clockwise by \e(\etheta\e) degrees around point \e((c_x, c_y)\e) is
-+.PP
-+\e[ \ebegin{bmatrix} 1 & 0 & c_x \e\e 0 & 1 & c_y \e\e 0 & 0
-+& 1 \eend{bmatrix} \ebegin{bmatrix} \ecos \etheta & -\esin \etheta & 0
-+\e\e \esin \etheta & \ecos \etheta & 0 \e\e 0 & 0 & 1 \eend{bmatrix}
-+\ebegin{bmatrix} 1 & 0 & -c_x \e\e 0 & 1 & -c_y \e\e 0 & 0
-+& 1 \eend{bmatrix} \ebegin{bmatrix} x_1 & x_2 & x_3 & x_4 \e\e y_1
-+& y_2 & y_3 & y_4 \e\e 1 & 1 & 1 & 1 \eend{bmatrix}
-+\equad. \e]
-+.PP
-+For example, to rotate \fIpark_row.ppm\fP 30° clockwise around (220,
-+320) you would compute
-+.PP
-+\e[ \ebegin{bmatrix} 1 & 0 & 220 \e\e 0 & 1 & 320 \e\e 0 & 0
-+& 1 \eend{bmatrix} \ebegin{bmatrix} \ecos 30^{\ecirc} & -\esin 30^{\ecirc}
-+& 0 \e\e \esin 30^{\ecirc} & \ecos 30^{\ecirc} & 0 \e\e 0 & 0 & 1
-+\eend{bmatrix} \ebegin{bmatrix} 1 & 0 & -220 \e\e 0 & 1 & -320 \e\e
-+0 & 0 & 1 \eend{bmatrix} \ebegin{bmatrix} 0 & 440 & 440 & 0
-+\e\e 0 & 0 & 639 & 639 \e\e 1 & 1 & 1 & 1 \eend{bmatrix} =
-+\ebegin{bmatrix} 189.4744 & 570.5256 & 251.0256 & -130.0256 \e\e
-+-67.1281 & 152.8719 & 706.2621 & 486.2621 \e\e 1.0000 & 1.0000
-+& 1.0000 & 1.0000 \eend{bmatrix} \equad, \e]
-+.PP
-+round these coordinates to integers, transpose the matrix, and produce the
-+following map file, \fIpark_row_rot30.map\fP:
-+
-+.nf\f(CW 189 -67
-+ 571 153
-+ 251 706
-+ -130 486\fP
-+.PP
-+(These are the 'to' coordinates; we use the default, full-image
-+\&'from' coordinates.) The mapping then works as in all of the
-+preceding examples:
-+
-+.nf\f(CW pamhomography -mapfile park_row_rot30.map park_row.ppm > park_row_rot30.ppm\fP
-+
-+
-+.UN SEE-ALSO
-+.SH SEE ALSO
-+
-+
-+.IP \(bu
-+
-+.BR "pamcut" (1)\c
-+\&
-+.IP \(bu
-+
-+.BR "pamenlarge" (1)\c
-+\&
-+.IP \(bu
-+
-+.BR "pamflip" (1)\c
-+\&
-+.IP \(bu
-+
-+.BR "pamperspective" (1)\c
-+\&
-+.IP \(bu
-+
-+.BR "pamscale" (1)\c
-+\&
-+.IP \(bu
-+
-+.BR "pamstretch" (1)\c
-+\&
-+.IP \(bu
-+
-+.BR "pam" (1)\c
-+\&
-+.IP \(bu
-+
-+.BR "pnmmargin" (1)\c
-+\&
-+.IP \(bu
-+
-+.BR "pnmpad" (1)\c
-+\&
-+.IP \(bu
-+
-+.BR "pnmrotate" (1)\c
-+\&
-+.IP \(bu
-+
-+.BR "pnmshear" (1)\c
-+\&
-+
-+
-+
-+.UN SEE-ALSO
-+.SH SEE ALSO
-+.PP
-+\fBpamhomography\fP was new in Netpbm 10.94 (March 2021).
-+
-+
-+.UN AUTHOR
-+.SH AUTHOR
-+.PP
-+Copyright \(co 2020 Scott
-+Pakin, \fIscott+pbm@pakin.org\fP
-+
-+
-+.UN index
-+.SH Table of Contents
-+
-+
-+.IP \(bu
-+
-+.UR #SYNOPSIS
-+SYNOPSIS
-+.UE
-+\&
-+.IP \(bu
-+
-+.UR #DESCRIPTION
-+DESCRIPTION
-+.UE
-+\&
-+.IP \(bu
-+
-+.UR #OPTIONS
-+OPTIONS
-+.UE
-+\&
-+.IP \(bu
-+
-+.UR #PARAMETERS
-+PARAMETERS
-+.UE
-+\&
-+.IP \(bu
-+
-+.UR #NOTES
-+NOTES
-+.UE
-+\&
-+.IP \(bu
-+
-+.UR #EXAMPLES
-+EXAMPLES
-+.UE
-+\&
-+.IP \(bu
-+
-+.UR #SEE-ALSO
-+SEE ALSO
-+.UE
-+\&
-+.IP \(bu
-+
-+.UR #HISTORY
-+HISTORY
-+.UE
-+\&
-+.IP \(bu
-+
-+.UR #AUTHOR
-+AUTHOR
-+.UE
-+\&
-+.SH DOCUMENT SOURCE
-+This manual page was generated by the Netpbm tool 'makeman' from HTML
-+source. The master documentation is at
-+.IP
-+.B http://netpbm.sourceforge.net/doc/pamhomography.html
-+.PP
-\ Chybà znak konce řádku na konci souboru
+-The Libnetpbm Netpbm Image --Processing Manual describes the the libnetpbm functions for -+Processing Manual describes the libnetpbm functions for - processing image data. - -
The Libnetpbm Utility Manual -diff --git a/userguide/pamfunc.html b/userguide/pamfunc.html -index 60d53d6..80f90f2 100644 ---- a/userguide/pamfunc.html -+++ b/userguide/pamfunc.html -@@ -60,7 +60,7 @@ output image. - and bit string (such as and with 01001000). For the arithmetic functions, the - function arguments and results are the fraction that a sample is of the - maxval, i.e. normal interpretation of PAM tuples. But for the bit string --functions, the value is the the bit string whose value as a binary cipher is -+functions, the value is the bit string whose value as a binary cipher is - the sample value, and the maxval indicates the width of the bit string. - -
In addition to the options common to all programs based on libnetpbm - (most notably -quiet, see - Common Options), pbmtog3 recognizes the following --command line options: -+command line options:
- -Before Netpbm 10.79 (June 2017), there was a different program by the same --name in Netpbm, which was written by by Paul Haeberli -+name in Netpbm, which was written by Paul Haeberli - <paul@manray.sgi.com> in 1989 - and then modified extensively by others. - -diff --git a/userguide/ppmtompeg.html b/userguide/ppmtompeg.html -deleted file mode 100644 -index af5a8d7..0000000 ---- a/userguide/ppmtompeg.html -+++ /dev/null -@@ -1,1294 +0,0 @@ -- --
This program is part of Netpbm. -- --
ppmtompeg produces an MPEG-1 video stream. MPEG-1 is the --first great video compression method, and is what is used in Video CDs --(VCD). ppmtompeg originated in the year 1995. DVD uses a more --advanced method, MPEG-2. There is an even newer method called MPEG-4 --which is also called Divx. I don't know where one finds that used. -- --
There's technically a difference between a compression method for --video and an actual file (stream) format for a movie, and I don't know --if it can be validly said that the format of the stream --ppmtompeg produces is MPEG-1. -- --
Mencoder from the Mplayer --package is probably superior for most video format generation --needs, if for no other reason than that it is more popular. -- --
The programming library PM2V --generates MPEG-2 streams. -- --
Use Mplayer (not part of Netpbm) --to do the reverse conversion: to create a series of PNM files from an MPEG --stream. -- --
param_file is a parameter file which includes a list of --input files and other parameters. The file is described in detail --below. -- --
To understand this program, you need to understand something about --the complex MPEG-1 format. One source of information about this --standard format is the section Introduction to MPEG in the Compression FAQ. -- --
The -gop, -combine_gops, -frames, and ---combine_frames options are all mutually exclusive. -- --
These statistics include how many I, P, and B frames there were, --and information about compression and quality. -- -- --
Thus, unless you're mixing and matching GOP files from different --sources, you can simply use the same parameter file for creating the --GOP files (-gop) and for later turning them into an MPEG stream --(-combine_gops). -- -- --
Use ppmtompeg -combine_frames to combine these frames later into --an MPEG stream. -- -- --
The parameter file may specify input frame files in the same manner --as normal input files -- except instead of using INPUT_DIR, INPUT, and --END_INPUT, use FRAME_INPUT_DIR, FRAME_INPUT, and FRAME_END_INPUT. If --no input frame files are specified, then the default is to use the --output file name with suffix .frame.frame_num, with --frame_num starting from 0, as the input files. -- -- -- --
The output is in the form of a matrix, each entry corresponding to one --motion vector in the search window. The center of the matrix --represents (0,0) motion vectors. -- --
The parameter file must contain the following --lines (except when using the -combine_gops or -combine_frames --options): -- --
-- PATTERN IBBPBBPBBPBBPBB ---- --
See I Frames, P Frames, B Frames. -- --
To have ppmtompeg read all the frames serially from Standard --Input, specify --
-- INPUT_DIR stdin ---- --
There are three types of lines between INPUT and END_INPUT. First, --a line may simply be the name of an input file. Second, the line --may be of the form single_star_expr --[x-y]. --single_star_expr can have a single * in it. It is --replaced by all the numbers between x and y inclusive. So, for --example, the line tennis*.ppm [12-15] refers to the files --tennis12.ppm, tennis13.ppm, tennis14.ppm, tennis15.ppm. -- --
Uniform zero-padding occurs, as well. For example, the line --football.*.ppm [001-130] refers to the files football.001.ppm, --football.002.ppm, ..., football.009.ppm, football.010.ppm, ..., --football.130.ppm. -- --
The third type of line is: single_star_expr --[x-y+s], where the --line is treated exactly as above, except that we skip by s. Thus, the --line football.*.ppm [001-130+4] refers to the files --football.001.ppm, football.005.ppm, football.009.ppm, --football.013.ppm, etc. -- --
Furthermore, a line may specify a shell command to execute to --generate lines to be interpreted as described above, as if those lines --were in the parameter file instead. Use back ticks, like in the --Bourne Shell, like this: -- --
-- `cat myfilelist` ---- --
--If input is from Standard Input (per the INPUT_DIR statement), --ppmtompeg ignores the INPUT/END_INPUT block, but --it still must be present. -- --
-- INPUT_CONVERT * ---- --
Otherwise, conversion_command is a shell command that causes --an image in the format your specified with BASE_FILE_FORMAT to --be written to Standard Output. ppmtompeg executes the command --once for each line between INPUT and END_INPUT (which is --normally, but not necessarily, a file name). In the conversion --command, ppmtompeg replaces each '*' with the contents of that --line. -- -- If you had a bunch of gif files, you might say: --
-- INPUT_CONVERT giftopnm * ---- -- If you have a bunch of separate a.Y, a.U, and a.V files (where -- the U and V have already been subsampled), then you might say: -- --
-- INPUT_CONVERT cat *.Y *.U *.V ---- --
Input conversion is not allowed with input from stdin, so use -- --
-- INPUT_CONVERT * ---- --as described above. -- --
width and height are the width and height of each --frame in pixels. -- --
When ppmtompeg can get this information from the input image --files, it ignores the SIZE parameter and you may omit it. -- --
When the image files are in YUV format, the files don't contain --dimension information, so SIZE is required. -- --
When ppmtompeg is running in parallel mode, not all of the --processes in the network have access to the image files, so --SIZE is required and must give the same dimensions as the --input image files. -- --
Normally, it makes sense to make your GOP size a multiple of your --pattern length (the latter is determined by the PATTERN parameter file --statement). -- --
See Group Of Pictures. -- --
| Reference | --Compression | --Speed | --Quality I | --Quality P | --Quality B | --
|---|---|---|---|---|---|
| Decoded | --1000 | --1000 | --1000 | --969 | --919 | --
| Original | --885 | --1373 | --1000 | --912 | --884 | --
The following lines are optional: -- --
Before Netpbm 10.26 (January 2005), ppmtompeg would drop --trailing B frames from your movie, since a movie can't end with a B --frame. (See I Frames, P Frames, B Frames. --You would have to specify FORCE_ENCODE_LAST_FRAME to stop --that from happening and get the same function that ppmtompeg --has today. -- -- --
--The 8 lines immediately following NIQTABLE specify the quantization --table. Each line defines a table row and consists of 8 integers, --whitespace-delimited, which define the table columns. -- --
ratio must be 1.0, 0.6735, 0.7031, 0.7615, 0.8055, 0.8437, --0.8935, 0.9157, 0.9815, 1.0255, 1.0695, 1.0950, 1.1575, or 1.2015. -- --
rate must be 23.976, 24, 25, 29.97, 30, 50, 59.94, or 60. -- --
rate must be an integer. -- --
A Video Verifying Buffer is a buffer in which a decoder keeps the --decoded bits in order to match the uneven speed of the decoding with --the required constant playback speed. -- --
As ppmtompeg encodes the image, it simulates the decoding --process in terms of how many bits would be in the VBV as each frame gets --decoded, assuming a VBV of the size you indicate. -- --
If you specify the WARN_VBV_UNDERFLOW statement, --ppmtompeg issues a warning each time the simulation underflows --the buffer, which suggests that an underflow would occur on playback, --which suggests the buffer is too small. -- --
If you specify the WARN_VBV_OVERFLOW statement, --ppmtompeg issues a warning each time the simulation overflows --the buffer, which suggests that an overflow would occur on playback, --which suggests the buffer is too small. -- --
These options were new in Netpbm 10.26 (January 2005). Before that, --ppmtompeg issued the warnings always. -- --
If you specify FORCE_I_ALIGN, ppmtompeg will increase --the test frames value enough to maintain the alignment. -- --
If there aren't enough frames for every slave to have the indicated --number of test frames, ppmtompeg will give some slaves fewer. -- -- --
Smaller values of t increase communication, but improve load --balancing. The default is 30 seconds. -- --
You may specify only one of PARALLEL_TIME_CHUNKS, PARALLEL_CHUNK_TAPER, --and PARALLEL_PERFECT. PARALLEL_CHUNK_TAPER is usually best. -- --
You may specify only one of PARALLEL_TIME_CHUNKS, PARALLEL_CHUNK_TAPER, --and PARALLEL_PERFECT. PARALLEL_CHUNK_TAPER is usually best. -- -- --
This has the advantage of minimal scheduling overhead. Where slaves --have different speeds, though, it makes inefficient use of the fast --ones. Where slaves are the same speed, it also has the disadvantage --that they all finish at the same time and feed their output to the --single Combine Server in a burst, which makes less efficient use of --the Combine Server and thus can increase the total elapsed time. -- --
You may specify only one of PARALLEL_TIME_CHUNKS, PARALLEL_CHUNK_TAPER, --and PARALLEL_PERFECT. PARALLEL_CHUNK_TAPER is usually best. -- --
Be sure to set up .rhosts files or SSH key authorizations --where needed. Otherwise, you'll have to type in passwords. -- --
On some HP machines, rsh is the restricted shell, and you want --to specify remsh. -- --
This document used to say there was an argument to --FORCE_I_ALIGN which was the number of frames ppmtompeg --would use (and was required to be a multiple of the pattern length). --But ppmtompeg has apparently always ignored that argument, and --it does now. -- --
This is mostly useful for debugging. -- --
This works only if you're using a shared filesystem to communicate --between the servers. -- --
This option was new in Netpbm 10.26 (January 2005). -- --
If you use the -combine_gops option, then you need to specify --only the SIZE and OUTPUT values in the parameter file. In --addition, the parameter file may specify input GOP files in the same --manner as normal input files -- except instead of using INPUT_DIR, --INPUT, and END_INPUT, use GOP_INPUT_DIR, GOP_INPUT, and GOP_END_INPUT. --If you specify no input GOP files, then ppmtompeg uses by default the --output file name with suffix .gop.gop_num, with gop_num --starting from 0, as the input files. -- --
If you use the -combine_frames option, then you need to --specify only the SIZE, GOP_SIZE, and OUTPUT values in the --parameter file. In addition, the parameter file may specify input --frame files in the same manner as normal input files -- except instead --of using INPUT_DIR, INPUT, and END_INPUT, use FRAME_INPUT_DIR, --FRAME_INPUT, and FRAME_END_INPUT. If no input frame files are --specified, then the default is to use the output file name with suffix --.frame.frame_num, with frame_num starting from 0, --as the input files. -- --
Any number of spaces and tabs may come between each option and value. Lines --beginning with # are ignored. Any other lines are ignored except for --those between INPUT and END_INPUT. This allows you to use the same --parameter file for normal usage and for -combine_gops and ---combine_frames. -- --
The file format is case-sensitive so all keywords should be in --upper case. -- --
The statements may appear in any order, except that the order within --a block statement (such as INPUT ... END INPUT) is significant. -- --
ppmtompeg is prepared to handle up to 16 B frames between --reference frames when encoding with input from stdin. (To build a --modified ppmtompeg with a higher limit, change the constant --B_FRAME_RUN in frame.c and recompile). -- --
The quantization scale values (qscale) give a trade-off between --quality and compression. Using different Qscale values has very little --effect on speed. The qscale values can be set separately for I, P, and --B frames. -- --
You select the qscale values with the IQSCALE, --PQSCALE, and BSCALE parameter file statements. -- --
A qscale value is an integer from 1 to 31. Larger numbers give
--better compression, but worse quality. In the following, the quality
--numbers are peak signal-to-noise ratio, defined as:
--
--where MSE is the mean squared error.
--
--
--
Flower garden tests: -- --
| Qscale | --I Frames | --P Frames | --B Frames | --
|---|---|---|---|
| 1 | --43.2 | --46.3 | --46.5 | --
| 6 | --32.6 | --34.6 | --34.3 | --
| 11 | --28.6 | --29.5 | --30.0 | --
| 16 | --26.3 | --26.8 | --28.6 | --
| 21 | --24.7 | --25.0 | --27.9 | --
| 26 | --23.5 | --23.9 | --27.5 | --
| 31 | --22.6 | --23.0 | --27.3 | --
| Qscale | --I Frames | --P Frames | --B Frames | --
|---|---|---|---|
| 1 | --2 | --2 | --2 | --
| 6 | --7 | --10 | --15 | --
| 11 | --11 | --18 | --43 | --
| 16 | --15 | --29 | --97 | --
| 21 | --19 | --41 | --173 | --
| 26 | --24 | --56 | --256 | --
| 31 | --28 | --73 | --330 | --
There are several different motion vector search techniques --available. There are different techniques available for P frame --search and B frame search. Using different search techniques present --little difference in quality, but a large difference in compression --and speed. -- --
There are 4 types of P frame search: Exhaustive, TwoLevel, --SubSample, and Logarithmic. -- --
There are 3 types of B frame search: Exhaustive, Cross2, and --Simple. -- --The recommended search techniques are TwoLevel and Logarithmic for --P frame search, and Cross2 and Simple for B frame search. Here are --some numbers comparing the different search methods: -- --
| Technique | --Compression1 | --Speed 2 | --Quality 3 | --
|---|---|---|---|
| Exhaustive | --1000 | --1000 | --1000 | --
| SubSample | --1008 | --2456 | --1000 | --
| TwoLevel | --1009 | --3237 | --1000 | --
| Logarithmic | --1085 | --8229 | --998 | --
| Technique | --Compression1 | --Speed2 | --Quality3 | --
|---|---|---|---|
| Exhaustive | --1000 | --1000 | --1000 | --
| Cross2 | --975 | --1000 | --996 | --
| Simple | --938 | --1765 | --991 | --
For some reason, Simple seems to give better compression, but it --depends on the image sequence. -- --
Select the search techniques with the PSEARCH_ALG and --BSEARCH_ALG parameter file statements. -- -- --
A Group of Pictures (GOP) is a roughly independently decodable --sequence of frames. An MPEG video stream is made of one or more --GOP's. You may specify how many frames should be in each GOP with the --GOP_SIZE parameter file statement. A GOP always starts with an --I frame. -- --
Instead of encoding an entire sequence, you can encode a single --GOP. To do this, use the -gop command option. You can later --join the resulting GOP files at any time by running ppmtompeg --with the -combine_gops command option. -- -- --
A slice is an independently decodable unit in a frame. It can be --as small as one macroblock, or it can be as big as the entire frame. --Barring transmission error, adding slices does not change quality or --speed; the only effect is slightly worse compression. More slices are --used for noisy transmission so that errors are more recoverable. Since --usually errors are not such a problem, we usually just use one slice --per frame. -- --
Control the slice size with the SLICES_PER_FRAME parameter --file statement. -- --
Some MPEG playback systems require that each slice consist of whole --rows of macroblocks. If you are encoding for this kind of player, if --the height of the image is H pixels, then you should set the --SLICES_PER_FRAME to some number which divides H/16. For example, if --the image is 240 pixels (15 macroblocks) high, then you should use --only 15, 5, 3, or 1 slices per frame. -- --
Note: these MPEG playback systems are really wrong, since the MPEG --standard says this doesn't have to be so. -- -- -- --
The search window is the window in which ppmtompeg searches --for motion vectors. The window is a square. You can specify the size --of the square, and whether to allow half-pixel motion vectors or not, --with the RANGE and PIXEL parameter file statements. -- --
In MPEG-1, a movie is represented as a sequence of MPEG frames, --each of which is an I Frame, a P Frame, or a B Frame. Each represents --an actual frame of the movie (don't get confused by the dual use of --the word "frame." A movie frame is a graphical image. An MPEG frame --is a set of data that describes a movie frame). -- --
An I frame ("intra" frame) describes a movie frame in isolation -- --without respect to any other frame in the movie. A P frame --("predictive" frame) describes a movie frame by describing how it --differs from the movie frame described by the latest preceding I or --P frame. A B frame ("bidirectional" frame) describes a movie frame by --describing how it differs from the movie frames described by the --nearest I or P frame before and after it. -- --
Note that the first frame of a movie must be described by an I --frame (because there is no previous movie frame) and the last movie --frame must be described by an I or P frame (because there is no --subsequent movie frame). -- --
Beyond that, you can choose which frames are represented by which --types. You specify a pattern, such as IBPBP and ppmtompeg --simply repeats it over and over throughout the movie. The pattern --affects speed, quality, and stream size. Here is a chart which shows --some of the trade-offs: -- --
| Frame Type | --Size | --Speed | --Quality | --
|---|---|---|---|
| I frames | --1000 | --1000 | --1000 | --
| P frames | --409 | --609 | --969 | --
| B frames | --72 | --260 | --919 | --
A standard sequence is IBBPBBPBBPBBPBB. -- --
Select the sequence with the PATTERN parameter file statement. -- --
Since the last MPEG frame cannot be a B frame (see above), if the --pattern you specify indicates a B frame for the last movie frame of --the movie, ppmtompeg makes it an I frame instead. -- --
Before Netpbm 10.26 (January 2005), ppmtompeg instead drops --the trailing B frames by default, and you need the --FORCE_ENCODE_LAST_FRAME parameter file statement to make it do --this. -- --
The MPEG frames don't appear in the MPEG-1 stream in the same order that --the corresponding movie frames appear in the movie -- the B frames come after --the I and P frames on which they are based. For example, if the movie is --4 frames that you will represent with the pattern IBBP, the MPEG-1 stream --will start with an I frame describing movie frame 0. The next frame in --the MPEG-1 stream is a P frame describing movie frame 3. The last two --frames in the MPEG-1 stream are B frames describing movie frames 1 and 2, --respectively. -- -- --
Specify the input frame images with the INPUT_DIR, --INPUT, END_INPUT, BASE_FILE_FORMAT, --SIZE, YUV_FORMAT and INPUT_CONVERT parameter --file statements. -- --
Specify the output file with the OUTPUT parameter file statement. -- -- --
ppmtompeg can generate a variety of statistics about the --encoding. See the -stat, -snr, -mv_histogram, ---quiet, -no_frame_summary, and -bit_rate_info --options. -- -- --
You can run ppmtompeg on multiple machines at once, encoding --the same MPEG stream. When you do, the machines are used as shown in --the following diagram. We call this "parallel mode." -- --
--
--
To do parallel processing, put the statement -- --
-- PARALLEL ---- --in the parameter file, followed by a listing of the machines, one --machine per line, then -- --
-- END_PARALLEL ---- --Each of the machine lines must be in one of two forms. If the machine --has filesystem access to the input files, then the line is: -- --
--machine user executable -- --
The executable is normally ppmtompeg (you may need to give --the complete path if you've built for different architectures). If --the machine does not have filesystem access to the input files, the line --is: -- --
REMOTE machine user executable --parameter file -- --
The -max_machines command option limits the number of --machines ppmtompeg will use. If you specify more machines in --the parameter file than -max_machines allows, ppmtompeg --uses only the machines listed first. This is handy if you want to --experiment with different amounts of parallelism. -- --
In general, you should use full path file names when describing --executables and parameter files. This includes the parameter --file argument on the original invocation of ppmtompeg. -- --
All file names must be the same on all systems (so if e.g. you're --using an NFS filesystem, you must make sure it is mounted at the same --mountpoint on all systems). -- --
Because not all of the processes involved in parallel operation --have easy access to the input files, you must specify the SIZE --parameter file statement when you do parallel operation. -- --
The machine on which you originally invoke ppmtompeg is the --master machine. It hosts a "combine server,", a --"decode server," and a number of "i/o servers," --all as separate processes. The other machines in the network (listed --in the parameter file) are slave machines. Each hosts a single --process that continuously requests work from the master and does it. --The slave process does the computation to encode MPEG frames. It --processes frames in batches identified by the master. -- --
The master uses a remote shell command to start a process on a --slave machine. By default, it uses an rsh shell command to do --this. But use the RSH parameter file statement to control --this. The shell command the master executes remotely is --ppmtompeg, but with options to indicate that it is to perform --slave functions. -- --
The various machines talk to each other over TCP connections. Each --machine finds and binds to a free TCP port number and tells its --partners the port number. These port numbers are at least 2048. -- --
Use the PARALLEL_TEST_FRAMES, PARALLEL_TIME_CHUNKS, and --PARALLEL_PERFECT parameter file statements to control the way the --master divides up work among the slaves. -- --
Use the -nice command option to cause all slave processes to run --"nicely," i.e. as low priority processes. That way, this substantial and --long-running CPU load will have minimal impact on other, possibly --interactive, users of the systems. -- --
Here is a look at ppmtompeg speed, in single-node (not parallel) --operation: -- --
| Machine Type | --Macroblocks per second1 | --
|---|---|
| HP 9000/755 | --280 | --
| DEC 3000/400 | --247 | --
| HP 9000/750 | --191 | --
| Sparc 10 | --104 | --
| DEC 5000 | --68 | --
The measurements in the table are with inputs and outputs via a --conventional locally attached filesystem. If you are using a network --filesystem over a single 10 MB/s Ethernet, that constrains your speed more --than your CPU speed. In that case, don't expect to get better than 4 --or 5 frames per second no matter how fast your CPUs are. -- --
Network speed is even more of a bottleneck when the slaves do not --have filesystem access to the input files -- i.e. you declare them --REMOTE. -- --
Where I/O is the bottleneck, size of the input frames can make a big --difference. So YUV input is better than PPM, and JPEG is better than --both. -- --
When you're first trying to get parallel mode working, be sure to --use the -debug_machines option so you can see what's going on. --Also, -debug_sockets can help you diagnose communication --problems. -- -- --
pammixmulti - blend together multiple PAM images -+
pammixmulti - blend together multiple PAM images
- - -Minimum unique abbreviation of an option is acceptable. You can use a - single hyphen instead of double hyphens to denote options. You can use white - space in place of the equals sign to separate an option name from its --value. -+value.
- - -This file is part of Netpbm. -+
This file is part of Netpbm.
- -pammixmulti mixes two or more images to produce a new image. The - program provides multiple ways to interpret "mix." -@@ -37,7 +37,7 @@ program provides multiple ways to interpret "mix." -
In addition to the options common to all programs based on libnetpbm - (most notably -quiet, see - Common Options), pammixmulti recognizes the following --command line options: -+command line options:
- -mask, each pixel in the output is produced by a
- weighted average of the corresponding pixels from all the input images based
--on the grayscale level of an additional mask image.
-+on the grayscale level of an additional mask image.
-
-
- You supply the names of the files to mix as non-option arguments. -+
You supply the names of the files to mix as non-option arguments.
- - -Average a bunch of PPM images to produce a new PAM image: -+
Average a bunch of PPM images to produce a new PAM image:
-
- pammixmulti input*.ppm >output.ppm
-
-
- Mix these same images by taking each pixel from a randomly selected input --image: -+image:
- -
- pammixmulti --blend=random input*.ppm >output.ppm
-
-
- Use a mask image to control the fading among input images on a --pixel-by-pixel basis: -+pixel-by-pixel basis:
- -
- pammixmulti --blend=mask --maskfile=mask.pgm >output.pam \
- one.pam two.pam three.pam four.pam
-
-
--Do the same but with more abrupt transitions: -+
Do the same but with more abrupt transitions:
- -
- pammixmulti --blend=mask --maskfile=mask.pgm --stdev=0.0 >output.pam \
- one.pam two.pam three.pam four.pam
-
-
--and now with more gradual transitions: -+
and now with more gradual transitions:
- -
- pammixmulti --blend=mask --maskfile=mask.pgm --stdev=1.0 >output.pam \
-@@ -138,7 +138,7 @@ pixel-by-pixel basis:
-
- AUTHOR
-
--Copyright 2018 Scott Pakin, scott+pbm@pakin.org.
-+
Copyright 2018 Scott Pakin, scott+pbm@pakin.org.
-
- SEE ALSO
-
-@@ -152,14 +152,14 @@ pixel-by-pixel basis:
- Table Of Contents
-
-
--- SYNOPSIS
--
- DESCRIPTION
--
- OPTIONS
--
- ARGUMENTS
--
- EXAMPLES
--
- HISTORY
--
- AUTHOR
--
- SEE ALSO
-+
- SYNOPSIS
-+- DESCRIPTION
-+- OPTIONS
-+- ARGUMENTS
-+- EXAMPLES
-+- HISTORY
-+- AUTHOR
-+- SEE ALSO
-
-
-
diff --git a/netpbm.spec b/netpbm.spec
index 8c65173..7cbb558 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,6 +1,6 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 10.93.00
+Version: 10.94.05
Release: 1%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
@@ -27,10 +27,8 @@ Patch12: netpbm-docfix.patch
Patch13: netpbm-cmuwtopbm.patch
Patch14: netpbm-pamtojpeg2k.patch
Patch15: netpbm-manfix.patch
-Patch16: netpbm-manual-pages.patch
-Patch17: netpbm-jasper.patch
-Patch18: netpbm-userguide.patch
-Patch19: netpbm-libdir-so.patch
+Patch16: netpbm-jasper.patch
+Patch17: netpbm-libdir-so.patch
BuildRequires: make
BuildRequires: libjpeg-devel, libpng-devel, libtiff-devel, flex, gcc, jbigkit-devel
@@ -230,6 +228,9 @@ popd
%doc userguide/*
%changelog
+* Wed Mar 31 2021 Josef Ridky - 10.94.05-1
+- New upstream release 10.94.05 (#1943837)
+
* Mon Jan 25 2021 Josef Ridky - 10.93.00-1
- New upstream release 10.93.00 (#1911159)
diff --git a/sources b/sources
index d5383d7..91750b7 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-10.93.00.tar.xz) = 18ff08b1d3672d792dab78b69eb4ef1a9874266b1dfbf5801a53ca172c0dcbbae8d1269297a56e06ed45ccfdff6a6ae5399e60b4bafdcb9d2cb9de800e2bc07c
+SHA512 (netpbm-10.94.05.tar.xz) = 58e6cd2e77dddaa99e439380a1db9057f357204074d528d82ad3af5beaa31bdc0e36abe9bc4a8aded5befdc228bca2f96e7c5a103882ce04d144eead398b45b2
From c30242c9d51b5787df3fea4de79f8b705eee83b2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Wed, 2 Jun 2021 21:55:40 +0200
Subject: [PATCH 08/42] Fix pamhomography man page issue
---
netpbm-manfix.patch | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/netpbm-manfix.patch b/netpbm-manfix.patch
index 42bf517..f90130a 100644
--- a/netpbm-manfix.patch
+++ b/netpbm-manfix.patch
@@ -1837,3 +1837,35 @@ diff -urNp a/userguide/ppmtompeg.html b/userguide/ppmtompeg.html
-
-
-
+Binárnà soubory a/userguide/.pamgradient.html.swp a b/userguide/.pamgradient.html.swp jsou rozdÃlné
+diff -urNp a/userguide/pamhomography.html b/userguide/pamhomography.html
+--- a/userguide/pamhomography.html 2021-06-02 21:32:17.861061500 +0200
++++ b/userguide/pamhomography.html 2021-06-02 21:43:06.846140198 +0200
+@@ -1,15 +1,7 @@
+
+-
+-
+-pamhomography
+-
+-
+-
+-
+-
++Pamhomography User Manual
+
+-
+-pamhomography
++pamhomography
+
+ Updated: 03 January 2021
+
+@@ -17,8 +9,7 @@ Updated: 03 January 2021
+
+
+ NAME
+-
+-pamhomography - map one arbitrary quadrilateral image region to another
++pamhomography - map one arbitrary quadrilateral image region to another
+
+
+ SYNOPSIS
From 0df44fd48f2c1e062376d50b3cd5f3837182c81c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Thu, 15 Jul 2021 12:53:19 +0200
Subject: [PATCH 09/42] Resolves: #1977974 - new upstream release 10.95.00
---
.gitignore | 1 +
netpbm-manfix.patch | 1330 -------------------------------------------
netpbm.spec | 5 +-
sources | 2 +-
4 files changed, 6 insertions(+), 1332 deletions(-)
diff --git a/.gitignore b/.gitignore
index b07bd74..edce8f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,4 @@
/netpbm-10.92.00.tar.xz
/netpbm-10.93.00.tar.xz
/netpbm-10.94.05.tar.xz
+/netpbm-10.95.00.tar.xz
diff --git a/netpbm-manfix.patch b/netpbm-manfix.patch
index f90130a..8696c1d 100644
--- a/netpbm-manfix.patch
+++ b/netpbm-manfix.patch
@@ -539,1333 +539,3 @@ diff -urNp a/userguide/ppmtogif.html b/userguide/ppmtogif.html
One way pamtogif is not backward compatible with ppmtogif
is that to specify a transparency (alpha) mask with ppmtogif, you
supply the transparency as a separate pseudo-PGM image and use the
-diff -urNp a/userguide/ppmtompeg.html b/userguide/ppmtompeg.html
---- a/userguide/ppmtompeg.html 2021-06-02 12:56:59.580286388 +0200
-+++ b/userguide/ppmtompeg.html 1970-01-01 01:00:00.000000000 +0100
-@@ -1,1294 +0,0 @@
--
--
Ppmtompeg User Manual
--
--ppmtompeg
--Updated: 23 July 2006
--
--Table Of Contents
--
--NAME
--ppmtompeg - encode an MPEG-1 bitstream
--
--SYNOPSIS
--
--ppmtompeg
--[options]
--parameter-file
--
--DESCRIPTION
--
--This program is part of Netpbm.
--
--
ppmtompeg produces an MPEG-1 video stream. MPEG-1 is the
--first great video compression method, and is what is used in Video CDs
--(VCD). ppmtompeg originated in the year 1995. DVD uses a more
--advanced method, MPEG-2. There is an even newer method called MPEG-4
--which is also called Divx. I don't know where one finds that used.
--
--
There's technically a difference between a compression method for
--video and an actual file (stream) format for a movie, and I don't know
--if it can be validly said that the format of the stream
--ppmtompeg produces is MPEG-1.
--
--
Mencoder from the Mplayer
--package is probably superior for most video format generation
--needs, if for no other reason than that it is more popular.
--
--
The programming library PM2V
--generates MPEG-2 streams.
--
--
Use Mplayer (not part of Netpbm)
--to do the reverse conversion: to create a series of PNM files from an MPEG
--stream.
--
--
param_file is a parameter file which includes a list of
--input files and other parameters. The file is described in detail
--below.
--
--
To understand this program, you need to understand something about
--the complex MPEG-1 format. One source of information about this
--standard format is the section Introduction to MPEG in the Compression FAQ.
--
--
OPTIONS
--
--The -gop, -combine_gops, -frames, and
---combine_frames options are all mutually exclusive.
--
--
--- -stat stat_file
--
--
- This option causes ppmtompeg to append the statistics that
--it write to Standard Output to the file stat_file as well. The
--statistics use the following abbreviations: bits per block (bpb), bits
--per frame (bpf), seconds per frame (spf), and bits per second (bps).
--
--
These statistics include how many I, P, and B frames there were,
--and information about compression and quality.
--
--
--
- -quiet num_seconds
--
--
- causes ppmtompeg not to report remaining time more often
--than every num_seconds seconds (unless the time estimate rises,
--which will happen near the beginning of the run). A negative value
--tells ppmtompeg not to report at all. 0 is the default
--(reports once after each frame). Note that the time remaining is an
--estimate and does not take into account time to read in frames.
--
--
- -realquiet
- causes ppmtompeg to run silently,
--with the only screen output being errors. Particularly useful when
--reading input from stdin. The equivalent of the -quiet
--common option of most other Netpbm programs.
--
--
-
---no_frame_summary
--
--
- This option prevents ppmtompeg from printing a summary
--line for each frame
--
--
- -float_dct
--
--
- forces ppmtompeg to use a more accurate, yet more
--computationally expensive version of the DCT.
--
--
- -gop gop_num
--
-
--causes ppmtompeg to encode only the numbered GOP (first GOP is 0). The
--parameter file is the same as for normal usage. The output file will be
--the normal output file with the suffix .gop.gop_num.
--ppmtompeg does not output any sequence information.
--
--
- -combine_gops
--
--
- causes ppmtompeg simply to combine some GOP files into a
--single MPEG output stream. ppmtompeg inserts a sequence header
--and trailer. In this case, the parameter file needs only to contain
--the SIZE value, an output file, and perhaps a list of input GOP
--files (see below).
--
--If you don't supply a list of input GOP files is used, then
--ppmtompeg assumes you're using the same parameter file you used
--when you created the input (with the -gop option) and
--calculates the corresponding gop filenames itself. If this is not the
--case, you can specify input GOP files in the same manner as normal
--input files -- except instead of using INPUT_DIR, INPUT, and
--END_INPUT, use GOP_INPUT_DIR, GOP_INPUT, and GOP_END_INPUT. If no
--input GOP files are specified, then the default is to use the output
--file name with suffix .gop.gop_num, with gop_num
--starting from 0, as the input files.
--
--
Thus, unless you're mixing and matching GOP files from different
--sources, you can simply use the same parameter file for creating the
--GOP files (-gop) and for later turning them into an MPEG stream
--(-combine_gops).
--
--
--
- -frames first_frame last_frame
--
--
- This option causes ppmtompeg to encode only the frames numbered
--first_frame to last_frame, inclusive. The parameter
--file is the same as for normal usage. The output will be placed in
--separate files, one per frame, with the file names being the normal
--output file name with the suffix .frame.frame_num. No
--GOP header information is output. (Thus, the parameter file need not
--include the GOP_SIZE value)
--
--
Use ppmtompeg -combine_frames to combine these frames later into
--an MPEG stream.
--
--
--
- -combine_frames
--
--
- This option causes ppmtompeg simply to combine some
--individual MPEG frames (such as you might have created with an earlier
--run of ppmtompeg -frames) into a single MPEG stream. Sequence
--and GOP headers are inserted appropriately. In this case, the
--parameter file needs to contain only the SIZE value, the GOP_SIZE
--value, an output file, and perhaps a list of frame files (see below).
--
--
The parameter file may specify input frame files in the same manner
--as normal input files -- except instead of using INPUT_DIR, INPUT, and
--END_INPUT, use FRAME_INPUT_DIR, FRAME_INPUT, and FRAME_END_INPUT. If
--no input frame files are specified, then the default is to use the
--output file name with suffix .frame.frame_num, with
--frame_num starting from 0, as the input files.
--
--
--
--
- -nice
--
--
- This option causes ppmtompeg to run any remote processes
--"nicely," i.e. at low priority. (This is relevant only if you are
--running ppmtompeg in parallel mode. Otherwise, there are no
--remote processes). See 'man nice.'
--
--
- -max_machines num_machines
--
--
- This option causes ppmtompeg to use no more than
--num_machines machines as slaves for use in parallel encoding.
--
--
- -snr
--
--
- This option causes ppmtompeg to include the signal-to-noise
--ratio in the reported statistics. Prints SNR (Y U V) and peak SNR (Y
--U V) for each frame. In summary, prints averages of luminance only
--(Y). SNR is defined as 10*log(variance of original/variance of
--error). Peak SNR is defined as 20*log(255/RMSE). Note that
--ppmtompeg runs a little slower when you use this option.
--
--
- -mse
--
--
- This option causes ppmtompeg to report the mean squared
--error per block. It also automatically reports the quality of the
--images, so there is no need to specify -snr then.
--
--
- -bit_rate_info rate_file
--
--
- This option makes ppmtompeg write bit rate information
--into the file rate_file. Bit rate information is bits per frame, and
--also bits per I-frame-to-I-frame.
--
--
- -mv_histogram
--
--
- This option causes ppmtompeg to print a histogram of the
--motion vectors as part of statistics. There are three histograms --
--one for P frame, one for forward B frame, and one for backward B frame
--motion vectors.
--
--
The output is in the form of a matrix, each entry corresponding to one
--motion vector in the search window. The center of the matrix
--represents (0,0) motion vectors.
--
--
- -debug_sockets
--
--
- This option causes ppmtompeg to print to Standard Output
--messages that narrate the communication between the machines when you run
--ppmtompeg in parallel mode.
--
--
- -debug_machines
--
--
- This option causes ppmtompeg to print to Standard Output
--messages that narrate the progress of the conversion on the various
--machines when you run ppmtompeg in parallel
--mode.
--
--
--
--PARAMETER FILE
--
--The parameter file must contain the following
--lines (except when using the -combine_gops or -combine_frames
--options):
--
--
--
--- PATTERN pattern
--
--
- This statement specifies the pattern (sequence) of I frames, P frames,
--and B frames. pattern is just a sequence of the letters I, P, and
--B with nothing between. Example:
--
--
-- PATTERN IBBPBBPBBPBBPBB
--
--
--See I Frames, P Frames, B Frames.
--
--
- OUTPUT output file
--
- This names the file where the output MPEG stream goes.
--
--
- INPUT_DIR directory
--
--
- This statement tells where the input images (frames) come from.
--If each frame is in a separate file, directory is the directory
--where they all are. You may use . to refer to the current
--directory. A null directory refers to the root directory of the
--system file tree.
--
--
To have ppmtompeg read all the frames serially from Standard
--Input, specify
--
-- INPUT_DIR stdin
--
--
-- - INPUT
--
-
--This line must be followed by a list of the input files (in display order)
--and then the line END_INPUT.
--
--
There are three types of lines between INPUT and END_INPUT. First,
--a line may simply be the name of an input file. Second, the line
--may be of the form single_star_expr
--[x-y].
--single_star_expr can have a single * in it. It is
--replaced by all the numbers between x and y inclusive. So, for
--example, the line tennis*.ppm [12-15] refers to the files
--tennis12.ppm, tennis13.ppm, tennis14.ppm, tennis15.ppm.
--
--
Uniform zero-padding occurs, as well. For example, the line
--football.*.ppm [001-130] refers to the files football.001.ppm,
--football.002.ppm, ..., football.009.ppm, football.010.ppm, ...,
--football.130.ppm.
--
--
The third type of line is: single_star_expr
--[x-y+s], where the
--line is treated exactly as above, except that we skip by s. Thus, the
--line football.*.ppm [001-130+4] refers to the files
--football.001.ppm, football.005.ppm, football.009.ppm,
--football.013.ppm, etc.
--
--
Furthermore, a line may specify a shell command to execute to
--generate lines to be interpreted as described above, as if those lines
--were in the parameter file instead. Use back ticks, like in the
--Bourne Shell, like this:
--
--
-- `cat myfilelist`
--
--
--
--If input is from Standard Input (per the INPUT_DIR statement),
--ppmtompeg ignores the INPUT/END_INPUT block, but
--it still must be present.
--
--
- BASE_FILE_FORMAT {PPM | PNM | YUV |
-- JPEG | JMOVIE}
--
--
- ppmtompeg must convert all input files to one of the
--following formats as a first step of processing: PNM, YUV, JPEG(v4),
--or JMOVIE. (The conversion may be trivial if your input files are
--already in one of these formats). This line specifies which of the
--four formats. PPM is actually a subset of PNM. The separate
--specification is allowed for backward compatibility. Use PNM instead
--of PPM in new applications.
--
--
- INPUT_CONVERT conversion_command
--
--
- You must specify how to convert a file to the base file format.
--If no conversion is necessary, then you would just say:
--
--
-- INPUT_CONVERT *
--
--
--Otherwise, conversion_command is a shell command that causes
--an image in the format your specified with BASE_FILE_FORMAT to
--be written to Standard Output. ppmtompeg executes the command
--once for each line between INPUT and END_INPUT (which is
--normally, but not necessarily, a file name). In the conversion
--command, ppmtompeg replaces each '*' with the contents of that
--line.
--
-- If you had a bunch of gif files, you might say:
--
-- INPUT_CONVERT giftopnm *
--
--
-- If you have a bunch of separate a.Y, a.U, and a.V files (where
-- the U and V have already been subsampled), then you might say:
--
--
-- INPUT_CONVERT cat *.Y *.U *.V
--
--
--Input conversion is not allowed with input from stdin, so use
--
--
-- INPUT_CONVERT *
--
--
--as described above.
--
-- - SIZE widthxheight
--
--
-
--
--
width and height are the width and height of each
--frame in pixels.
--
--
When ppmtompeg can get this information from the input image
--files, it ignores the SIZE parameter and you may omit it.
--
--
When the image files are in YUV format, the files don't contain
--dimension information, so SIZE is required.
--
--
When ppmtompeg is running in parallel mode, not all of the
--processes in the network have access to the image files, so
--SIZE is required and must give the same dimensions as the
--input image files.
--
--
- YUV_SIZE widthxheight
--
--
- This is an obsolete synonym of SIZE.
--
--
- YUV_FORMAT {ABEKAS | PHILLIPS | UCB |
-- EYUV | pattern}
--
--
- This is meaningful only when BASE_FILE_FORMAT specifies
--YUV format, and then it is required. It specifies the sub-format of
--the YUV class.
--
--
--
- GOP_SIZE n
--
--
- n is the number of frames in a Group of Pictures. Except that
--because a GOP must start with an I frame, ppmtompeg makes a GOP as
--much longer than n as it has to to make the next GOP start with an
--I frame.
--
--
Normally, it makes sense to make your GOP size a multiple of your
--pattern length (the latter is determined by the PATTERN parameter file
--statement).
--
--
See Group Of Pictures.
--
--
- SLICES_PER_FRAME n
--
- n is roughly the number of slices per frame. Note, at
--least one MPEG player may complain if slices do not start at the left
--side of an image. To ensure this does not happen, make sure the
--number of rows is divisible by SLICES_PER_FRAME.
--
--
- PIXEL {FULL | HALF}
--
--
- use half-pixel motion vectors, or just full-pixel ones It is
--usually important that you use half-pixel motion vectors, because it
--results in both better quality and better compression.
--
--
--
- RANGE n
--
- Use a search range of n pixels in each of the four directions
--from a subject pixel. (So the search window is a square n*2 pixels
--on a side).
--
--
- PSEARCH_ALG {EXHAUSTIVE | TWOLEVEL |
-- SUBSAMPLE | LOGARITHMIC}
--
--
- This statement tells ppmtompeg what kind of search
-- technique (algorithm) to use for P frames. You select the desired
-- combination of speed and compression. EXHAUSTIVE gives the
-- best compression, but LOGARITHMIC is the fastest.
-- TWOLEVEL is an exhaustive full-pixel search, followed by a
-- local half- pixel search around the best full-pixel vector (the
-- PIXEL option is ignored for this search technique).
--
--
- BSEARCH_ALG {SIMPLE | CROSS2 | EXHAUSTIVE}
--
--
- This statement tells ppmtompeg what kind of search
-- technique (algorithm) to use for B frames. SIMPLE means
-- find best forward and backward vectors, then interpolate.
-- CROSS2 means find those two vectors, then see what backward
-- vector best matches the best forward vector, and vice versa.
-- EXHAUSTIVE does an n-squared search and is
-- extremely slow in relation to the others (CROSS2
-- is about half as fast as SIMPLE).
--
--
- IQSCALE n
--
- Use n as the qscale for I frames.
-- See Qscale.
--
--
- PQSCALE n
--
- Use n as the qscale for P frames.
-- See Qscale.
--
--
- BQSCALE n
--
- Use n as the qscale for B frames.
-- See Qscale.
--
--
- REFERENCE_FRAME {ORIGINAL | DECODED}
- This
--statement determines whether ppmtompeg uses the original images
--or the decoded images when computing motion vectors. Using decoded
--images is more accurate and should increase the playback quality of
--the output, but it makes the encoding take longer and seems to give
--worse compression. It also causes some complications with parallel
--encoding. (see the section on parallel encoding). One thing you can
--do as a trade-off is select ORIGINAL here, and lower the
--qscale (see QSCALE if the quality is not good enough.
--
--
-- Original or Decoded? (Normalized)
--
--
--
-- Reference
-- Compression
-- Speed
-- Quality I
-- Quality P
-- Quality B
--
--
-- Decoded
-- 1000
-- 1000
-- 1000
-- 969
-- 919
--
--
-- Original
-- 885
-- 1373
-- 1000
-- 912
-- 884
--
--
--
--
--
--
--
--The following lines are optional:
--
--
--
--- FORCE_ENCODE_LAST_FRAME
--
--
- This statement is obsolete. It does nothing.
--
--
Before Netpbm 10.26 (January 2005), ppmtompeg would drop
--trailing B frames from your movie, since a movie can't end with a B
--frame. (See I Frames, P Frames, B Frames.)
--You would have to specify FORCE_ENCODE_LAST_FRAME to stop
--that from happening and get the same function that ppmtompeg
--has today.
--
--
--
- NIQTABLE
--
--
- This statement specifies a custom non-intra quantization table.
--If you don't specify this statement, ppmtompeg uses a default
--non-intra quantization table.
--
--
--The 8 lines immediately following NIQTABLE specify the quantization
--table. Each line defines a table row and consists of 8 integers,
--whitespace-delimited, which define the table columns.
--
--
- IQTABLE
--
--
- This is analogous to NIQTABLE, but for the intra quantization table.
--
--
- ASPECT_RATIO ratio
--
--
- This statement specifies the aspect ratio for ppmtompeg to
--specify in the MPEG output. I'm not sure what this is used for.
--
--
ratio must be 1.0, 0.6735, 0.7031, 0.7615, 0.8055, 0.8437,
--0.8935, 0.9157, 0.9815, 1.0255, 1.0695, 1.0950, 1.1575, or 1.2015.
--
--
- FRAME_RATE rate
--
- This specifies the frame rate for ppmtompeg to specify in the
--MPEG output. Some players use this value to determine the playback rate.
--
--
rate must be 23.976, 24, 25, 29.97, 30, 50, 59.94, or 60.
--
--
- BIT_RATE rate
--
- This specifies the bit rate for Constant Bit Rate (CBR) encoding.
--
--
rate must be an integer.
--
--
- BUFFER_SIZE size
--
--
- This specifies the value
--ppmtompeg is to specify in the MPEG output for the Video
--Buffering Verifier (VBV) buffer size needed to decode the sequence.
--
--
A Video Verifying Buffer is a buffer in which a decoder keeps the
--decoded bits in order to match the uneven speed of the decoding with
--the required constant playback speed.
--
--
As ppmtompeg encodes the image, it simulates the decoding
--process in terms of how many bits would be in the VBV as each frame gets
--decoded, assuming a VBV of the size you indicate.
--
--
If you specify the WARN_VBV_UNDERFLOW statement,
--ppmtompeg issues a warning each time the simulation underflows
--the buffer, which suggests that an underflow would occur on playback,
--which suggests the buffer is too small.
--
--
If you specify the WARN_VBV_OVERFLOW statement,
--ppmtompeg issues a warning each time the simulation overflows
--the buffer, which suggests that an overflow would occur on playback,
--which suggests the buffer is too small.
--
--
- WARN_VBV_UNDERFLOW
--
- WARN_VBV_OVERFLOW
--
--
- See BUFFER_SIZE.
--
--
These options were new in Netpbm 10.26 (January 2005). Before that,
--ppmtompeg issued the warnings always.
--
--
--
--
--The following statements apply only to parallel operation:
--
--
--
--- PARALLEL
--
--
- This statement, paired with END PARALLEL, is what causes
--ppmtompeg to operate in parallel mode. See Parallel Operation.
--
--
- END PARALLEL
--
--
- This goes with PARALLEL.
--
--
- PARALLEL_TEST_FRAMES n
--
--
- The master starts off by measuring each slave's speed. It does
--this by giving each slave n frames to encode and noting how
--long the slave takes to finish. These are not just test frames,
--though -- they're real frames and the results become part of the
--output.
--ppmtompeg is old and measures time in undivided seconds, so
--to get useful timings, specify enough frames that it will take at
--least 5 seconds to process them. The default is 10.
--
--
If you specify FORCE_I_ALIGN, ppmtompeg will increase
--the test frames value enough to maintain the alignment.
--
--
If there aren't enough frames for every slave to have the indicated
--number of test frames, ppmtompeg will give some slaves fewer.
--
--
--
- PARALLEL_TIME_CHUNKS t
--
--
- When you specify this statement, the master attempts to feed work
--to the slaves in chunks that take t seconds to process. It uses
--the speed measurement it made when it started up (see PARALLEL_TEST_FRAMES)
--to decide how many frames to put in the chunk. This statement obviously
--doesn't affect the first batch of work sent to each slave, which is the
--one used to measure the slave's speed.
--
--
Smaller values of t increase communication, but improve load
--balancing. The default is 30 seconds.
--
--
You may specify only one of PARALLEL_TIME_CHUNKS, PARALLEL_CHUNK_TAPER,
--and PARALLEL_PERFECT. PARALLEL_CHUNK_TAPER is usually best.
--
--
- PARALLEL_CHUNK_TAPER
--
--
- When you specify this statement, the master distributes work like
--with PARALLEL_TIME_CHUNKS, except that the master chooses the number
--of seconds for the chunks. It starts with a large number and, as it
--gets closer to finishing the job, reduces it. That way, it reduces
--scheduling overhead when precise scheduling isn't helpful, but still
--prevents a slave from finishing early after all the work has already
--been handed out to the other slaves, and then sitting idle while
--there's still work to do.
--
--
You may specify only one of PARALLEL_TIME_CHUNKS, PARALLEL_CHUNK_TAPER,
--and PARALLEL_PERFECT. PARALLEL_CHUNK_TAPER is usually best.
--
--
--
- PARALLEL_PERFECT
--
--
- If this statement is present, ppmtompeg schedules on the
--assumption that each machine is about the same speed. The master will
--simply divide up the frames evenly between the slaves -- each
--slave gets the same number of frames. If some slaves are faster than
--others, they will finish first and remain idle while the slower slaves
--continue.
--
--
This has the advantage of minimal scheduling overhead. Where slaves
--have different speeds, though, it makes inefficient use of the fast
--ones. Where slaves are the same speed, it also has the disadvantage
--that they all finish at the same time and feed their output to the
--single Combine Server in a burst, which makes less efficient use of
--the Combine Server and thus can increase the total elapsed time.
--
--
You may specify only one of PARALLEL_TIME_CHUNKS, PARALLEL_CHUNK_TAPER,
--and PARALLEL_PERFECT. PARALLEL_CHUNK_TAPER is usually best.
--
--
- RSH remote_shell_command
--
--
- ppmtompeg executes the shell command
--remote_shell_command to start a process on another machine.
--The default command is rsh, and whatever command you specify
--must have compatible semantics. ssh is usually compatible.
--The command ppmtompeg uses is one like this:
--ssh remote.host.com -l username shellcommand.
--
--
Be sure to set up .rhosts files or SSH key authorizations
--where needed. Otherwise, you'll have to type in passwords.
--
--
On some HP machines, rsh is the restricted shell, and you want
--to specify remsh.
--
--
- FORCE_I_ALIGN
--
--
- This statement forces each slave to encode a chunk of frames which
--is a multiple of the pattern length (see PATTERN). Since the
--first frame in any pattern is an I frame, this forces each chunk
--encoded by a slave to begin with an I frame.
--
--
This document used to say there was an argument to
--FORCE_I_ALIGN which was the number of frames ppmtompeg
--would use (and was required to be a multiple of the pattern length).
--But ppmtompeg has apparently always ignored that argument, and
--it does now.
--
--
- KEEP_TEMP_FILES
--
--
- This statement causes ppmtompeg not to delete the temporary
--files it uses to transmit encoded frames to the combine server. This
--means you will be left with a file for each frame, the same as you
--would get with the -frames option.
--
--
This is mostly useful for debugging.
--
--
This works only if you're using a shared filesystem to communicate
--between the servers.
--
--
This option was new in Netpbm 10.26 (January 2005).
--
--
--
--
--Parameter File Notes
--
-- If you use the -combine_gops option, then you need to specify
--only the SIZE and OUTPUT values in the parameter file. In
--addition, the parameter file may specify input GOP files in the same
--manner as normal input files -- except instead of using INPUT_DIR,
--INPUT, and END_INPUT, use GOP_INPUT_DIR, GOP_INPUT, and GOP_END_INPUT.
--If you specify no input GOP files, then ppmtompeg uses by default the
--output file name with suffix .gop.gop_num, with gop_num
--starting from 0, as the input files.
--
--
If you use the -combine_frames option, then you need to
--specify only the SIZE, GOP_SIZE, and OUTPUT values in the
--parameter file. In addition, the parameter file may specify input
--frame files in the same manner as normal input files -- except instead
--of using INPUT_DIR, INPUT, and END_INPUT, use FRAME_INPUT_DIR,
--FRAME_INPUT, and FRAME_END_INPUT. If no input frame files are
--specified, then the default is to use the output file name with suffix
--.frame.frame_num, with frame_num starting from 0,
--as the input files.
--
--
Any number of spaces and tabs may come between each option and value. Lines
--beginning with # are ignored. Any other lines are ignored except for
--those between INPUT and END_INPUT. This allows you to use the same
--parameter file for normal usage and for -combine_gops and
---combine_frames.
--
--
The file format is case-sensitive so all keywords should be in
--upper case.
--
--
The statements may appear in any order, except that the order within
--a block statement (such as INPUT ... END INPUT) is significant.
--
--
ppmtompeg is prepared to handle up to 16 B frames between
--reference frames when encoding with input from stdin. (To build a
--modified ppmtompeg with a higher limit, change the constant
--B_FRAME_RUN in frame.c and recompile).
--
--
GENERAL USAGE INFORMATION
--
--Qscale
--
--The quantization scale values (qscale) give a trade-off between
--quality and compression. Using different Qscale values has very little
--effect on speed. The qscale values can be set separately for I, P, and
--B frames.
--
--
You select the qscale values with the IQSCALE,
--PQSCALE, and BSCALE parameter file statements.
--
--
A qscale value is an integer from 1 to 31. Larger numbers give
--better compression, but worse quality. In the following, the quality
--numbers are peak signal-to-noise ratio, defined as:
--
--where MSE is the mean squared error.
--
--
--
Flower garden tests:
--
--
-- Qscale vs Quality
--
--
--
-- Qscale
-- I Frames
-- P Frames
-- B Frames
--
--
-- 1
-- 43.2
-- 46.3
-- 46.5
--
--
-- 6
-- 32.6
-- 34.6
-- 34.3
--
--
-- 11
-- 28.6
-- 29.5
-- 30.0
--
--
-- 16
-- 26.3
-- 26.8
-- 28.6
--
--
-- 21
-- 24.7
-- 25.0
-- 27.9
--
--
-- 26
-- 23.5
-- 23.9
-- 27.5
--
--
-- 31
-- 22.6
-- 23.0
-- 27.3
--
--
--
--
-- Qscale vs Compression
--
--
--
-- Qscale
-- I Frames
-- P Frames
-- B Frames
--
--
-- 1
-- 2
-- 2
-- 2
--
--
-- 6
-- 7
-- 10
-- 15
--
--
-- 11
-- 11
-- 18
-- 43
--
--
-- 16
-- 15
-- 29
-- 97
--
--
-- 21
-- 19
-- 41
-- 173
--
--
-- 26
-- 24
-- 56
-- 256
--
--
-- 31
-- 28
-- 73
-- 330
--
--
--
--
--Search Techniques
--
--There are several different motion vector search techniques
--available. There are different techniques available for P frame
--search and B frame search. Using different search techniques present
--little difference in quality, but a large difference in compression
--and speed.
--
--
There are 4 types of P frame search: Exhaustive, TwoLevel,
--SubSample, and Logarithmic.
--
--
There are 3 types of B frame search: Exhaustive, Cross2, and
--Simple.
--
--The recommended search techniques are TwoLevel and Logarithmic for
--P frame search, and Cross2 and Simple for B frame search. Here are
--some numbers comparing the different search methods:
--
--
-- P frame Motion Vector Search (Normalized)
--
--
--
-- Technique
-- Compression1
-- Speed 2
-- Quality 3
--
--
-- Exhaustive
-- 1000
-- 1000
-- 1000
--
--
-- SubSample
-- 1008
-- 2456
-- 1000
--
--
-- TwoLevel
-- 1009
-- 3237
-- 1000
--
--
-- Logarithmic
-- 1085
-- 8229
-- 998
--
--
--
--
-- B frame Motion Vector Search (Normalized)
--
--
--
-- Technique
-- Compression1
-- Speed2
-- Quality3
--
--
-- Exhaustive
-- 1000
-- 1000
-- 1000
--
--
-- Cross2
-- 975
-- 1000
-- 996
--
--
-- Simple
-- 938
-- 1765
-- 991
--
--
--
-- 1Smaller numbers are better
--compression.
--
-- 2Larger numbers mean faster
--execution.
--
-- 3Larger numbers mean better quality.
--
--For some reason, Simple seems to give better compression, but it
--depends on the image sequence.
--
--
Select the search techniques with the PSEARCH_ALG and
--BSEARCH_ALG parameter file statements.
--
--
--
Group Of Pictures (GOP)
--
--A Group of Pictures (GOP) is a roughly independently decodable
--sequence of frames. An MPEG video stream is made of one or more
--GOP's. You may specify how many frames should be in each GOP with the
--GOP_SIZE parameter file statement. A GOP always starts with an
--I frame.
--
--
Instead of encoding an entire sequence, you can encode a single
--GOP. To do this, use the -gop command option. You can later
--join the resulting GOP files at any time by running ppmtompeg
--with the -combine_gops command option.
--
--
--
Slices
--
--A slice is an independently decodable unit in a frame. It can be
--as small as one macroblock, or it can be as big as the entire frame.
--Barring transmission error, adding slices does not change quality or
--speed; the only effect is slightly worse compression. More slices are
--used for noisy transmission so that errors are more recoverable. Since
--usually errors are not such a problem, we usually just use one slice
--per frame.
--
--
Control the slice size with the SLICES_PER_FRAME parameter
--file statement.
--
--
Some MPEG playback systems require that each slice consist of whole
--rows of macroblocks. If you are encoding for this kind of player, if
--the height of the image is H pixels, then you should set the
--SLICES_PER_FRAME to some number which divides H/16. For example, if
--the image is 240 pixels (15 macroblocks) high, then you should use
--only 15, 5, 3, or 1 slices per frame.
--
--
Note: these MPEG playback systems are really wrong, since the MPEG
--standard says this doesn't have to be so.
--
--
--
--
Search Window
--
--The search window is the window in which ppmtompeg searches
--for motion vectors. The window is a square. You can specify the size
--of the square, and whether to allow half-pixel motion vectors or not,
--with the RANGE and PIXEL parameter file statements.
--
--
I Frames, P Frames, B Frames
--
--In MPEG-1, a movie is represented as a sequence of MPEG frames,
--each of which is an I Frame, a P Frame, or a B Frame. Each represents
--an actual frame of the movie (don't get confused by the dual use of
--the word "frame." A movie frame is a graphical image. An MPEG frame
--is a set of data that describes a movie frame).
--
--
An I frame ("intra" frame) describes a movie frame in isolation --
--without respect to any other frame in the movie. A P frame
--("predictive" frame) describes a movie frame by describing how it
--differs from the movie frame described by the latest preceding I or
--P frame. A B frame ("bidirectional" frame) describes a movie frame by
--describing how it differs from the movie frames described by the
--nearest I or P frame before and after it.
--
--
Note that the first frame of a movie must be described by an I
--frame (because there is no previous movie frame) and the last movie
--frame must be described by an I or P frame (because there is no
--subsequent movie frame).
--
--
Beyond that, you can choose which frames are represented by which
--types. You specify a pattern, such as IBPBP and ppmtompeg
--simply repeats it over and over throughout the movie. The pattern
--affects speed, quality, and stream size. Here is a chart which shows
--some of the trade-offs:
--
--
-- Comparison of I/P/B Frames (Normalized)
--
--
--
-- Frame Type
-- Size
-- Speed
-- Quality
--
--
-- I frames
-- 1000
-- 1000
-- 1000
--
--
-- P frames
-- 409
-- 609
-- 969
--
--
-- B frames
-- 72
-- 260
-- 919
--
--
--
--(this is with constant qscale)
--
--A standard sequence is IBBPBBPBBPBBPBB.
--
--
Select the sequence with the PATTERN parameter file statement.
--
--
Since the last MPEG frame cannot be a B frame (see above), if the
--pattern you specify indicates a B frame for the last movie frame of
--the movie, ppmtompeg makes it an I frame instead.
--
--
Before Netpbm 10.26 (January 2005), ppmtompeg instead drops
--the trailing B frames by default, and you need the
--FORCE_ENCODE_LAST_FRAME parameter file statement to make it do
--this.
--
--
The MPEG frames don't appear in the MPEG-1 stream in the same order that
--the corresponding movie frames appear in the movie -- the B frames come after
--the I and P frames on which they are based. For example, if the movie is
--4 frames that you will represent with the pattern IBBP, the MPEG-1 stream
--will start with an I frame describing movie frame 0. The next frame in
--the MPEG-1 stream is a P frame describing movie frame 3. The last two
--frames in the MPEG-1 stream are B frames describing movie frames 1 and 2,
--respectively.
--
--
--
Specifying Input and Output Files
--
--Specify the input frame images with the INPUT_DIR,
--INPUT, END_INPUT, BASE_FILE_FORMAT,
--SIZE, YUV_FORMAT and INPUT_CONVERT parameter
--file statements.
--
--
Specify the output file with the OUTPUT parameter file statement.
--
--
--
Statistics
--
--ppmtompeg can generate a variety of statistics about the
--encoding. See the -stat, -snr, -mv_histogram,
---quiet, -no_frame_summary, and -bit_rate_info
--options.
--
--
--
PARALLEL OPERATION
--
--You can run ppmtompeg on multiple machines at once, encoding
--the same MPEG stream. When you do, the machines are used as shown in
--the following diagram. We call this "parallel mode."
--
--
--
--
To do parallel processing, put the statement
--
--
-- PARALLEL
--
--
--in the parameter file, followed by a listing of the machines, one
--machine per line, then
--
--
-- END_PARALLEL
--
--
--Each of the machine lines must be in one of two forms. If the machine
--has filesystem access to the input files, then the line is:
--
--
--machine user executable
--
--
The executable is normally ppmtompeg (you may need to give
--the complete path if you've built for different architectures). If
--the machine does not have filesystem access to the input files, the line
--is:
--
--
REMOTE machine user executable
--parameter file
--
--
The -max_machines command option limits the number of
--machines ppmtompeg will use. If you specify more machines in
--the parameter file than -max_machines allows, ppmtompeg
--uses only the machines listed first. This is handy if you want to
--experiment with different amounts of parallelism.
--
--
In general, you should use full path file names when describing
--executables and parameter files. This includes the parameter
--file argument on the original invocation of ppmtompeg.
--
--
All file names must be the same on all systems (so if e.g. you're
--using an NFS filesystem, you must make sure it is mounted at the same
--mountpoint on all systems).
--
--
Because not all of the processes involved in parallel operation
--have easy access to the input files, you must specify the SIZE
--parameter file statement when you do parallel operation.
--
--
The machine on which you originally invoke ppmtompeg is the
--master machine. It hosts a "combine server,", a
--"decode server," and a number of "i/o servers,"
--all as separate processes. The other machines in the network (listed
--in the parameter file) are slave machines. Each hosts a single
--process that continuously requests work from the master and does it.
--The slave process does the computation to encode MPEG frames. It
--processes frames in batches identified by the master.
--
--
The master uses a remote shell command to start a process on a
--slave machine. By default, it uses an rsh shell command to do
--this. But use the RSH parameter file statement to control
--this. The shell command the master executes remotely is
--ppmtompeg, but with options to indicate that it is to perform
--slave functions.
--
--
The various machines talk to each other over TCP connections. Each
--machine finds and binds to a free TCP port number and tells its
--partners the port number. These port numbers are at least 2048.
--
--
Use the PARALLEL_TEST_FRAMES, PARALLEL_TIME_CHUNKS, and
--PARALLEL_PERFECT parameter file statements to control the way the
--master divides up work among the slaves.
--
--
Use the -nice command option to cause all slave processes to run
--"nicely," i.e. as low priority processes. That way, this substantial and
--long-running CPU load will have minimal impact on other, possibly
--interactive, users of the systems.
--
--
SPEED
--
--Here is a look at ppmtompeg speed, in single-node (not parallel)
--operation:
--
--
-- Compression Speed
--
--
--
-- Machine Type
-- Macroblocks per second1
--
--
-- HP 9000/755
-- 280
--
--
-- DEC 3000/400
-- 247
--
--
-- HP 9000/750
-- 191
--
--
-- Sparc 10
-- 104
--
--
-- DEC 5000
-- 68
--
--
--1A macroblock is a 16x16 pixel square
--
--The measurements in the table are with inputs and outputs via a
--conventional locally attached filesystem. If you are using a network
--filesystem over a single 10 MB/s Ethernet, that constrains your speed more
--than your CPU speed. In that case, don't expect to get better than 4
--or 5 frames per second no matter how fast your CPUs are.
--
--
Network speed is even more of a bottleneck when the slaves do not
--have filesystem access to the input files -- i.e. you declare them
--REMOTE.
--
--
Where I/O is the bottleneck, size of the input frames can make a big
--difference. So YUV input is better than PPM, and JPEG is better than
--both.
--
--
When you're first trying to get parallel mode working, be sure to
--use the -debug_machines option so you can see what's going on.
--Also, -debug_sockets can help you diagnose communication
--problems.
--
--
--
AUTHORS
--
--
--
--- Kevin Gong - University of California, Berkeley, keving@cs.berkeley.edu
--
--
- Ketan Patel - University of California, Berkeley, kpatel@cs.berkeley.edu
--
--
- Dan Wallach - University of California, Berkeley, dwallach@cs.berkeley.edu
--
--
- Darryl Brown - University of California, Berkeley, darryl@cs.berkeley.edu
--
--
- Eugene Hung - University of California, Berkeley, eyhung@cs.berkeley.edu
--
--
- Steve Smoot - University of California, Berkeley, smoot@cs.berkeley.edu
--
--
--
--
--Table Of Contents
--
--- SYNOPSIS
--
- DESCRIPTION
--
- OPTIONS
--
- PARAMETER FILE
--
-- - Parameter File Notes
--
-- - GENERAL USAGE INFORMATION
--
-- - Qscale
--
- Search Techniques
--
- Group Of Pictures (GOP)
--
- Slices
--
- Search Window
--
- I Frames, P Frames, B Frames
--
- Specifying Input and Output Files
--
- Statistics
--
-- - PARALLEL OPERATION
--
- SPEED
--
- AUTHORS
--
--
--
-Binárnà soubory a/userguide/.pamgradient.html.swp a b/userguide/.pamgradient.html.swp jsou rozdÃlné
-diff -urNp a/userguide/pamhomography.html b/userguide/pamhomography.html
---- a/userguide/pamhomography.html 2021-06-02 21:32:17.861061500 +0200
-+++ b/userguide/pamhomography.html 2021-06-02 21:43:06.846140198 +0200
-@@ -1,15 +1,7 @@
-
--
--
--pamhomography
--
--
--
--
--
-+Pamhomography User Manual
-
--
--pamhomography
-+pamhomography
-
- Updated: 03 January 2021
-
-@@ -17,8 +9,7 @@ Updated: 03 January 2021
-
-
- NAME
--
--pamhomography - map one arbitrary quadrilateral image region to another
-+pamhomography - map one arbitrary quadrilateral image region to another
-
-
- SYNOPSIS
diff --git a/netpbm.spec b/netpbm.spec
index 7cbb558..44eadef 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,6 +1,6 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 10.94.05
+Version: 10.95.00
Release: 1%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
@@ -228,6 +228,9 @@ popd
%doc userguide/*
%changelog
+* Thu Jul 15 2021 Josef Ridky - 10.95.00-1
+- New upstream release 10.95.00 (#1977974)
+
* Wed Mar 31 2021 Josef Ridky - 10.94.05-1
- New upstream release 10.94.05 (#1943837)
diff --git a/sources b/sources
index 91750b7..e94a7fa 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-10.94.05.tar.xz) = 58e6cd2e77dddaa99e439380a1db9057f357204074d528d82ad3af5beaa31bdc0e36abe9bc4a8aded5befdc228bca2f96e7c5a103882ce04d144eead398b45b2
+SHA512 (netpbm-10.95.00.tar.xz) = 7ab480bb7536320864cacef8c699d61cb43cd537485640043abc88a6e87596e83257f031725eaee1493cf142dffac9ba02962f7b1d778c97dac1a511438e9b80
From fba46faae3a47d457f92ee865a379c5e4aa9b70c Mon Sep 17 00:00:00 2001
From: Fedora Release Engineering
Date: Thu, 22 Jul 2021 16:01:37 +0000
Subject: [PATCH 10/42] - Rebuilt for
https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
Signed-off-by: Fedora Release Engineering
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index 44eadef..277f408 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 10.95.00
-Release: 1%{?dist}
+Release: 2%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -228,6 +228,9 @@ popd
%doc userguide/*
%changelog
+* Thu Jul 22 2021 Fedora Release Engineering - 10.95.00-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
+
* Thu Jul 15 2021 Josef Ridky - 10.95.00-1
- New upstream release 10.95.00 (#1977974)
From 4957f6da7b49041ce2503b1f38e6949192f746d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Mon, 4 Oct 2021 09:33:36 +0200
Subject: [PATCH 11/42] New upstream release 10.96.00
---
.gitignore | 1 +
netpbm.spec | 7 +++++--
sources | 2 +-
3 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/.gitignore b/.gitignore
index edce8f4..189c5d3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,4 @@
/netpbm-10.93.00.tar.xz
/netpbm-10.94.05.tar.xz
/netpbm-10.95.00.tar.xz
+/netpbm-10.96.00.tar.xz
diff --git a/netpbm.spec b/netpbm.spec
index 277f408..668a9f0 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 10.95.00
-Release: 2%{?dist}
+Version: 10.96.00
+Release: 1%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -228,6 +228,9 @@ popd
%doc userguide/*
%changelog
+* Mon Oct 04 2021 Josef Ridky - 10.96.00-1
+- New upstream release 10.96.00 (#2007871)
+
* Thu Jul 22 2021 Fedora Release Engineering - 10.95.00-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
diff --git a/sources b/sources
index e94a7fa..3470dc3 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-10.95.00.tar.xz) = 7ab480bb7536320864cacef8c699d61cb43cd537485640043abc88a6e87596e83257f031725eaee1493cf142dffac9ba02962f7b1d778c97dac1a511438e9b80
+SHA512 (netpbm-10.96.00.tar.xz) = 665567a9cca1badb0fcd595cbabe934f9edd1b443a148894266ee50eead3846a859fe71c4d4c18231c15258f9ab73a249ec409863b02ad03dff5e9c9018ddd87
From 24c2d521837994bdbc611f74a496e2f4d3c8af0e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Mon, 3 Jan 2022 17:07:00 +0100
Subject: [PATCH 12/42] Resolves: #2035806 - update to the new upstream release
10.97.00
---
.gitignore | 1 +
netpbm-manfix.patch | 73 +++++++++++++++++++-------------------
netpbm-security-code.patch | 29 +++++++--------
netpbm.spec | 5 ++-
sources | 2 +-
5 files changed, 57 insertions(+), 53 deletions(-)
diff --git a/.gitignore b/.gitignore
index 189c5d3..3b1a710 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,4 @@
/netpbm-10.94.05.tar.xz
/netpbm-10.95.00.tar.xz
/netpbm-10.96.00.tar.xz
+/netpbm-10.97.00.tar.xz
diff --git a/netpbm-manfix.patch b/netpbm-manfix.patch
index 8696c1d..10f635d 100644
--- a/netpbm-manfix.patch
+++ b/netpbm-manfix.patch
@@ -1,6 +1,6 @@
diff -urNp a/userguide/avstopam.html b/userguide/avstopam.html
---- a/userguide/avstopam.html 2021-06-02 12:56:59.584286425 +0200
-+++ b/userguide/avstopam.html 2021-06-02 15:00:33.799300026 +0200
+--- a/userguide/avstopam.html 2022-01-03 16:56:37.731614243 +0100
++++ b/userguide/avstopam.html 2022-01-03 16:58:29.889416006 +0100
@@ -2,12 +2,13 @@
Avstopam User Manual
@@ -72,8 +72,8 @@ diff -urNp a/userguide/avstopam.html b/userguide/avstopam.html
diff -urNp a/userguide/faxformat.html b/userguide/faxformat.html
---- a/userguide/faxformat.html 2021-06-02 12:56:59.576286351 +0200
-+++ b/userguide/faxformat.html 2021-06-02 15:02:58.710711998 +0200
+--- a/userguide/faxformat.html 2022-01-03 16:56:37.731614243 +0100
++++ b/userguide/faxformat.html 2022-01-03 16:58:29.890416013 +0100
@@ -5,10 +5,11 @@
Updated: 03 December 2008
@@ -88,8 +88,8 @@ diff -urNp a/userguide/faxformat.html b/userguide/faxformat.html
(the idea is to provide a way to be sure that a fax machine is able to receive
a fax sent by another). These standards incidentally specify graphics file
diff -urNp a/userguide/libnetpbm_ug.html b/userguide/libnetpbm_ug.html
---- a/userguide/libnetpbm_ug.html 2021-06-02 12:56:59.584286425 +0200
-+++ b/userguide/libnetpbm_ug.html 2021-06-02 14:36:35.392293125 +0200
+--- a/userguide/libnetpbm_ug.html 2022-01-03 16:56:37.732614250 +0100
++++ b/userguide/libnetpbm_ug.html 2022-01-03 16:58:29.891416020 +0100
@@ -374,7 +374,7 @@ plain format.
Reference
@@ -100,8 +100,8 @@ diff -urNp a/userguide/libnetpbm_ug.html b/userguide/libnetpbm_ug.html
The Libnetpbm Utility Manual
diff -urNp a/userguide/pamfunc.html b/userguide/pamfunc.html
---- a/userguide/pamfunc.html 2021-06-02 12:56:59.585286434 +0200
-+++ b/userguide/pamfunc.html 2021-06-02 14:40:09.474375441 +0200
+--- a/userguide/pamfunc.html 2022-01-03 16:56:37.730614236 +0100
++++ b/userguide/pamfunc.html 2022-01-03 16:58:29.892416027 +0100
@@ -60,7 +60,7 @@ output image.
and bit string (such as and with 01001000). For the arithmetic functions, the
function arguments and results are the fraction that a sample is of the
@@ -112,8 +112,8 @@ diff -urNp a/userguide/pamfunc.html b/userguide/pamfunc.html
Arithmetic functions
diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
---- a/userguide/pammixmulti.html 2021-06-02 12:56:59.586286443 +0200
-+++ b/userguide/pammixmulti.html 2021-06-02 14:28:03.105311615 +0200
+--- a/userguide/pammixmulti.html 2022-01-03 16:56:37.731614243 +0100
++++ b/userguide/pammixmulti.html 2022-01-03 16:58:29.893416034 +0100
@@ -7,8 +7,8 @@ Updated: 18 November 2018
Table Of Contents
@@ -278,17 +278,10 @@ diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
---- a/userguide/pampaintspill.html 2021-06-02 12:56:59.575286342 +0200
-+++ b/userguide/pampaintspill.html 2021-06-02 15:06:31.354767352 +0200
-@@ -2,12 +2,12 @@
- Pampaintspill User Manual
-
- pampaintspill
--Updated: 06 March 2021
-+Updated: 06 March 2021
-
--Table Of Contents
-+Table Of Contents
+--- a/userguide/pampaintspill.html 2022-01-03 16:56:37.730614236 +0100
++++ b/userguide/pampaintspill.html 2022-01-03 17:05:08.124277395 +0100
+@@ -7,7 +7,7 @@ Updated: 02 November 2021
+ Table Of Contents
NAME
-pampaintspill - smoothly spill colors into the background
@@ -296,9 +289,9 @@ diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
SYNOPSIS
-@@ -17,17 +17,17 @@ pampaintspill - smoothly spill colors in
- [--wrap] [--all]
+@@ -19,17 +19,17 @@ pampaintspill - smoothly spill colors in
[--downsample=number]
+ [--near=number]
[--power=number] [filename]
-[-randomseed=integer]
+[-randomseed=integer]
@@ -317,7 +310,7 @@ diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
pampaintspill produces a smooth color gradient from all of the
non-background-colored pixels in an input image, effectively "spilling
-@@ -38,27 +38,27 @@ paint" onto the background. pampaint
+@@ -40,27 +40,27 @@ paint" onto the background. pampaint
- pampaintspill accepts any number of paint
sources (non-background-colored pixels), which can lie anywhere
on the canvas. pamgradient accepts exactly
@@ -350,14 +343,20 @@ diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
- --bgcolor=color
-@@ -107,42 +107,42 @@ command line options:
- - This is the seed for the random number generator that generates the
- pixels.
-
+@@ -116,46 +116,46 @@ command line options:
+ 2.0) make the paint sources stand out in the output image by pushing the
+ gradients away from them.
+
+- - -randomseed=integer
++
- -randomseed=integer
+ - This is the seed for the random number generator that generates the
+- pixels.
++ pixels.
+
- Use this to ensure you get the same image on separate invocations.
+
Use this to ensure you get the same image on separate invocations.
-
-- This option was new in Netpbm 10.94 (March 2021).
+
+-
This option was new in Netpbm 10.94 (March 2021).
+
This option was new in Netpbm 10.94 (March 2021).
@@ -387,7 +386,7 @@ diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
COPYRIGHT
- Copyright © 2010 Scott Pakin,
+
Copyright © 2010–2021 Scott Pakin,
-scott+pbm@pakin.org.
+scott+pbm@pakin.org.
@@ -410,8 +409,8 @@ diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
diff -urNp a/userguide/pamrecolor.html b/userguide/pamrecolor.html
---- a/userguide/pamrecolor.html 2021-06-02 12:56:59.574286333 +0200
-+++ b/userguide/pamrecolor.html 2021-06-02 15:09:53.837724488 +0200
+--- a/userguide/pamrecolor.html 2022-01-03 16:56:37.731614243 +0100
++++ b/userguide/pamrecolor.html 2022-01-03 16:58:29.894416041 +0100
@@ -2,9 +2,9 @@
Pamrecolor User Manual
@@ -495,8 +494,8 @@ diff -urNp a/userguide/pamrecolor.html b/userguide/pamrecolor.html
The luminance values pamrecolor uses for each of the above come from
Bruce Lindbloom's
diff -urNp a/userguide/pbmtog3.html b/userguide/pbmtog3.html
---- a/userguide/pbmtog3.html 2021-06-02 12:56:59.585286434 +0200
-+++ b/userguide/pbmtog3.html 2021-06-02 14:44:07.715692749 +0200
+--- a/userguide/pbmtog3.html 2022-01-03 16:56:37.732614250 +0100
++++ b/userguide/pbmtog3.html 2022-01-03 16:58:29.894416041 +0100
@@ -36,7 +36,7 @@ use those encodings.
In addition to the options common to all programs based on libnetpbm
(most notably -quiet, see
@@ -516,8 +515,8 @@ diff -urNp a/userguide/pbmtog3.html b/userguide/pbmtog3.html
and then modified extensively by others.
diff -urNp a/userguide/ppmtogif.html b/userguide/ppmtogif.html
---- a/userguide/ppmtogif.html 2021-06-02 12:56:59.574286333 +0200
-+++ b/userguide/ppmtogif.html 2021-06-02 15:48:19.167930575 +0200
+--- a/userguide/ppmtogif.html 2022-01-03 16:56:37.733614257 +0100
++++ b/userguide/ppmtogif.html 2022-01-03 16:58:29.895416049 +0100
@@ -5,17 +5,17 @@
NAME
diff --git a/netpbm-security-code.patch b/netpbm-security-code.patch
index 4ff5c52..84deed0 100644
--- a/netpbm-security-code.patch
+++ b/netpbm-security-code.patch
@@ -216,17 +216,17 @@ diff -ruNp a/converter/pbm/mdatopbm.c b/converter/pbm/mdatopbm.c
data = pbm_allocarray(nOutCols, nOutRows);
diff -ruNp a/converter/pbm/mgrtopbm.c b/converter/pbm/mgrtopbm.c
---- a/converter/pbm/mgrtopbm.c 2021-06-02 15:53:59.828205592 +0200
-+++ b/converter/pbm/mgrtopbm.c 2021-06-02 20:23:21.808634248 +0200
-@@ -65,6 +65,8 @@ readMgrHeader(FILE * const ifP,
- if (head.h_high < ' ' || head.l_high < ' ')
- pm_error("Invalid width field in MGR header");
-
+--- a/converter/pbm/mgrtopbm.c 2022-01-03 16:41:24.856969944 +0100
++++ b/converter/pbm/mgrtopbm.c 2022-01-03 16:43:27.023842152 +0100
+@@ -105,6 +105,8 @@ readMgrHeader(FILE * const ifP,
+ interpHdrWidth (head, colsP);
+ interpHdrHeight(head, rowsP);
+
+ overflow_add(*colsP, pad);
+
- *colsP = (((int)head.h_wide - ' ') << 6) + ((int)head.l_wide - ' ');
- *rowsP = (((int)head.h_high - ' ') << 6) + ((int) head.l_high - ' ');
- *padrightP = ( ( *colsP + pad - 1 ) / pad ) * pad - *colsP;
+ *padrightP = ((*colsP + pad - 1) / pad) * pad - *colsP;
+ }
+
diff -ruNp a/converter/pbm/pbmtogem.c b/converter/pbm/pbmtogem.c
--- a/converter/pbm/pbmtogem.c 2021-06-02 15:53:59.828205592 +0200
+++ b/converter/pbm/pbmtogem.c 2021-06-02 20:23:21.809634256 +0200
@@ -652,12 +652,13 @@ diff -ruNp a/converter/pbm/thinkjettopbm.l b/converter/pbm/thinkjettopbm.l
packed_bitrow = malloc(maxRowLength);
diff -ruNp a/converter/pbm/ybmtopbm.c b/converter/pbm/ybmtopbm.c
---- a/converter/pbm/ybmtopbm.c 2021-06-02 15:53:59.827205582 +0200
-+++ b/converter/pbm/ybmtopbm.c 2021-06-02 20:23:21.814634300 +0200
-@@ -43,6 +43,7 @@ getinit(FILE * const ifP,
- pm_error("EOF / read error");
-
+--- a/converter/pbm/ybmtopbm.c 2022-01-03 16:41:24.857969951 +0100
++++ b/converter/pbm/ybmtopbm.c 2022-01-03 16:42:59.671646876 +0100
+@@ -49,6 +49,8 @@ getinit(FILE * const ifP,
+ *colsP = (unsigned int) cols;
+ *rowsP = (unsigned int) rows;
*depthP = 1;
++
+ overflow_add(*colsP, 15);
}
diff --git a/netpbm.spec b/netpbm.spec
index 668a9f0..e70dc75 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,6 +1,6 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 10.96.00
+Version: 10.97.00
Release: 1%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
@@ -228,6 +228,9 @@ popd
%doc userguide/*
%changelog
+* Mon Jan 03 2022 Josef Ridky - 10.97.00-1
+- New upstream release 10.97.00 (#2035806)
+
* Mon Oct 04 2021 Josef Ridky - 10.96.00-1
- New upstream release 10.96.00 (#2007871)
diff --git a/sources b/sources
index 3470dc3..279df91 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-10.96.00.tar.xz) = 665567a9cca1badb0fcd595cbabe934f9edd1b443a148894266ee50eead3846a859fe71c4d4c18231c15258f9ab73a249ec409863b02ad03dff5e9c9018ddd87
+SHA512 (netpbm-10.97.00.tar.xz) = 798158ce3e7ac6c8154944989f98653d6e4db09abf6e573366996041edd44871d8f56ab1611ca7e580d352c2b61cf0c270233bd59f7d95283eb8feafb0eaed0e
From 7c5f7224b2fcd4275f73acfe80bc62cea8d5cdd9 Mon Sep 17 00:00:00 2001
From: Fedora Release Engineering
Date: Thu, 20 Jan 2022 21:05:26 +0000
Subject: [PATCH 13/42] - Rebuilt for
https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
Signed-off-by: Fedora Release Engineering
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index e70dc75..9eacc29 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 10.97.00
-Release: 1%{?dist}
+Release: 2%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -228,6 +228,9 @@ popd
%doc userguide/*
%changelog
+* Thu Jan 20 2022 Fedora Release Engineering - 10.97.00-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
+
* Mon Jan 03 2022 Josef Ridky - 10.97.00-1
- New upstream release 10.97.00 (#2035806)
From d9737875b125859bbe5d7eb7851ec9777f66817a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Fri, 11 Feb 2022 16:11:01 +0100
Subject: [PATCH 14/42] Rebuild for new jasper
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index 9eacc29..756a25e 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 10.97.00
-Release: 2%{?dist}
+Release: 3%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -228,6 +228,9 @@ popd
%doc userguide/*
%changelog
+* Fri Feb 11 2022 Josef Ridky - 10.97.00-3
+- Rebuild for new jasper
+
* Thu Jan 20 2022 Fedora Release Engineering - 10.97.00-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
From a752d63751466267841be4d3df47c2cc364e0c93 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Sun, 13 Feb 2022 11:04:30 +0100
Subject: [PATCH 15/42] Bump spec
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index 756a25e..942823d 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 10.97.00
-Release: 3%{?dist}
+Release: 4%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -228,6 +228,9 @@ popd
%doc userguide/*
%changelog
+* Sun Feb 13 2022 Josef Ridky - 10.97.00-4
+- Bump spec for new jasper
+
* Fri Feb 11 2022 Josef Ridky - 10.97.00-3
- Rebuild for new jasper
From 4b52b63f21a1880269293e1b2f20f6a807843830 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Wed, 29 Jun 2022 09:30:08 +0200
Subject: [PATCH 16/42] New upstream release
---
netpbm-security-code.patch | 155 +++++++------------
netpbm-security-scripts.patch | 284 ++++++++--------------------------
netpbm.spec | 7 +-
3 files changed, 126 insertions(+), 320 deletions(-)
diff --git a/netpbm-security-code.patch b/netpbm-security-code.patch
index 84deed0..90ee6f7 100644
--- a/netpbm-security-code.patch
+++ b/netpbm-security-code.patch
@@ -2830,42 +2830,6 @@ diff -ruNp a/other/pnmcolormap.c b/other/pnmcolormap.c
}
{
unsigned int const intQuotient = colormap.size / pamP->width;
-diff -ruNp a/urt/rle_addhist.c b/urt/rle_addhist.c
---- a/urt/rle_addhist.c 2021-06-02 15:53:59.825205563 +0200
-+++ b/urt/rle_addhist.c 2021-06-02 20:23:21.834634475 +0200
-@@ -70,13 +70,18 @@ rle_addhist(char * argv[],
- return;
-
- length = 0;
-- for (i = 0; argv[i]; ++i)
-+ for (i = 0; argv[i]; ++i) {
-+ overflow_add(length, strlen(argv[i]));
-+ overflow_add(length+1, strlen(argv[i]));
- length += strlen(argv[i]) +1; /* length of each arg plus space. */
-+ }
-
- time(&temp);
- timedate = ctime(&temp);
- length += strlen(timedate); /* length of date and time in ASCII. */
--
-+ overflow_add(strlen(padding), 4);
-+ overflow_add(strlen(histoire), strlen(padding) + 4);
-+ overflow_add(length, strlen(histoire) + strlen(padding) + 4);
- length += strlen(padding) + 3 + strlen(histoire) + 1;
- /* length of padding, "on " and length of history name plus "="*/
- if (in_hdr) /* if we are interested in the old comments... */
-@@ -84,8 +89,10 @@ rle_addhist(char * argv[],
- else
- old = NULL;
-
-- if (old && *old)
-+ if (old && *old) {
-+ overflow_add(length, strlen(old));
- length += strlen(old); /* add length if there. */
-+ }
-
- ++length; /*Cater for the null. */
-
diff -ruNp a/urt/rle_getrow.c b/urt/rle_getrow.c
--- a/urt/rle_getrow.c 2021-06-02 15:53:59.825205563 +0200
+++ b/urt/rle_getrow.c 2021-06-02 20:23:21.834634475 +0200
@@ -2946,72 +2910,59 @@ diff -ruNp a/urt/rle_putcom.c b/urt/rle_putcom.c
/* Not found */
/* Can't realloc because somebody else might be pointing to this
* comments block. Of course, if this were true, then the
-diff -ruNp a/urt/Runput.c b/urt/Runput.c
---- a/urt/Runput.c 2021-06-02 15:53:59.825205563 +0200
-+++ b/urt/Runput.c 2021-06-02 20:23:21.834634475 +0200
-@@ -202,10 +202,11 @@ RunSetup(rle_hdr * the_hdr)
+diff -urNp a/urt/rle_addhist.c b/urt/rle_addhist.c
+--- a/urt/rle_addhist.c 2022-06-28 08:11:09.204119859 +0200
++++ b/urt/rle_addhist.c 2022-06-29 09:20:31.573600515 +0200
+@@ -70,13 +70,19 @@ rle_addhist(char * argv[],
+ return;
+
+ length = 0;
+- for (i = 0; argv[i]; ++i)
++ for (i = 0; argv[i]; ++i) {
++ overflow_add(length, strlen(argv[i]));
++ overflow_add(length+1, strlen(argv[i]));
+ length += strlen(argv[i]) +1; /* length of each arg plus space. */
++ }
+
+ time(&temp);
+ timedate = ctime(&temp);
+ length += strlen(timedate); /* length of date and time in ASCII. */
+
++ overflow_add(strlen(padding), 4);
++ overflow_add(strlen(histoire), strlen(padding) + 4);
++ overflow_add(length, strlen(histoire) + strlen(padding) + 4);
+ length += strlen(padding) + 3 + strlen(histoire) + 1;
+ /* length of padding, "on " and length of history name plus "="*/
+ if (in_hdr) /* if we are interested in the old comments... */
+@@ -84,8 +90,10 @@ rle_addhist(char * argv[],
+ else
+ old = NULL;
+
+- if (old && *old)
++ if (old && *old) {
++ overflow_add(length, strlen(old));
+ length += strlen(old); /* add length if there. */
++ }
+
+ ++length; /*Cater for the null. */
+
+diff -urNp a/urt/Runput.c b/urt/Runput.c
+--- a/urt/Runput.c 2022-06-28 08:11:09.204119859 +0200
++++ b/urt/Runput.c 2022-06-29 09:28:03.951620062 +0200
+@@ -202,6 +202,7 @@ RunSetup(rle_hdr * the_hdr)
if ( the_hdr->background != 0 )
{
- register int i;
-- register rle_pixel *background =
-- (rle_pixel *)malloc( (unsigned)(the_hdr->ncolors + 1) );
-- register int *bg_color;
-- /*
-+ register rle_pixel *background;
-+ register int *bg_color;
-+
-+ overflow_add(the_hdr->ncolors,1);
-+ background = (rle_pixel *)malloc( (unsigned)(the_hdr->ncolors + 1) ); /*
- * If even number of bg color bytes, put out one more to get to
- * 16 bit boundary.
- */
+ int i;
++ overflow_add(the_hdr->ncolors, 1);
+ rle_pixel *background =
+ (rle_pixel *)malloc( (unsigned)(the_hdr->ncolors + 1) );
+ int *bg_color;
@@ -224,7 +225,7 @@ RunSetup(rle_hdr * the_hdr)
- /* Big-endian machines are harder */
- register int i, nmap = (1 << the_hdr->cmaplen) *
- the_hdr->ncmap;
-- register char *h_cmap = (char *)malloc( nmap * 2 );
-+ register char *h_cmap = (char *)malloc2( nmap, 2 );
- if ( h_cmap == NULL )
- {
- fprintf( stderr,
-diff -ruNp a/urt/scanargs.c b/urt/scanargs.c
---- a/urt/scanargs.c 2021-06-02 15:53:59.825205563 +0200
-+++ b/urt/scanargs.c 2021-06-02 20:56:36.681068294 +0200
-@@ -62,8 +62,8 @@ typedef int *ptr;
- /*
- * Storage allocation macros
- */
--#define NEW( type, cnt ) (type *) malloc( (cnt) * sizeof( type ) )
--#define RENEW( type, ptr, cnt ) (type *) realloc( ptr, (cnt) * sizeof( type ) )
-+#define NEW( type, cnt ) (type *) malloc2( (cnt), sizeof( type ) )
-+#define RENEW( type, ptr, cnt ) (type *) realloc2( ptr, (cnt), sizeof( type ) )
-
- static CONST_DECL char * prformat( CONST_DECL char *, int );
- static int isnum( CONST_DECL char *, int, int );
-@@ -114,7 +114,7 @@ va_list argl;
-
- bool required;
- int excnt; /* which flag is set */
-- unsigned int exflag; /* How many of a set of exclusive
-+ bool exflag; /* when set, one of a set of exclusive
- flags is set */
-
- bool list_of; /* set if parsing off a list of args */
-@@ -258,7 +258,7 @@ reswitch:
- /* go back to label */
- ncp = cp-1; /* remember */
- cp -= 3;
-- for (excnt = exflag = 0
-+ for (excnt = 0, exflag = NO
- ; *cp != ' ' && !(*cp=='-' &&(cp[-1]=='!'||cp[-1]=='%'));
- (--cp, excnt++))
- {
-@@ -273,7 +273,7 @@ reswitch:
- ERROR ("extra flags ignored");
- if (exflag)
- ERROR ("more than one exclusive flag chosen");
-- exflag++;
-+ exflag = YES;
- required = NO;
- check += cnt;
- arg_used[cnt] = 1;
+ /* Big-endian machines are harder */
+ int i, nmap = (1 << the_hdr->cmaplen) *
+ the_hdr->ncmap;
+- char *h_cmap = (char *)malloc( nmap * 2 );
++ char *h_cmap = (char *)malloc2( nmap, 2 );
+ if ( h_cmap == NULL )
+ {
+ fprintf( stderr,
diff --git a/netpbm-security-scripts.patch b/netpbm-security-scripts.patch
index 0ba822a..2730e5b 100644
--- a/netpbm-security-scripts.patch
+++ b/netpbm-security-scripts.patch
@@ -1,267 +1,119 @@
-diff --git a/editor/ppmfade b/editor/ppmfade
-index dcd7bf2..5091651 100755
---- a/editor/ppmfade
-+++ b/editor/ppmfade
-@@ -40,6 +40,7 @@ exec perl -w -x -S -- "$0" "$@"
- #
- ##############################################################################
- use strict;
-+use File::Temp "tempdir";
-
- sub doVersionHack($) {
- my ($argvR) = @_;
-@@ -149,20 +150,26 @@ if ($first_file ne "undefined") {
-
- print("Frames are " . $width . "W x " . $height . "H\n");
-
-+#
-+# We create a tmp-directory right here
-+#
-+my $tmpdir = tempdir("ppmfade.XXXXXX", CLEANUP => 1);
-+
-+
- if ($first_file eq "undefined") {
- print "Fading from black to ";
-- system("ppmmake \\#000 $width $height >junk1$$.ppm");
-+ system("ppmmake \\#000 $width $height >$tmpdir/junk1$$.ppm");
- } else {
- print "Fading from $first_file to ";
-- system("cp", $first_file, "junk1$$.ppm");
-+ system("cp", $first_file, "$tmpdir/junk1$$.ppm");
- }
-
- if ($last_file eq "undefined") {
- print "black.\n";
-- system("ppmmake \\#000 $width $height >junk2$$.ppm");
-+ system("ppmmake \\#000 $width $height >$tmpdir/junk2$$.ppm");
- } else {
- print "$last_file\n";
-- system("cp", $last_file, "junk2$$.ppm");
-+ system("cp", $last_file, "$tmpdir/junk2$$.ppm");
- }
-
- #
-@@ -170,14 +177,14 @@ if ($last_file eq "undefined") {
- #
-
- # Here's what our temporary files are:
--# junk1$$.ppm: The original (fade-from) image
--# junk2$$.ppm: The target (fade-from) image
--# junk3$$.ppm: The frame of the fade for the current iteration of the
--# the for loop.
--# junk1a$$.ppm: If the fade involves a ppmmix sequence from one intermediate
--# image to another, this is the first frame of that
--# sequence.
--# junk2a$$.ppm: This is the last frame of the above-mentioned ppmmix sequence
-+# $tmpdir/junk1$$.ppm: The original (fade-from) image
-+# $tmpdir/junk2$$.ppm: The target (fade-from) image
-+# $tmpdir/junk3$$.ppm: The frame of the fade for the current iteration of the
-+# the for loop.
-+# $tmpdir/junk1a$$.ppm: If the fade involves a ppmmix sequence from one intermediate
-+# image to another, this is the first frame of that
-+# sequence.
-+# $tmpdir/junk2a$$.ppm: This is the last frame of the above-mentioned ppmmix sequence
-
- my $i; # Frame number
- for ($i = 1; $i <= $nframes; $i++) {
-@@ -185,147 +192,147 @@ for ($i = 1; $i <= $nframes; $i++) {
- if ($mode eq $SPREAD) {
- if ($i <= 10) {
- my $n = $spline20[$i] * 100;
-- system("ppmspread $n junk1$$.ppm >junk3$$.ppm");
-+ system("ppmspread $n $tmpdir/junk1$$.ppm >$tmpdir/junk3$$.ppm");
- } elsif ($i <= 20) {
- my $n;
+diff -urNp a/editor/ppmfade b/editor/ppmfade
+--- a/editor/ppmfade 2022-06-28 07:58:59.195317750 +0200
++++ b/editor/ppmfade 2022-06-28 08:04:56.070643056 +0200
+@@ -215,84 +215,84 @@ for ($i = 1; $i <= $nframes; $i++) {
$n = $spline20[$i] * 100;
-- system("ppmspread $n junk1$$.ppm >junk1a$$.ppm");
-+ system("ppmspread $n $tmpdir/junk1$$.ppm >$tmpdir/junk1a$$.ppm");
- $n = (1-$spline20[$i-10]) * 100;
-- system("ppmspread $n junk2$$.ppm >junk2a$$.ppm");
-+ system("ppmspread $n $tmpdir/junk2$$.ppm >$tmpdir/junk2a$$.ppm");
- $n = $spline10[$i-10];
-- system("ppmmix $n junk1a$$.ppm junk2a$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk1a$$.ppm $tmpdir/junk2a$$.ppm >$tmpdir/junk3$$.ppm");
- } else {
- my $n = (1-$spline20[$i-10])*100;
-- system("ppmspread $n junk2$$.ppm >junk3$$.ppm");
-+ system("ppmspread $n $tmpdir/junk2$$.ppm >$tmpdir/junk3$$.ppm");
- }
- } elsif ($mode eq $SHIFT) {
- if ($i <= 10) {
- my $n = $spline20[$i] * 100;
-- system("ppmshift $n junk1$$.ppm >junk3$$.ppm");
-+ system("ppmshift $n $tmpdir/junk1$$.ppm >$tmpdir/junk3$$.ppm");
- } elsif ($i <= 20) {
- my $n;
- $n = $spline20[$i] * 100;
-- system("ppmshift $n junk1$$.ppm >junk1a$$.ppm");
-+ system("ppmshift $n $tmpdir/junk1$$.ppm >$tmpdir/junk1a$$.ppm");
+ system("ppmshift $n $tmpdir/junk1.ppm >$tmpdir/junk1a.ppm");
$n = (1-$spline20[$i-10])*100;
-- system("ppmshift $n junk2$$.ppm >junk2a$$.ppm");
-+ system("ppmshift $n $tmpdir/junk2$$.ppm >$tmpdir/junk2a$$.ppm");
+- system("ppmshift $n junk2.ppm >junk2a.ppm");
++ system("ppmshift $n $tmpdir/junk2.ppm >$tmpdir/junk2a.ppm");
$n = $spline10[$i-10];
-- system("ppmmix $n junk1a$$.ppm junk2a$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk1a$$.ppm $tmpdir/junk2a$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk1a.ppm junk2a.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk1a.ppm $tmpdir/junk2a.ppm >$tmpdir/junk3.ppm");
} else {
my $n = (1-$spline20[$i-10]) * 100;
-- system("ppmshift $n junk2$$.ppm >junk3$$.ppm");
-+ system("ppmshift $n $tmpdir/junk2$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmshift $n junk2.ppm >junk3.ppm");
++ system("ppmshift $n $tmpdir/junk2.ppm >$tmpdir/junk3.ppm");
}
} elsif ($mode eq $RELIEF) {
if ($i == 1) {
-- system("ppmrelief junk1$$.ppm >junk1r$$.ppm");
-+ system("ppmrelief $tmpdir/junk1$$.ppm >$tmpdir/junk1r$$.ppm");
+- system("ppmrelief junk1.ppm >junk1r.ppm");
++ system("ppmrelief $tmpdir/junk1.ppm >$tmpdir/junk1r.ppm");
}
if ($i <= 10) {
my $n = $spline10[$i];
-- system("ppmmix $n junk1$$.ppm junk1r$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk1$$.ppm $tmpdir/junk1r$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk1.ppm junk1r.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk1.ppm $tmpdir/junk1r.ppm >$tmpdir/junk3.ppm");
} elsif ($i <= 20) {
my $n = $spline10[$i-10];
-- system("ppmmix $n junk1r$$.ppm junk2r$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk1r$$.ppm $tmpdir/junk2r$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk1r.ppm junk2r.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk1r.ppm $tmpdir/junk2r.ppm >$tmpdir/junk3.ppm");
} else {
my $n = $spline10[$i-20];
-- system("ppmmix $n junk2r$$.ppm junk2$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk2r$$.ppm $tmpdir/junk2$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk2r.ppm junk2.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk2r.ppm $tmpdir/junk2.ppm >$tmpdir/junk3.ppm");
}
if ($i == 10) {
-- system("ppmrelief junk2$$.ppm >junk2r$$.ppm");
-+ system("ppmrelief $tmpdir/junk2$$.ppm >$tmpdir/junk2r$$.ppm");
+- system("ppmrelief junk2.ppm >junk2r.ppm");
++ system("ppmrelief $tmpdir/junk2.ppm >$tmpdir/junk2r.ppm");
}
} elsif ($mode eq $OIL) {
if ($i == 1) {
-- system("ppmtopgm junk1$$.ppm | pgmoil >junko$$.ppm");
-- system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
-- ">junk1o$$.ppm");
-+ system("ppmtopgm $tmpdir/junk1$$.ppm | pgmoil >$tmpdir/junko$$.ppm");
-+ system("rgb3toppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm " .
-+ ">$tmpdir/junk1o$$.ppm");
+- system("ppmtopgm junk1.ppm | pgmoil >junko.ppm");
+- system("rgb3toppm junko.ppm junko.ppm junko.ppm " .
+- ">junk1o.ppm");
++ system("ppmtopgm $tmpdir/junk1.ppm | pgmoil >$tmpdir/junko.ppm");
++ system("rgb3toppm $tmpdir/junko.ppm $tmpdir/junko.ppm $tmpdir/junko.ppm " .
++ ">$tmpdir/junk1o.ppm");
}
if ($i <= 10) {
my $n = $spline10[$i];
-- system("ppmmix $n junk1$$.ppm junk1o$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk1$$.ppm $tmpdir/junk1o$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk1.ppm junk1o.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk1.ppm $tmpdir/junk1o.ppm >$tmpdir/junk3.ppm");
} elsif ($i <= 20) {
my $n = $spline10[$i-10];
-- system("ppmmix $n junk1o$$.ppm junk2o$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk1o$$.ppm $tmpdir/junk2o$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk1o.ppm junk2o.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk1o.ppm $tmpdir/junk2o.ppm >$tmpdir/junk3.ppm");
} else {
my $n = $spline10[$i-20];
-- system("ppmmix $n junk2o$$.ppm junk2$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk2o$$.ppm $tmpdir/junk2$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk2o.ppm junk2.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk2o.ppm $tmpdir/junk2.ppm >$tmpdir/junk3.ppm");
}
if ($i == 10) {
-- system("ppmtopgm junk2$$.ppm | pgmoil >junko$$.ppm");
-- system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
-- ">junk2o$$.ppm");
-+ system("ppmtopgm $tmpdir/junk2$$.ppm | pgmoil >$tmpdir/junko$$.ppm");
-+ system("rgb3toppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm " .
-+ ">$tmpdir/junk2o$$.ppm");
+- system("ppmtopgm junk2.ppm | pgmoil >junko.ppm");
+- system("rgb3toppm junko.ppm junko.ppm junko.ppm " .
+- ">junk2o.ppm");
++ system("ppmtopgm $tmpdir/junk2.ppm | pgmoil >$tmpdir/junko.ppm");
++ system("rgb3toppm $tmpdir/junko.ppm $tmpdir/junko.ppm $tmpdir/junko.ppm " .
++ ">$tmpdir/junk2o.ppm");
}
} elsif ($mode eq $EDGE) {
if ($i == 1) {
-- system("ppmtopgm junk1$$.ppm | pgmedge >junko$$.ppm");
-- system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
-- ">junk1o$$.ppm");
-+ system("ppmtopgm $tmpdir/junk1$$.ppm | pgmedge >$tmpdir/junko$$.ppm");
-+ system("rgb3toppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm " .
-+ ">$tmpdir/junk1o$$.ppm");
+- system("ppmtopgm junk1.ppm | pgmedge >junko.ppm");
+- system("rgb3toppm junko.ppm junko.ppm junko.ppm " .
+- ">junk1o.ppm");
++ system("ppmtopgm $tmpdir/junk1.ppm | pgmedge >$tmpdir/junko.ppm");
++ system("rgb3toppm $tmpdir/junko.ppm $tmpdir/junko.ppm $tmpdir/junko.ppm " .
++ ">$tmpdir/junk1o.ppm");
}
if ($i <= 10) {
my $n = $spline10[$i];
-- system("ppmmix $n junk1$$.ppm junk1o$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk1$$.ppm $tmpdir/junk1o$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk1.ppm junk1o.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk1.ppm $tmpdir/junk1o.ppm >$tmpdir/junk3.ppm");
} elsif ($i <= 20) {
my $n = $spline10[$i-10];
-- system("ppmmix $n junk1o$$.ppm junk2o$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk1o$$.ppm $tmpdir/junk2o$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk1o.ppm junk2o.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk1o.ppm $tmpdir/junk2o.ppm >$tmpdir/junk3.ppm");
} else {
my $n = $spline10[$i-20];
-- system("ppmmix $n junk2o$$.ppm junk2$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk2o$$.ppm $tmpdir/junk2$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk2o.ppm junk2.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk2o.ppm $tmpdir/junk2.ppm >$tmpdir/junk3.ppm");
}
if ($i == 10) {
-- system("ppmtopgm junk2$$.ppm | pgmedge >junko$$.ppm");
-- system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
-- ">junk2o$$.ppm");
-+ system("ppmtopgm $tmpdir/junk2$$.ppm | pgmedge >$tmpdir/junko$$.ppm");
-+ system("rgb3toppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm " .
-+ ">$tmpdir/junk2o$$.ppm");
+- system("ppmtopgm junk2.ppm | pgmedge >junko.ppm");
+- system("rgb3toppm junko.ppm junko.ppm junko.ppm " .
+- ">junk2o.ppm");
++ system("ppmtopgm $tmpdir/junk2.ppm | pgmedge >$tmpdir/junko.ppm");
++ system("rgb3toppm $tmpdir/junko.ppm $tmpdir/junko.ppm $tmpdir/junko.ppm " .
++ ">$tmpdir/junk2o.ppm");
}
} elsif ($mode eq $BENTLEY) {
if ($i == 1) {
-- system("ppmtopgm junk1$$.ppm | pgmbentley >junko$$.ppm");
-- system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
-- ">junk1o$$.ppm");
-+ system("ppmtopgm $tmpdir/junk1$$.ppm | pgmbentley >$tmpdir/junko$$.ppm");
-+ system("rgb3toppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm " .
-+ ">$tmpdir/junk1o$$.ppm");
+- system("ppmtopgm junk1.ppm | pgmbentley >junko.ppm");
+- system("rgb3toppm junko.ppm junko.ppm junko.ppm " .
+- ">junk1o.ppm");
++ system("ppmtopgm $tmpdir/junk1.ppm | pgmbentley >$tmpdir/junko.ppm");
++ system("rgb3toppm $tmpdir/junko.ppm $tmpdir/junko.ppm $tmpdir/junko.ppm " .
++ ">$tmpdir/junk1o.ppm");
}
if ($i <= 10) {
my $n = $spline10[$i];
-- system("ppmmix $n junk1$$.ppm junk1o$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk1$$.ppm $tmpdir/junk1o$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk1.ppm junk1o.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk1.ppm $tmpdir/junk1o.ppm >$tmpdir/junk3.ppm");
} elsif ($i <= 20) {
my $n = $spline10[$i-10];
-- system("ppmmix $n junk1o$$.ppm junk2o$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk1o$$.ppm $tmpdir/junk2o$$.ppm >$tmpdir/junk3$$.ppm");
+- system("ppmmix $n junk1o.ppm junk2o.ppm >junk3.ppm");
++ system("ppmmix $n $tmpdir/junk1o.ppm $tmpdir/junk2o.ppm >$tmpdir/junk3.ppm");
} else {
my $n = $spline10[$i-20];
-- system("ppmmix $n junk2o$$.ppm junk2$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk2o$$.ppm $tmpdir/junk2$$.ppm >$tmpdir/junk3$$.ppm");
- }
- if ($i == 10) {
-- system("ppmtopgm junk2$$.ppm | pgmbentley >junko$$.ppm");
-- system("rgb3toppm junko$$.ppm junko$$.ppm junko$$.ppm " .
-- ">junk2o$$.ppm");
-+ system("ppmtopgm $tmpdir/junk2$$.ppm | pgmbentley >$tmpdir/junko$$.ppm");
-+ system("rgb3toppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm $tmpdir/junko$$.ppm " .
-+ ">$tmpdir/junk2o$$.ppm");
- }
- } elsif ($mode eq $BLOCK) {
- if ($i <= 10) {
- my $n = 1 - 1.9*$spline20[$i];
-- system("pamscale $n junk1$$.ppm | " .
-- "pamscale -width $width -height $height >junk3$$.ppm");
-+ system("pamscale $n $tmpdir/junk1$$.ppm | " .
-+ "pamscale -width $width -height $height >$tmpdir/junk3$$.ppm");
- } elsif ($i <= 20) {
- my $n = $spline10[$i-10];
-- system("ppmmix $n junk1a$$.ppm junk2a$$.ppm >junk3$$.ppm");
-+ system("ppmmix $n $tmpdir/junk1a$$.ppm $tmpdir/junk2a$$.ppm >$tmpdir/junk3$$.ppm");
- } else {
- my $n = 1 - 1.9*$spline20[31-$i];
-- system("pamscale $n junk2$$.ppm | " .
-- "pamscale -width $width -height $height >junk3$$.ppm");
-+ system("pamscale $n $tmpdir/junk2$$.ppm | " .
-+ "pamscale -width $width -height $height >$tmpdir/junk3$$.ppm");
- }
- if ($i == 10) {
-- system("cp", "junk3$$.ppm", "junk1a$$.ppm");
-- system("pamscale $n junk2$$.ppm | " .
-- "pamscale -width $width -height $height >junk2a$$.ppm");
-+ system("cp", "$tmpdir/junk3$$.ppm", "$tmpdir/junk1a$$.ppm");
-+ system("pamscale $n $tmpdir/junk2$$.ppm | " .
-+ "pamscale -width $width -height $height >$tmpdir/junk2a$$.ppm");
- }
- } elsif ($mode eq $MIX) {
- my $fade_factor = sqrt(1/($nframes-$i+1));
-- system("ppmmix $fade_factor junk1$$.ppm junk2$$.ppm >junk3$$.ppm");
-+ system("ppmmix $fade_factor $tmpdir/junk1$$.ppm $tmpdir/junk2$$.ppm >$tmpdir/junk3$$.ppm");
- } else {
- print("Internal error: impossible mode value '$mode'\n");
- }
-
- my $outfile = sprintf("%s.%04d.ppm", $base_name, $i);
-- system("cp", "junk3$$.ppm", $outfile);
-+ system("cp", "$tmpdir/junk3$$.ppm", $outfile);
- }
-
- #
- # Clean up shop.
- #
--system("rm junk*$$.ppm");
-+system("rm $tmpdir/junk*$$.ppm");
-
- exit(0);
+ system("ppmmix $n $tmpdir/junk2o.ppm $tmpdir/junk2.ppm " .
diff --git a/netpbm.spec b/netpbm.spec
index 942823d..48b1409 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 10.97.00
-Release: 4%{?dist}
+Version: 10.99.00
+Release: 1%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -228,6 +228,9 @@ popd
%doc userguide/*
%changelog
+* Tue Jun 28 2022 Josef Ridky - 10.99.00-1
+- New upstream release 10.99.00 (#2068865)
+
* Sun Feb 13 2022 Josef Ridky - 10.97.00-4
- Bump spec for new jasper
From cb344eef8650cb1e03d440f876600a43d830a891 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Wed, 29 Jun 2022 09:34:27 +0200
Subject: [PATCH 17/42] New sources
---
.gitignore | 1 +
sources | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index 3b1a710..42437db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,4 @@
/netpbm-10.95.00.tar.xz
/netpbm-10.96.00.tar.xz
/netpbm-10.97.00.tar.xz
+/netpbm-10.99.00.tar.xz
diff --git a/sources b/sources
index 279df91..c351c00 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-10.97.00.tar.xz) = 798158ce3e7ac6c8154944989f98653d6e4db09abf6e573366996041edd44871d8f56ab1611ca7e580d352c2b61cf0c270233bd59f7d95283eb8feafb0eaed0e
+SHA512 (netpbm-10.99.00.tar.xz) = 5741b6d1b8d993dbe6853c7ba81bef41491ef169b93e2bee0aba1ed138f28cd33a263b9cc747816e3c00fdd12462e8c59ac40fe39794dfb5082ae4b8f0dd5576
From 5c37322a5707718991a7cba3d013189aefe5fdb0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Wed, 29 Jun 2022 09:37:15 +0200
Subject: [PATCH 18/42] Update build flags
---
netpbm.spec | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/netpbm.spec b/netpbm.spec
index 48b1409..74b02a9 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -92,6 +92,7 @@ rm -rf converter/other/jpeg2000/libjasper/
rm -rf converter/other/jbig/libjbig/
%build
+%set_build_flags
./configure < - 10.99.00-1
- New upstream release 10.99.00 (#2068865)
+- Use %%set_build_flags to set environment variables
* Sun Feb 13 2022 Josef Ridky - 10.97.00-4
- Bump spec for new jasper
From 8784b08765ef84475ce1201761cf00f558cdd29c Mon Sep 17 00:00:00 2001
From: Fedora Release Engineering
Date: Fri, 22 Jul 2022 00:27:09 +0000
Subject: [PATCH 19/42] Rebuilt for
https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
Signed-off-by: Fedora Release Engineering
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index 74b02a9..ff7e49f 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 10.99.00
-Release: 1%{?dist}
+Release: 2%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -229,6 +229,9 @@ popd
%doc userguide/*
%changelog
+* Fri Jul 22 2022 Fedora Release Engineering - 10.99.00-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
+
* Tue Jun 28 2022 Josef Ridky - 10.99.00-1
- New upstream release 10.99.00 (#2068865)
- Use %%set_build_flags to set environment variables
From 7d1f2ca58a108031614186873407da0add1e1edc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Tue, 4 Oct 2022 13:31:13 +0200
Subject: [PATCH 20/42] Resolves: #2130384 - new upstream release 11.00.00
---
netpbm-security-code.patch | 364 +++++++++++++++++++------------------
netpbm.spec | 7 +-
2 files changed, 188 insertions(+), 183 deletions(-)
diff --git a/netpbm-security-code.patch b/netpbm-security-code.patch
index 90ee6f7..75c66e5 100644
--- a/netpbm-security-code.patch
+++ b/netpbm-security-code.patch
@@ -227,9 +227,31 @@ diff -ruNp a/converter/pbm/mgrtopbm.c b/converter/pbm/mgrtopbm.c
*padrightP = ((*colsP + pad - 1) / pad) * pad - *colsP;
}
-diff -ruNp a/converter/pbm/pbmtogem.c b/converter/pbm/pbmtogem.c
---- a/converter/pbm/pbmtogem.c 2021-06-02 15:53:59.828205592 +0200
-+++ b/converter/pbm/pbmtogem.c 2021-06-02 20:23:21.809634256 +0200
+diff --git a/converter/pbm/pbmto4425.c b/converter/pbm/pbmto4425.c
+index 1d97ac6..c4c8cbb 100644
+--- a/converter/pbm/pbmto4425.c
++++ b/converter/pbm/pbmto4425.c
+@@ -2,6 +2,7 @@
+
+ #include "nstring.h"
+ #include "pbm.h"
++#include
+
+ static char bit_table[2][3] = {
+ {1, 4, 0x10},
+@@ -160,7 +161,7 @@ main(int argc, char * argv[]) {
+ xres = vmap_width * 2;
+ yres = vmap_height * 3;
+
+- vmap = malloc(vmap_width * vmap_height * sizeof(char));
++ vmap = malloc3(vmap_width, vmap_height, sizeof(char));
+ if(vmap == NULL)
+ {
+ pm_error( "Cannot allocate memory" );
+diff --git a/converter/pbm/pbmtogem.c b/converter/pbm/pbmtogem.c
+index 4fd30e9..c82757d 100644
+--- a/converter/pbm/pbmtogem.c
++++ b/converter/pbm/pbmtogem.c
@@ -79,6 +79,7 @@ putinit (int const rows, int const cols)
bitsperitem = 0;
bitshift = 7;
@@ -351,35 +373,18 @@ diff -ruNp a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
- }
- return retval;
-}
--
+int make_pbm_stat(pbm_stat* pbm,FILE* fptr)
+{
+ char line[1024];
-+
+
+ pbm->fptr=fptr;
+ pbm->version=none;
+ pbm->current_line=0;
+ pbm->unread = 0;
-+
+
+ if (fgets (line, 1024, fptr) == NULL)
+ return 0;
+ line[strlen(line)-1] = 0;
-+
-+ if(!strcmp(line,"P1")) pbm->version=P1;
-+ if(!strcmp(line,"P4")) pbm->version=P4;
-+ if(pbm->version == none)
-+ {
-+ fprintf(stderr,"pbm_readheader(): unknown PBM magic '%s'\n",line);
-+ return 0;
-+ }
-+
-+ do
-+ if (fgets (line, 1024, fptr) == NULL)
-+ return 0;
-+ while (line[0] == '#');
-
-+ if (2 != sscanf (line, "%d %d", &pbm->width, &pbm->height))
-+ return 0;
-static int
-getbytes(FILE * const ifP,
@@ -418,11 +423,23 @@ diff -ruNp a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
- retval = 1;
- }
- return retval;
-+ return 1;
- }
+-}
++ if(!strcmp(line,"P1")) pbm->version=P1;
++ if(!strcmp(line,"P4")) pbm->version=P4;
++ if(pbm->version == none)
++ {
++ fprintf(stderr,"pbm_readheader(): unknown PBM magic '%s'\n",line);
++ return 0;
++ }
+
++ do
++ if (fgets (line, 1024, fptr) == NULL)
++ return 0;
++ while (line[0] == '#');
+
++ if (2 != sscanf (line, "%d %d", &pbm->width, &pbm->height))
++ return 0;
--
--
-int
-pbm_readline(pbm_stat * const pbmStatP,
- unsigned char * const data) {
@@ -469,6 +486,11 @@ diff -ruNp a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
- retval = 0;
- }
- }
+- }
+- return retval;
++ return 1;
+ }
+
+static int getbytes(FILE *fptr,int width,unsigned char* data)
+{
+ unsigned char mask,acc,*place;
@@ -493,13 +515,12 @@ diff -ruNp a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
+ acc=0;
+ mask=0x80;
+ }
- }
-- return retval;
++ }
+ }
+ if(width%8)
+ *place=acc;
+ return 1;
- }
++}
+/* Reads a single line into data which must be at least (pbm->width+7)/8
+ bytes of storage */
@@ -519,16 +540,6 @@ diff -ruNp a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
+ return 1;
+ }
-+ switch(pbm->version)
-+ {
-+ case P1:
-+ if(getbytes(pbm->fptr,pbm->width,data))
-+ {
-+ pbm->current_line++;
-+ return 1;
-+ }
-+ return 0;
-
-void
-pbm_unreadline(pbm_stat * const pbmStatP,
- void * const data) {
@@ -542,6 +553,17 @@ diff -ruNp a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
- pbmStatP->revdata = malloc ((pbmStatP->width+7)/8);
- memcpy(pbmStatP->revdata, data, (pbmStatP->width+7)/8);
- --pbmStatP->current_line;
++ switch(pbm->version)
++ {
++ case P1:
++ if(getbytes(pbm->fptr,pbm->width,data))
++ {
++ pbm->current_line++;
++ return 1;
+ }
+-}
++ return 0;
++
+ case P4:
+ overflow_add(pbm->width, 7);
+ tmp=(pbm->width+7)/8;
@@ -550,8 +572,7 @@ diff -ruNp a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
+ {
+ pbm->current_line++;
+ return 1;
- }
--}
++ }
+ fprintf(stderr,"pbm_readline(): error reading line data (%d)\n",tmp2);
+ return 0;
@@ -597,29 +618,10 @@ diff -ruNp a/converter/pbm/pbmtoxbm.c b/converter/pbm/pbmtoxbm.c
putinit(xbmVersion);
-diff -ruNp a/converter/pbm/pbmto4425.c b/converter/pbm/pbmto4425.c
---- a/converter/pbm/pbmto4425.c 2021-06-02 15:53:59.827205582 +0200
-+++ b/converter/pbm/pbmto4425.c 2021-06-02 20:23:21.808634248 +0200
-@@ -2,6 +2,7 @@
-
- #include "nstring.h"
- #include "pbm.h"
-+#include
-
- static char bit_table[2][3] = {
- {1, 4, 0x10},
-@@ -160,7 +161,7 @@ main(int argc, char * argv[]) {
- xres = vmap_width * 2;
- yres = vmap_height * 3;
-
-- vmap = malloc(vmap_width * vmap_height * sizeof(char));
-+ vmap = malloc3(vmap_width, vmap_height, sizeof(char));
- if(vmap == NULL)
- {
- pm_error( "Cannot allocate memory" );
-diff -ruNp a/converter/pbm/pktopbm.c b/converter/pbm/pktopbm.c
---- a/converter/pbm/pktopbm.c 2021-06-02 15:53:59.828205592 +0200
-+++ b/converter/pbm/pktopbm.c 2021-06-02 20:23:21.813634291 +0200
+diff --git a/converter/pbm/pktopbm.c b/converter/pbm/pktopbm.c
+index 712f339..b6fcb02 100644
+--- a/converter/pbm/pktopbm.c
++++ b/converter/pbm/pktopbm.c
@@ -280,6 +280,7 @@ main(int argc, char *argv[]) {
if (flagbyte == 7) { /* long form preamble */
integer packetlength = get32() ; /* character packet length */
@@ -694,9 +696,23 @@ diff -ruNp a/converter/pgm/psidtopgm.c b/converter/pgm/psidtopgm.c
grayrow = pgm_allocrow((cols + 7) / 8 * 8);
for (row = 0; row < rows; ++row) {
unsigned int col;
-diff -ruNp a/converter/ppm/ilbmtoppm.c b/converter/ppm/ilbmtoppm.c
---- a/converter/ppm/ilbmtoppm.c 2021-06-02 15:53:59.846205765 +0200
-+++ b/converter/ppm/ilbmtoppm.c 2021-06-02 20:23:21.817634326 +0200
+diff --git a/converter/ppm/Makefile b/converter/ppm/Makefile
+index 003ef8d..b97349d 100644
+--- a/converter/ppm/Makefile
++++ b/converter/ppm/Makefile
+@@ -11,7 +11,7 @@ SUBDIRS = hpcdtoppm ppmtompeg
+
+ PORTBINARIES = 411toppm eyuvtoppm gouldtoppm ilbmtoppm imgtoppm \
+ leaftoppm mtvtoppm neotoppm \
+- pcxtoppm pc1toppm pi1toppm picttoppm pjtoppm \
++ pcxtoppm pc1toppm pi1toppm pjtoppm \
+ ppmtoacad ppmtoapplevol ppmtoarbtxt ppmtoascii \
+ ppmtobmp ppmtoeyuv ppmtogif ppmtoicr ppmtoilbm \
+ ppmtoleaf ppmtolj ppmtomitsu ppmtoneo \
+diff --git a/converter/ppm/ilbmtoppm.c b/converter/ppm/ilbmtoppm.c
+index b9b8986..f4fe331 100644
+--- a/converter/ppm/ilbmtoppm.c
++++ b/converter/ppm/ilbmtoppm.c
@@ -608,6 +608,7 @@ decode_row(FILE * const ifP,
rawtype *chp;
@@ -786,22 +802,11 @@ diff -ruNp a/converter/ppm/imgtoppm.c b/converter/ppm/imgtoppm.c
if ( len != cols * rows )
pm_message(
"pixel data length (%d) does not match image size (%d)",
-diff -ruNp a/converter/ppm/Makefile b/converter/ppm/Makefile
---- a/converter/ppm/Makefile 2021-06-02 15:53:59.846205765 +0200
-+++ b/converter/ppm/Makefile 2021-06-02 20:23:21.815634309 +0200
-@@ -11,7 +11,7 @@ SUBDIRS = hpcdtoppm ppmtompeg
-
- PORTBINARIES = 411toppm eyuvtoppm gouldtoppm ilbmtoppm imgtoppm \
- leaftoppm mtvtoppm neotoppm \
-- pcxtoppm pc1toppm pi1toppm picttoppm pjtoppm \
-+ pcxtoppm pc1toppm pi1toppm pjtoppm \
- ppmtoacad ppmtoapplevol ppmtoarbtxt ppmtoascii \
- ppmtobmp ppmtoeyuv ppmtogif ppmtoicr ppmtoilbm \
- ppmtoleaf ppmtolj ppmtomitsu ppmtoneo \
-diff -ruNp a/converter/ppm/pcxtoppm.c b/converter/ppm/pcxtoppm.c
---- a/converter/ppm/pcxtoppm.c 2021-06-02 15:53:59.846205765 +0200
-+++ b/converter/ppm/pcxtoppm.c 2021-06-02 20:23:21.818634335 +0200
-@@ -409,6 +409,7 @@ pcx_planes_to_pixels(pixels, bitplanes,
+diff --git a/converter/ppm/pcxtoppm.c b/converter/ppm/pcxtoppm.c
+index e252ba2..270ae3b 100644
+--- a/converter/ppm/pcxtoppm.c
++++ b/converter/ppm/pcxtoppm.c
+@@ -409,6 +409,7 @@ pcx_planes_to_pixels(pixels, bitplanes, bytesperline, planes, bitsperpixel)
/*
* clear the pixel buffer
*/
@@ -1428,6 +1433,9 @@ diff -ruNp a/converter/ppm/ppmtopcx.c b/converter/ppm/ppmtopcx.c
- putword(yPos, ofP); /* y1 - image top */
- putword(xPos+cols-1, ofP); /* x2 - image right */
- putword(yPos+rows-1, ofP); /* y2 - image bottom */
+-
+- putword(cols, ofP); /* horizontal resolution */
+- putword(rows, ofP); /* vertical resolution */
+write_header(FILE * const fp,
+ int const cols,
+ int const rows,
@@ -1448,9 +1456,7 @@ diff -ruNp a/converter/ppm/ppmtopcx.c b/converter/ppm/ppmtopcx.c
+ Putword(yPos, fp); /* y1 - image top */
+ Putword(xPos+cols-1, fp); /* x2 - image right */
+ Putword(yPos+rows-1, fp); /* y2 - image bottom */
-
-- putword(cols, ofP); /* horizontal resolution */
-- putword(rows, ofP); /* vertical resolution */
++
+ Putword(cols, fp); /* horizontal resolution */
+ Putword(rows, fp); /* vertical resolution */
@@ -1635,10 +1641,11 @@ diff -ruNp a/converter/ppm/ppmtopcx.c b/converter/ppm/ppmtopcx.c
}
}
}
-@@ -440,142 +453,83 @@ writeRaster16Color(FILE * const ofP,
+@@ -439,143 +452,84 @@ writeRaster16Color(FILE * const ofP,
- static void
+
+-static void
-ppmTo16ColorPcx(pixel ** const pixels,
- unsigned int const cols,
- unsigned int const rows,
@@ -1679,7 +1686,7 @@ diff -ruNp a/converter/ppm/ppmtopcx.c b/converter/ppm/ppmtopcx.c
-
-
-
--static void
+ static void
ppmTo256ColorPcx(pixel ** const pixels,
- unsigned int const cols,
- unsigned int const rows,
@@ -1753,13 +1760,13 @@ diff -ruNp a/converter/ppm/ppmtopcx.c b/converter/ppm/ppmtopcx.c
- unsigned char * grnrow;
- unsigned char * blurow;
- unsigned int row;
--
-- MALLOCARRAY(redrow, cols);
-- MALLOCARRAY(grnrow, cols);
-- MALLOCARRAY(blurow, cols);
+ unsigned char *redrow, *greenrow, *bluerow;
+ int col, row;
+- MALLOCARRAY(redrow, cols);
+- MALLOCARRAY(grnrow, cols);
+- MALLOCARRAY(blurow, cols);
+-
- if (!redrow || !grnrow || !blurow)
- pm_error("Unable to allocate buffer for a row of %u pixels", cols);
+ redrow = (unsigned char *)pm_allocrow(cols, sizeof(unsigned char));
@@ -2623,20 +2630,10 @@ diff -ruNp a/editor/pnmhisteq.c b/editor/pnmhisteq.c
MALLOCARRAY(lumahist, maxval + 1);
if (lumahist == NULL)
pm_error("Out of storage allocating array for %u histogram elements",
-diff -ruNp a/editor/pnmindex.csh b/editor/pnmindex.csh
---- a/editor/pnmindex.csh 2021-06-02 15:53:59.801205332 +0200
-+++ b/editor/pnmindex.csh 2021-06-02 20:23:21.829634431 +0200
-@@ -1,5 +1,7 @@
- #!/bin/csh -f
- #
-+echo "Unsafe code, needs debugging, do not ship"
-+exit 1
- # pnmindex - build a visual index of a bunch of anymaps
- #
- # Copyright (C) 1991 by Jef Poskanzer.
-diff -ruNp a/editor/pnmpad.c b/editor/pnmpad.c
---- a/editor/pnmpad.c 2021-06-02 15:53:59.808205400 +0200
-+++ b/editor/pnmpad.c 2021-06-02 20:23:21.829634431 +0200
+diff --git a/editor/pnmpad.c b/editor/pnmpad.c
+index 9fa9f9e..6b98204 100644
+--- a/editor/pnmpad.c
++++ b/editor/pnmpad.c
@@ -654,6 +654,8 @@ main(int argc, const char ** argv) {
computePadSizes(cmdline, cols, rows, &lpad, &rpad, &tpad, &bpad);
@@ -2830,21 +2827,32 @@ diff -ruNp a/other/pnmcolormap.c b/other/pnmcolormap.c
}
{
unsigned int const intQuotient = colormap.size / pamP->width;
-diff -ruNp a/urt/rle_getrow.c b/urt/rle_getrow.c
---- a/urt/rle_getrow.c 2021-06-02 15:53:59.825205563 +0200
-+++ b/urt/rle_getrow.c 2021-06-02 20:23:21.834634475 +0200
-@@ -164,6 +164,7 @@ rle_get_setup(rle_hdr * const the_hdr) {
- char * cp;
-
- VAXSHORT(comlen, infile); /* get comment length */
-+ overflow_add(comlen, 1);
- evenlen = (comlen + 1) & ~1; /* make it even */
- if (evenlen) {
- MALLOCARRAY(comment_buf, evenlen);
-diff -ruNp a/urt/rle.h b/urt/rle.h
---- a/urt/rle.h 2021-06-02 15:53:59.825205563 +0200
-+++ b/urt/rle.h 2021-06-02 20:23:21.834634475 +0200
-@@ -153,6 +153,17 @@ rle_hdr /* End of typedef. *
+diff --git a/urt/Runput.c b/urt/Runput.c
+index 1a7f2f7..de2737b 100644
+--- a/urt/Runput.c
++++ b/urt/Runput.c
+@@ -202,6 +202,7 @@ RunSetup(rle_hdr * the_hdr)
+ if ( the_hdr->background != 0 )
+ {
+ int i;
++ overflow_add(the_hdr->ncolors, 1);
+ rle_pixel *background =
+ (rle_pixel *)malloc( (unsigned)(the_hdr->ncolors + 1) );
+ int *bg_color;
+@@ -224,7 +225,7 @@ RunSetup(rle_hdr * the_hdr)
+ /* Big-endian machines are harder */
+ int i, nmap = (1 << the_hdr->cmaplen) *
+ the_hdr->ncmap;
+- char *h_cmap = (char *)malloc( nmap * 2 );
++ char *h_cmap = (char *)malloc2( nmap, 2 );
+ if ( h_cmap == NULL )
+ {
+ fprintf( stderr,
+diff --git a/urt/rle.h b/urt/rle.h
+index 1e7ddd0..df45dd9 100644
+--- a/urt/rle.h
++++ b/urt/rle.h
+@@ -152,6 +152,17 @@ rle_hdr /* End of typedef. */
*/
extern rle_hdr rle_dflt_hdr;
@@ -2862,9 +2870,59 @@ diff -ruNp a/urt/rle.h b/urt/rle.h
/* Declare RLE library routines. */
-diff -ruNp a/urt/rle_hdr.c b/urt/rle_hdr.c
---- a/urt/rle_hdr.c 2021-06-02 15:53:59.825205563 +0200
-+++ b/urt/rle_hdr.c 2021-06-02 20:23:21.835634483 +0200
+diff --git a/urt/rle_addhist.c b/urt/rle_addhist.c
+index 45c3dbf..ef13973 100644
+--- a/urt/rle_addhist.c
++++ b/urt/rle_addhist.c
+@@ -70,13 +70,19 @@ rle_addhist(char * argv[],
+ return;
+
+ length = 0;
+- for (i = 0; argv[i]; ++i)
++ for (i = 0; argv[i]; ++i) {
++ overflow_add(length, strlen(argv[i]));
++ overflow_add(length+1, strlen(argv[i]));
+ length += strlen(argv[i]) +1; /* length of each arg plus space. */
++ }
+
+ time(&temp);
+ timedate = ctime(&temp);
+ length += strlen(timedate); /* length of date and time in ASCII. */
+
++ overflow_add(strlen(padding), 4);
++ overflow_add(strlen(histoire), strlen(padding) + 4);
++ overflow_add(length, strlen(histoire) + strlen(padding) + 4);
+ length += strlen(padding) + 3 + strlen(histoire) + 1;
+ /* length of padding, "on " and length of history name plus "="*/
+ if (in_hdr) /* if we are interested in the old comments... */
+@@ -84,8 +90,10 @@ rle_addhist(char * argv[],
+ else
+ old = NULL;
+
+- if (old && *old)
++ if (old && *old) {
++ overflow_add(length, strlen(old));
+ length += strlen(old); /* add length if there. */
++ }
+
+ ++length; /*Cater for the null. */
+
+diff --git a/urt/rle_getrow.c b/urt/rle_getrow.c
+index a24870a..0ba62c3 100644
+--- a/urt/rle_getrow.c
++++ b/urt/rle_getrow.c
+@@ -164,6 +164,7 @@ rle_get_setup(rle_hdr * const the_hdr) {
+ char * cp;
+
+ VAXSHORT(comlen, infile); /* get comment length */
++ overflow_add(comlen, 1);
+ evenlen = (comlen + 1) & ~1; /* make it even */
+ if (evenlen) {
+ MALLOCARRAY(comment_buf, evenlen);
+diff --git a/urt/rle_hdr.c b/urt/rle_hdr.c
+index 8ceaa9e..4c13037 100644
+--- a/urt/rle_hdr.c
++++ b/urt/rle_hdr.c
@@ -148,7 +148,7 @@ rle_hdr_cp(rle_hdr * const fromHdrP,
if (toHdrP->cmap) {
size_t const size =
@@ -2910,59 +2968,3 @@ diff -ruNp a/urt/rle_putcom.c b/urt/rle_putcom.c
/* Not found */
/* Can't realloc because somebody else might be pointing to this
* comments block. Of course, if this were true, then the
-diff -urNp a/urt/rle_addhist.c b/urt/rle_addhist.c
---- a/urt/rle_addhist.c 2022-06-28 08:11:09.204119859 +0200
-+++ b/urt/rle_addhist.c 2022-06-29 09:20:31.573600515 +0200
-@@ -70,13 +70,19 @@ rle_addhist(char * argv[],
- return;
-
- length = 0;
-- for (i = 0; argv[i]; ++i)
-+ for (i = 0; argv[i]; ++i) {
-+ overflow_add(length, strlen(argv[i]));
-+ overflow_add(length+1, strlen(argv[i]));
- length += strlen(argv[i]) +1; /* length of each arg plus space. */
-+ }
-
- time(&temp);
- timedate = ctime(&temp);
- length += strlen(timedate); /* length of date and time in ASCII. */
-
-+ overflow_add(strlen(padding), 4);
-+ overflow_add(strlen(histoire), strlen(padding) + 4);
-+ overflow_add(length, strlen(histoire) + strlen(padding) + 4);
- length += strlen(padding) + 3 + strlen(histoire) + 1;
- /* length of padding, "on " and length of history name plus "="*/
- if (in_hdr) /* if we are interested in the old comments... */
-@@ -84,8 +90,10 @@ rle_addhist(char * argv[],
- else
- old = NULL;
-
-- if (old && *old)
-+ if (old && *old) {
-+ overflow_add(length, strlen(old));
- length += strlen(old); /* add length if there. */
-+ }
-
- ++length; /*Cater for the null. */
-
-diff -urNp a/urt/Runput.c b/urt/Runput.c
---- a/urt/Runput.c 2022-06-28 08:11:09.204119859 +0200
-+++ b/urt/Runput.c 2022-06-29 09:28:03.951620062 +0200
-@@ -202,6 +202,7 @@ RunSetup(rle_hdr * the_hdr)
- if ( the_hdr->background != 0 )
- {
- int i;
-+ overflow_add(the_hdr->ncolors, 1);
- rle_pixel *background =
- (rle_pixel *)malloc( (unsigned)(the_hdr->ncolors + 1) );
- int *bg_color;
-@@ -224,7 +225,7 @@ RunSetup(rle_hdr * the_hdr)
- /* Big-endian machines are harder */
- int i, nmap = (1 << the_hdr->cmaplen) *
- the_hdr->ncmap;
-- char *h_cmap = (char *)malloc( nmap * 2 );
-+ char *h_cmap = (char *)malloc2( nmap, 2 );
- if ( h_cmap == NULL )
- {
- fprintf( stderr,
diff --git a/netpbm.spec b/netpbm.spec
index ff7e49f..a99239b 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 10.99.00
-Release: 2%{?dist}
+Version: 11.00.00
+Release: 1%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -229,6 +229,9 @@ popd
%doc userguide/*
%changelog
+* Tue Oct 04 2022 Josef Ridky - 11.00.00-1
+- New upstream release 11.00.00 (#2130384)
+
* Fri Jul 22 2022 Fedora Release Engineering - 10.99.00-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
From b221824812984f55cd9ee8a8685243b243d35301 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Tue, 4 Oct 2022 13:36:43 +0200
Subject: [PATCH 21/42] Update source files
---
.gitignore | 1 +
sources | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index 42437db..f55f620 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,3 +23,4 @@
/netpbm-10.96.00.tar.xz
/netpbm-10.97.00.tar.xz
/netpbm-10.99.00.tar.xz
+/netpbm-11.00.00.tar.xz
diff --git a/sources b/sources
index c351c00..796a75d 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-10.99.00.tar.xz) = 5741b6d1b8d993dbe6853c7ba81bef41491ef169b93e2bee0aba1ed138f28cd33a263b9cc747816e3c00fdd12462e8c59ac40fe39794dfb5082ae4b8f0dd5576
+SHA512 (netpbm-11.00.00.tar.xz) = e6eb1b387b55e4c0e08e1c783ef4eca3135d00b77f29a470238531d770190e3eedd4fd98cd4ca4dc4d6aaed5d23245489de70b9a4bc200d5c6b9c27e1d492e2f
From fa99cfecf1a00e44206549775231bbd90ccf9126 Mon Sep 17 00:00:00 2001
From: Florian Weimer
Date: Fri, 2 Dec 2022 21:13:30 +0100
Subject: [PATCH 22/42] Port downstream-specific patches to C99
Related to:
---
netpbm-c99.patch | 46 ++++++++++++++++++++++++++++++++++++++++++++++
netpbm.spec | 6 +++++-
2 files changed, 51 insertions(+), 1 deletion(-)
create mode 100644 netpbm-c99.patch
diff --git a/netpbm-c99.patch b/netpbm-c99.patch
new file mode 100644
index 0000000..ed0a887
--- /dev/null
+++ b/netpbm-c99.patch
@@ -0,0 +1,46 @@
+Include "pm.h" for the declaration of the overflow_add function. This
+avoids an implicit function declaration. Future C compilers will
+require that all functions are declared explicitly. Implicit function
+declarations are a language feature that was removed in 1999.
+
+Likewise, include "pm.h" for the newly added declarations of realloc2.
+This fixes a pointer truncation bug in pjtoppm.
+
+Both issues are specific to downstream patches.
+
+diff --git a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
+index 1c8d236219b297e1..d63cab63b13f2051 100644
+--- a/converter/pbm/pbmtoppa/pbm.c
++++ b/converter/pbm/pbmtoppa/pbm.c
+@@ -12,6 +12,7 @@
+ #include
+ #include
+
++#include "pm.h"
+ #include "ppapbm.h"
+
+ int make_pbm_stat(pbm_stat* pbm,FILE* fptr)
+diff --git a/converter/ppm/pjtoppm.c b/converter/ppm/pjtoppm.c
+index c458c06457c2b9bd..5e93a6acb8d6f198 100644
+--- a/converter/ppm/pjtoppm.c
++++ b/converter/ppm/pjtoppm.c
+@@ -10,6 +10,7 @@
+ ** implied warranty.
+ */
+
++#include "pm.h"
+ #include "ppm.h"
+ #include "mallocvar.h"
+
+diff --git a/lib/pm.h b/lib/pm.h
+index 5037c2519c565fbc..435445d5e7f52fbf 100644
+--- a/lib/pm.h
++++ b/lib/pm.h
+@@ -457,6 +457,7 @@ pm_parse_height(const char * const arg);
+
+ void *malloc2(int, int);
+ void *malloc3(int, int, int);
++void *realloc2(void * a, int b, int c);
+ #define overflow2(a,b) __overflow2(a,b)
+ void __overflow2(int, int);
+ void overflow3(int, int, int);
diff --git a/netpbm.spec b/netpbm.spec
index a99239b..23cb95d 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.00.00
-Release: 1%{?dist}
+Release: 2%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -29,6 +29,7 @@ Patch14: netpbm-pamtojpeg2k.patch
Patch15: netpbm-manfix.patch
Patch16: netpbm-jasper.patch
Patch17: netpbm-libdir-so.patch
+Patch18: netpbm-c99.patch
BuildRequires: make
BuildRequires: libjpeg-devel, libpng-devel, libtiff-devel, flex, gcc, jbigkit-devel
@@ -229,6 +230,9 @@ popd
%doc userguide/*
%changelog
+* Fri Dec 2 2022 Florian Weimer - 11.00.00-2
+- Port downstream-specific patches to C99
+
* Tue Oct 04 2022 Josef Ridky - 11.00.00-1
- New upstream release 11.00.00 (#2130384)
From 5795887f4aa084c923cceb90621466bb62469f1f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Mon, 2 Jan 2023 11:03:11 +0100
Subject: [PATCH 23/42] Resolve: #2157125 - new upstream release 11.01.00
---
.gitignore | 1 +
netpbm.spec | 9 ++++++---
sources | 2 +-
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/.gitignore b/.gitignore
index f55f620..032fc30 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,4 @@
/netpbm-10.97.00.tar.xz
/netpbm-10.99.00.tar.xz
/netpbm-11.00.00.tar.xz
+/netpbm-11.01.00.tar.xz
diff --git a/netpbm.spec b/netpbm.spec
index 23cb95d..1424ca8 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 11.00.00
-Release: 2%{?dist}
+Version: 11.01.00
+Release: 1%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -230,7 +230,10 @@ popd
%doc userguide/*
%changelog
-* Fri Dec 2 2022 Florian Weimer - 11.00.00-2
+* Mon Jan 02 2023 Josef Ridky - 11.01.00-1
+- New upstream release 11.01.00 (#2157125)
+
+* Fri Dec 02 2022 Florian Weimer - 11.00.00-2
- Port downstream-specific patches to C99
* Tue Oct 04 2022 Josef Ridky - 11.00.00-1
diff --git a/sources b/sources
index 796a75d..6364db9 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-11.00.00.tar.xz) = e6eb1b387b55e4c0e08e1c783ef4eca3135d00b77f29a470238531d770190e3eedd4fd98cd4ca4dc4d6aaed5d23245489de70b9a4bc200d5c6b9c27e1d492e2f
+SHA512 (netpbm-11.01.00.tar.xz) = d96b428e3cd19ccbdb7fcfea617133e06e6c2f567b4850d6ffe8d15e33d51d18d87f79019230a129090815404ebfa506b61525afd94955a6a06b32ec1a92bb98
From 04107c7817e550c318452f5dd59b8c85e82c91aa Mon Sep 17 00:00:00 2001
From: Fedora Release Engineering
Date: Thu, 19 Jan 2023 21:28:02 +0000
Subject: [PATCH 24/42] Rebuilt for
https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
Signed-off-by: Fedora Release Engineering
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index 1424ca8..44b9f72 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.01.00
-Release: 1%{?dist}
+Release: 2%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -230,6 +230,9 @@ popd
%doc userguide/*
%changelog
+* Thu Jan 19 2023 Fedora Release Engineering - 11.01.00-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
+
* Mon Jan 02 2023 Josef Ridky - 11.01.00-1
- New upstream release 11.01.00 (#2157125)
From 75a7fd8929e17b7040487deeaa5ea10423277c23 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josef=20=C5=98=C3=ADdk=C3=BD?=
Date: Mon, 27 Mar 2023 09:22:02 +0200
Subject: [PATCH 25/42] Resolves: #2157125 - new upstream release 11.02.00
---
.gitignore | 1 +
netpbm.spec | 7 +++++--
sources | 2 +-
3 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/.gitignore b/.gitignore
index 032fc30..8c6b1cc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,3 +25,4 @@
/netpbm-10.99.00.tar.xz
/netpbm-11.00.00.tar.xz
/netpbm-11.01.00.tar.xz
+/netpbm-11.02.00.tar.xz
diff --git a/netpbm.spec b/netpbm.spec
index 44b9f72..5780cc7 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 11.01.00
-Release: 2%{?dist}
+Version: 11.02.00
+Release: 1%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -230,6 +230,9 @@ popd
%doc userguide/*
%changelog
+* Mon Mar 27 2023 Josef Ridky - 11.02.00-1
+- New upstream release 11.02.00 (#2157125)
+
* Thu Jan 19 2023 Fedora Release Engineering - 11.01.00-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
diff --git a/sources b/sources
index 6364db9..26ee665 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-11.01.00.tar.xz) = d96b428e3cd19ccbdb7fcfea617133e06e6c2f567b4850d6ffe8d15e33d51d18d87f79019230a129090815404ebfa506b61525afd94955a6a06b32ec1a92bb98
+SHA512 (netpbm-11.02.00.tar.xz) = 499cb8fb3897025b25842bd3408f91d08270ce912a9003e7ae4e6c16b7bb0a5c15372aa375ba464255bb4f005c213627b7e7c9749e37087cd0a895ba199899ae
From 428d12c737b0c5dcfafd7723f2f2814726d697fd Mon Sep 17 00:00:00 2001
From: Fedora Release Engineering
Date: Thu, 20 Jul 2023 16:32:37 +0000
Subject: [PATCH 26/42] Rebuilt for
https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
Signed-off-by: Fedora Release Engineering
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index 5780cc7..28600b4 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.02.00
-Release: 1%{?dist}
+Release: 2%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -230,6 +230,9 @@ popd
%doc userguide/*
%changelog
+* Thu Jul 20 2023 Fedora Release Engineering - 11.02.00-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
+
* Mon Mar 27 2023 Josef Ridky - 11.02.00-1
- New upstream release 11.02.00 (#2157125)
From a5280fda997d39b3c304a61817a6b31fea1d2121 Mon Sep 17 00:00:00 2001
From: Yaakov Selkowitz
Date: Thu, 10 Aug 2023 02:19:22 -0400
Subject: [PATCH 27/42] Fix flatpak build
When built for flatpaks, this will use the /app prefix, but netpbm's
dependencies are part of the runtime which is in /usr. Therefore,
installation path macros must be used when installing the package but
not to refer to dependencies.
---
netpbm.spec | 42 +++++++++++++++++++++---------------------
1 file changed, 21 insertions(+), 21 deletions(-)
diff --git a/netpbm.spec b/netpbm.spec
index 28600b4..6772931 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -124,15 +124,15 @@ make \
CFLAGS="$CFLAGS -fPIC -flax-vector-conversions -fno-strict-aliasing" \
CFLAGS_CONFIG="$CFLAGS" \
LADD="-lm" \
- JPEGINC_DIR=%{_includedir} \
- PNGINC_DIR=%{_includedir} \
- TIFFINC_DIR=%{_includedir} \
- JPEGLIB_DIR=%{_libdir} \
- JBIGLIB=%{_libdir}/libjbig.so.2.1 \
- PNGLIB_DIR=%{_libdir} \
- TIFFLIB_DIR=%{_libdir} \
+ JPEGINC_DIR=%{_usr}/include \
+ PNGINC_DIR=%{_usr}/include \
+ TIFFINC_DIR=%{_usr}/include \
+ JPEGLIB_DIR=%{_usr}/%{_lib} \
+ JBIGLIB=%{_usr}/%{_lib}/libjbig.so.2.1 \
+ PNGLIB_DIR=%{_usr}/%{_lib} \
+ TIFFLIB_DIR=%{_usr}/%{_lib} \
LINUXSVGALIB="NONE" \
- X11LIB=%{_libdir}/libX11.so \
+ X11LIB=%{_usr}/%{_lib}/libX11.so \
XML2LIBS="NONE"
# prepare man files
@@ -150,12 +150,12 @@ done
%install
-make package pkgdir=%{buildroot}/usr LINUXSVGALIB="NONE" XML2LIBS="NONE"
+make package pkgdir=%{buildroot}%{_prefix} LINUXSVGALIB="NONE" XML2LIBS="NONE"
# Ugly hack to have libs in correct dir on 64bit archs.
mkdir -p %{buildroot}%{_libdir}
-if [ "%{_libdir}" != "/usr/lib" ]; then
- mv %{buildroot}/usr/lib/lib* %{buildroot}%{_libdir}
+if [ "%{_lib}" != "lib" ]; then
+ mv %{buildroot}%{_prefix}/lib/lib* %{buildroot}%{_libdir}
fi
cp -af lib/libnetpbm.a %{buildroot}%{_libdir}/libnetpbm.a
@@ -177,16 +177,16 @@ done
rm -f %{buildroot}%{_mandir}/man5/extendedopacity.5
mkdir -p %{buildroot}%{_datadir}/netpbm
-mv %{buildroot}/usr/misc/*.map %{buildroot}%{_datadir}/netpbm/
-mv %{buildroot}/usr/misc/rgb.txt %{buildroot}%{_datadir}/netpbm/
-rm -rf %{buildroot}/usr/README
-rm -rf %{buildroot}/usr/VERSION
-rm -rf %{buildroot}/usr/link
-rm -rf %{buildroot}/usr/misc
-rm -rf %{buildroot}/usr/man
-rm -rf %{buildroot}/usr/pkginfo
-rm -rf %{buildroot}/usr/config_template
-rm -rf %{buildroot}/usr/pkgconfig_template
+mv %{buildroot}%{_prefix}/misc/*.map %{buildroot}%{_datadir}/netpbm/
+mv %{buildroot}%{_prefix}/misc/rgb.txt %{buildroot}%{_datadir}/netpbm/
+rm -rf %{buildroot}%{_prefix}/README
+rm -rf %{buildroot}%{_prefix}/VERSION
+rm -rf %{buildroot}%{_prefix}/link
+rm -rf %{buildroot}%{_prefix}/misc
+rm -rf %{buildroot}%{_prefix}/man
+rm -rf %{buildroot}%{_prefix}/pkginfo
+rm -rf %{buildroot}%{_prefix}/config_template
+rm -rf %{buildroot}%{_prefix}/pkgconfig_template
# Don't ship the static library
rm -f %{buildroot}%{_libdir}/lib*.a
From 4a35bcd0658dc308f90c6d119142255c015fea8f Mon Sep 17 00:00:00 2001
From: Orion Poplawski
Date: Mon, 27 Nov 2023 19:02:55 -0700
Subject: [PATCH 28/42] Rebuild for jasper 4.1
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index 6772931..698cf6a 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.02.00
-Release: 2%{?dist}
+Release: 3%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -230,6 +230,9 @@ popd
%doc userguide/*
%changelog
+* Tue Nov 28 2023 Orion Poplawski - 11.02.00-3
+- Rebuild for jasper 4.1
+
* Thu Jul 20 2023 Fedora Release Engineering - 11.02.00-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
From 8d07cd0c64cc8ec96c2ea604d039176cdf21ad27 Mon Sep 17 00:00:00 2001
From: Fedora Release Engineering
Date: Sun, 21 Jan 2024 09:35:07 +0000
Subject: [PATCH 29/42] Rebuilt for
https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index 698cf6a..4a2328c 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.02.00
-Release: 3%{?dist}
+Release: 4%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -230,6 +230,9 @@ popd
%doc userguide/*
%changelog
+* Sun Jan 21 2024 Fedora Release Engineering - 11.02.00-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
+
* Tue Nov 28 2023 Orion Poplawski - 11.02.00-3
- Rebuild for jasper 4.1
From 2b6ee3cbff09e2ca95310fd5b2c898e94c1f30d3 Mon Sep 17 00:00:00 2001
From: Florian Weimer
Date: Sun, 21 Jan 2024 21:35:45 +0100
Subject: [PATCH 30/42] GCC 14 compatibility fixes
Drop netpbm-cmuwtopbm.patch because of an out-of-bounds stack write.
This is correctly reported by GCC 14 as a type error.
It looks like the issue was fixed upstream by adding an (uint32_t)
cast to the magic number check a few lines below (not shown in
the patch added in commit 7d3e28cc83e676c7e21524889fa2 downsteam).
Also stub out converter/other/jpeg2000/libjasper_compat.c because
it is broken. Fixes another GCC 14 compatibility issue.
---
netpbm-c99-2.patch | 41 +++++++++++++++++++++++++++++++++++++++++
netpbm-cmuwtopbm.patch | 21 ---------------------
netpbm.spec | 9 +++++++--
3 files changed, 48 insertions(+), 23 deletions(-)
create mode 100644 netpbm-c99-2.patch
delete mode 100644 netpbm-cmuwtopbm.patch
diff --git a/netpbm-c99-2.patch b/netpbm-c99-2.patch
new file mode 100644
index 0000000..bcb8a99
--- /dev/null
+++ b/netpbm-c99-2.patch
@@ -0,0 +1,41 @@
+Remove the contents of libjasper_compat.c. The assignment
+
+ *errorP = errorP;
+
+is bogus because it creates a non-null value in *errorP even on
+success, and the caller expects a null pointer int his case.
+
+The source file is compiled, but not actually linked in, so this is
+only a problem because of the type error that fails the build.
+
+diff --git a/converter/other/jpeg2000/libjasper_compat.c b/converter/other/jpeg2000/libjasper_compat.c
+index 101820a321212dc6..e69de29bb2d1d643 100644
+--- a/converter/other/jpeg2000/libjasper_compat.c
++++ b/converter/other/jpeg2000/libjasper_compat.c
+@@ -1,26 +0,0 @@
+-#include "netpbm/nstring.h"
+-
+-#include "jasper/jasper.h"
+-#include "jasper/jas_image.h"
+-
+-#ifndef JAS_HAVE_PMJAS_IMAGE_DECODE
+-
+-void
+-pmjas_image_decode(jas_stream_t * const in,
+- int const fmtArg,
+- const char * const optstr,
+- jas_image_t ** const imagePP,
+- const char ** const errorP) {
+-
+- jas_image_t * const jasperP = jas_image_decode(in, fmtArg, optstr);
+-
+- if (jasperP) {
+- *imagePP = jasperP;
+- *errorP = errorP;
+- } else {
+- pm_asprintf(errorP, "Failed. Details may have been written to "
+- "Standard Error");
+- }
+-}
+-
+-#endif
diff --git a/netpbm-cmuwtopbm.patch b/netpbm-cmuwtopbm.patch
deleted file mode 100644
index f5b328b..0000000
--- a/netpbm-cmuwtopbm.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-diff -up netpbm-10.61.01/converter/pbm/cmuwmtopbm.c.cmuwtopbmfix netpbm-10.61.01/converter/pbm/cmuwmtopbm.c
---- netpbm-10.61.01/converter/pbm/cmuwmtopbm.c.cmuwtopbmfix 2013-01-02 18:39:57.000000000 +0100
-+++ netpbm-10.61.01/converter/pbm/cmuwmtopbm.c 2013-01-03 05:41:36.024984241 +0100
-@@ -18,7 +18,7 @@
- This program does not check the pad bits at the end of each row.
- */
-
--
-+#include
- #include "pbm.h"
-
- /*--------------------------
-@@ -42,7 +42,7 @@ readCmuwmHeader(FILE * const ifP
- "CMU window manager header EOF / read error";
- uint32_t const cmuwmMagic = 0xf10040bb;
-
-- long l;
-+ uint32_t l;
- short s;
- int rc;
-
diff --git a/netpbm.spec b/netpbm.spec
index 4a2328c..33547e2 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.02.00
-Release: 4%{?dist}
+Release: 5%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -24,12 +24,12 @@ Patch9: netpbm-xwdfix.patch
Patch10: netpbm-multilib.patch
Patch11: netpbm-glibc.patch
Patch12: netpbm-docfix.patch
-Patch13: netpbm-cmuwtopbm.patch
Patch14: netpbm-pamtojpeg2k.patch
Patch15: netpbm-manfix.patch
Patch16: netpbm-jasper.patch
Patch17: netpbm-libdir-so.patch
Patch18: netpbm-c99.patch
+Patch19: netpbm-c99-2.patch
BuildRequires: make
BuildRequires: libjpeg-devel, libpng-devel, libtiff-devel, flex, gcc, jbigkit-devel
@@ -230,6 +230,11 @@ popd
%doc userguide/*
%changelog
+* Sun Jan 21 2024 Florian Weimer - 11.02.00-5
+- GCC 14 compatibility fixes:
+ Drop netpbm-cmuwtopbm.patch to fix an out-of-bounds stack write (#2259450)
+ Stub out unused converter/other/jpeg2000/libjasper_compat.c (#2259448)
+
* Sun Jan 21 2024 Fedora Release Engineering - 11.02.00-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
From 39e95cb9e0ae1bf2679e1feb0cdce58841a306eb Mon Sep 17 00:00:00 2001
From: Fedora Release Engineering
Date: Thu, 25 Jan 2024 08:51:20 +0000
Subject: [PATCH 31/42] Rebuilt for
https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index 33547e2..97a22b4 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.02.00
-Release: 5%{?dist}
+Release: 6%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -230,6 +230,9 @@ popd
%doc userguide/*
%changelog
+* Thu Jan 25 2024 Fedora Release Engineering - 11.02.00-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
+
* Sun Jan 21 2024 Florian Weimer - 11.02.00-5
- GCC 14 compatibility fixes:
Drop netpbm-cmuwtopbm.patch to fix an out-of-bounds stack write (#2259450)
From 4342590717764f98f2d723e0285405db97a23b1c Mon Sep 17 00:00:00 2001
From: Fedora Release Engineering
Date: Thu, 18 Jul 2024 19:23:27 +0000
Subject: [PATCH 32/42] Rebuilt for
https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index 97a22b4..5e39be3 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.02.00
-Release: 6%{?dist}
+Release: 7%{?dist}
# See copyright_summary for details
License: BSD and GPLv2 and IJG and MIT and Public Domain
URL: http://netpbm.sourceforge.net/
@@ -230,6 +230,9 @@ popd
%doc userguide/*
%changelog
+* Thu Jul 18 2024 Fedora Release Engineering - 11.02.00-7
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
+
* Thu Jan 25 2024 Fedora Release Engineering - 11.02.00-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
From b605872ecb334575745a6861b93c619294a8fab8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miroslav=20Such=C3=BD?=
Date: Mon, 2 Sep 2024 12:07:16 +0200
Subject: [PATCH 33/42] convert license to SPDX
This is part of https://fedoraproject.org/wiki/Changes/SPDX_Licenses_Phase_4
---
netpbm.spec | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/netpbm.spec b/netpbm.spec
index 5e39be3..83e2549 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,9 +1,10 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.02.00
-Release: 7%{?dist}
+Release: 8%{?dist}
# See copyright_summary for details
-License: BSD and GPLv2 and IJG and MIT and Public Domain
+# Automatically converted from old format: BSD and GPLv2 and IJG and MIT and Public Domain - review is highly recommended.
+License: LicenseRef-Callaway-BSD AND GPL-2.0-only AND IJG AND LicenseRef-Callaway-MIT AND LicenseRef-Callaway-Public-Domain
URL: http://netpbm.sourceforge.net/
# Source0 is prepared by
# svn checkout https://svn.code.sf.net/p/netpbm/code/advanced netpbm-%%{version}
@@ -230,6 +231,9 @@ popd
%doc userguide/*
%changelog
+* Mon Sep 02 2024 Miroslav Suchý - 11.02.00-8
+- convert license to SPDX
+
* Thu Jul 18 2024 Fedora Release Engineering - 11.02.00-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
From 9dac6ff0f1cb62a7def34c88dc6299dea2da58b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zaoral?=
Date: Fri, 13 Dec 2024 12:31:49 +0100
Subject: [PATCH 34/42] build netpbm with correct LDFLAGS
Resolves: RHEL-70899
---
netpbm-shlib-ldflags.patch | 13 +++++++++++++
netpbm.spec | 10 +++++++---
2 files changed, 20 insertions(+), 3 deletions(-)
create mode 100644 netpbm-shlib-ldflags.patch
diff --git a/netpbm-shlib-ldflags.patch b/netpbm-shlib-ldflags.patch
new file mode 100644
index 0000000..ffad115
--- /dev/null
+++ b/netpbm-shlib-ldflags.patch
@@ -0,0 +1,13 @@
+diff --git a/config.mk.in b/config.mk.in
+index 50687ba..d35c982 100644
+--- a/config.mk.in
++++ b/config.mk.in
+@@ -250,7 +250,7 @@ EXE =
+
+ # Here, $(SONAME) resolves to the soname for the shared library being created.
+ # The following are gcc options. This works on GNU libc systems.
+-LDSHLIB = -shared -Wl,-soname,$(SONAME)
++LDSHLIB = $(LDFLAGS) -shared -Wl,-soname,$(SONAME)
+ # You need -nostart instead of -shared on BeOS. Though the BeOS compiler is
+ # ostensibly gcc, it has the -nostart option, which is not mentioned in gcc
+ # documentation and doesn't exist in at least one non-BeOS installation.
diff --git a/netpbm.spec b/netpbm.spec
index 83e2549..cde4d87 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.02.00
-Release: 8%{?dist}
+Release: 9%{?dist}
# See copyright_summary for details
# Automatically converted from old format: BSD and GPLv2 and IJG and MIT and Public Domain - review is highly recommended.
License: LicenseRef-Callaway-BSD AND GPL-2.0-only AND IJG AND LicenseRef-Callaway-MIT AND LicenseRef-Callaway-Public-Domain
@@ -30,7 +30,8 @@ Patch15: netpbm-manfix.patch
Patch16: netpbm-jasper.patch
Patch17: netpbm-libdir-so.patch
Patch18: netpbm-c99.patch
-Patch19: netpbm-c99-2.patch
+Patch19: netpbm-c99-2.patch
+Patch20: netpbm-shlib-ldflags.patch
BuildRequires: make
BuildRequires: libjpeg-devel, libpng-devel, libtiff-devel, flex, gcc, jbigkit-devel
@@ -121,7 +122,7 @@ TOP=`pwd`
make \
CC="%{__cc}" \
- LDFLAGS="$LD_FLAGS -L$TOP/pbm -L$TOP/pgm -L$TOP/pnm -L$TOP/ppm" \
+ LDFLAGS="$LDFLAGS -L$TOP/pbm -L$TOP/pgm -L$TOP/pnm -L$TOP/ppm" \
CFLAGS="$CFLAGS -fPIC -flax-vector-conversions -fno-strict-aliasing" \
CFLAGS_CONFIG="$CFLAGS" \
LADD="-lm" \
@@ -231,6 +232,9 @@ popd
%doc userguide/*
%changelog
+* Fri Dec 13 2024 Lukáš Zaoral - 11.02.00-9
+- build netpbm with correct LDFLAGS (RHEL-70899)
+
* Mon Sep 02 2024 Miroslav Suchý - 11.02.00-8
- convert license to SPDX
From d84b9c5e41af366d015bdd7afbeeed8cace1bfee Mon Sep 17 00:00:00 2001
From: Fedora Release Engineering
Date: Fri, 17 Jan 2025 19:58:34 +0000
Subject: [PATCH 35/42] Rebuilt for
https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index cde4d87..8213049 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.02.00
-Release: 9%{?dist}
+Release: 10%{?dist}
# See copyright_summary for details
# Automatically converted from old format: BSD and GPLv2 and IJG and MIT and Public Domain - review is highly recommended.
License: LicenseRef-Callaway-BSD AND GPL-2.0-only AND IJG AND LicenseRef-Callaway-MIT AND LicenseRef-Callaway-Public-Domain
@@ -232,6 +232,9 @@ popd
%doc userguide/*
%changelog
+* Fri Jan 17 2025 Fedora Release Engineering - 11.02.00-10
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
+
* Fri Dec 13 2024 Lukáš Zaoral - 11.02.00-9
- build netpbm with correct LDFLAGS (RHEL-70899)
From 2924ab513e1f36967352337a53fddb14acde96a1 Mon Sep 17 00:00:00 2001
From: Josef Ridky
Date: Tue, 4 Feb 2025 18:16:28 +0100
Subject: [PATCH 36/42] Rebase to new upstream release 11.09.00
Signed-off-by: Josef Ridky
---
.gitignore | 1 +
fix.patch | 1336 ++++++++++++++
netpbm-CAN-2005-2471.patch | 10 +-
netpbm-c99-2.patch | 41 -
netpbm-c99.patch | 81 +-
netpbm-glibc.patch | 9 +-
netpbm-manfix.patch | 311 +++-
netpbm-ppmfadeusage.patch | 99 +-
netpbm-security-code.patch | 3138 ++++++---------------------------
netpbm-security-scripts.patch | 119 --
netpbm.spec | 18 +-
sources | 2 +-
12 files changed, 2231 insertions(+), 2934 deletions(-)
create mode 100644 fix.patch
delete mode 100644 netpbm-c99-2.patch
delete mode 100644 netpbm-security-scripts.patch
diff --git a/.gitignore b/.gitignore
index 8c6b1cc..f9fd4bb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,4 @@
/netpbm-11.00.00.tar.xz
/netpbm-11.01.00.tar.xz
/netpbm-11.02.00.tar.xz
+/netpbm-11.09.00.tar.xz
diff --git a/fix.patch b/fix.patch
new file mode 100644
index 0000000..b3c3cb9
--- /dev/null
+++ b/fix.patch
@@ -0,0 +1,1336 @@
+diff --git a/analyzer/pgmtexture.c b/analyzer/pgmtexture.c
+index c69643e..2e09dde 100644
+--- a/analyzer/pgmtexture.c
++++ b/analyzer/pgmtexture.c
+@@ -54,6 +54,7 @@ vector(unsigned int const nl,
+
+ assert(nh >= nl);
+
++ overflow_add(nh - nl, 1);
+ MALLOCARRAY(v, (unsigned) (nh - nl + 1));
+
+ if (v == NULL)
+@@ -85,6 +86,7 @@ matrix (unsigned int const nrl,
+ assert(nrh >= nrl);
+
+ /* allocate pointers to rows */
++ overflow_add(nrh - nrl, 1);
+ MALLOCARRAY(m, (unsigned) (nrh - nrl + 1));
+ if (m == NULL)
+ pm_error("Unable to allocate memory for a matrix.");
+@@ -93,6 +95,7 @@ matrix (unsigned int const nrl,
+
+ assert (nch >= ncl);
+
++ overflow_add(nch - ncl, 1);
+ /* allocate rows and set pointers to them */
+ for (i = nrl; i <= nrh; ++i) {
+ MALLOCARRAY(m[i], (unsigned) (nch - ncl + 1));
+diff --git a/converter/other/gemtopnm.c b/converter/other/gemtopnm.c
+index 6bbfcc0..24199cb 100644
+--- a/converter/other/gemtopnm.c
++++ b/converter/other/gemtopnm.c
+@@ -106,6 +106,7 @@ main(argc, argv)
+
+ pnm_writepnminit( stdout, cols, rows, MAXVAL, type, 0 );
+
++ overflow_add(cols, padright);
+ {
+ /* allocate input row data structure */
+ int plane;
+diff --git a/converter/other/jpegtopnm.c b/converter/other/jpegtopnm.c
+index 98552c0..311298c 100644
+--- a/converter/other/jpegtopnm.c
++++ b/converter/other/jpegtopnm.c
+@@ -862,6 +862,8 @@ convertImage(FILE * const ofP,
+ /* Calculate output image dimensions so we can allocate space */
+ jpeg_calc_output_dimensions(cinfoP);
+
++ overflow2(cinfoP->output_width, cinfoP->output_components);
++
+ /* Start decompressor */
+ jpeg_start_decompress(cinfoP);
+
+diff --git a/converter/other/pbmtopgm.c b/converter/other/pbmtopgm.c
+index 817fb5b..8baaa57 100644
+--- a/converter/other/pbmtopgm.c
++++ b/converter/other/pbmtopgm.c
+@@ -60,6 +60,7 @@ main(int argc, char *argv[]) {
+
+
+ outrow = pgm_allocrow(cols) ;
++ overflow2(width, height);
+ maxval = MIN(PGM_OVERALLMAXVAL, width*height);
+ pgm_writepgminit(stdout, cols, rows, maxval, 0) ;
+
+diff --git a/converter/other/pnmtoddif.c b/converter/other/pnmtoddif.c
+index b7b942b..52be0e4 100644
+--- a/converter/other/pnmtoddif.c
++++ b/converter/other/pnmtoddif.c
+@@ -629,6 +629,7 @@ main(int argc, char *argv[]) {
+ switch (PNM_FORMAT_TYPE(format)) {
+ case PBM_TYPE:
+ ip.bits_per_pixel = 1;
++ overflow_add(cols, 7);
+ ip.bytes_per_line = (cols + 7) / 8;
+ ip.spectral = 2;
+ ip.components = 1;
+@@ -644,6 +645,7 @@ main(int argc, char *argv[]) {
+ ip.polarity = 2;
+ break;
+ case PPM_TYPE:
++ overflow2(cols, 3);
+ ip.bytes_per_line = 3 * cols;
+ ip.bits_per_pixel = 24;
+ ip.spectral = 5;
+diff --git a/converter/other/pnmtojpeg.c b/converter/other/pnmtojpeg.c
+index e345831..39038f8 100644
+--- a/converter/other/pnmtojpeg.c
++++ b/converter/other/pnmtojpeg.c
+@@ -605,8 +605,10 @@ read_scan_script(j_compress_ptr const cinfo,
+ data, but if you want to compress multiple images you'd
+ want JPOOL_PERMANENT.
+ */
++ overflow2(nscans, sizeof(jpeg_scan_info));
+ const unsigned int scan_info_size = nscans * sizeof(jpeg_scan_info);
+- jpeg_scan_info * const scan_info =
++ const jpeg_scan_info * scan_info;
++ scan_info =
+ (jpeg_scan_info *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ scan_info_size);
+@@ -938,6 +940,8 @@ compute_rescaling_array(JSAMPLE ** const rescale_p, const pixval maxval,
+ const long half_maxval = maxval / 2;
+ long val;
+
++ overflow_add(maxval, 1);
++ overflow2(maxval+1, sizeof(JSAMPLE));
+ *rescale_p = (JSAMPLE *)
+ (cinfo.mem->alloc_small) ((j_common_ptr) &cinfo, JPOOL_IMAGE,
+ (size_t) (((long) maxval + 1L) *
+@@ -1016,6 +1020,7 @@ convert_scanlines(struct jpeg_compress_struct * const cinfo_p,
+ */
+
+ /* Allocate the libpnm output and compressor input buffers */
++ overflow2(cinfo_p->image_width, cinfo_p->input_components);
+ buffer = (*cinfo_p->mem->alloc_sarray)
+ ((j_common_ptr) cinfo_p, JPOOL_IMAGE,
+ (unsigned int) cinfo_p->image_width * cinfo_p->input_components,
+diff --git a/converter/other/pnmtops.c b/converter/other/pnmtops.c
+index 45d856d..5b04eeb 100644
+--- a/converter/other/pnmtops.c
++++ b/converter/other/pnmtops.c
+@@ -294,17 +294,21 @@ parseCommandLine(int argc, const char ** argv,
+ validateCompDimension(width, 72, "-width value");
+ validateCompDimension(height, 72, "-height value");
+
++ overflow2(width, 72);
+ cmdlineP->width = width * 72;
++ overflow2(height, 72);
+ cmdlineP->height = height * 72;
+
+ if (imagewidthSpec) {
+ validateCompDimension(imagewidth, 72, "-imagewidth value");
++ overflow2(imagewidth, 72);
+ cmdlineP->imagewidth = imagewidth * 72;
+ }
+ else
+ cmdlineP->imagewidth = 0;
+ if (imageheightSpec) {
+- validateCompDimension(imagewidth, 72, "-imageheight value");
++ validateCompDimension(imageheight, 72, "-imageheight value");
++ overflow2(imageheight, 72);
+ cmdlineP->imageheight = imageheight * 72;
+ }
+ else
+diff --git a/converter/other/rletopnm.c b/converter/other/rletopnm.c
+index 97f271d..72b63d3 100644
+--- a/converter/other/rletopnm.c
++++ b/converter/other/rletopnm.c
+@@ -19,6 +19,8 @@
+ * If you modify this software, you should include a notice giving the
+ * name of the person performing the modification, the date of modification,
+ * and the reason for such modification.
++ *
++ * 2002-12-19: Fix maths wrapping bugs. Alan Cox
+ */
+ /*
+ * rletopnm - A conversion program to convert from Utah's "rle" image format
+diff --git a/converter/other/sirtopnm.c b/converter/other/sirtopnm.c
+index fafcc91..9fe49d0 100644
+--- a/converter/other/sirtopnm.c
++++ b/converter/other/sirtopnm.c
+@@ -69,6 +69,7 @@ char* argv[];
+ }
+ break;
+ case PPM_TYPE:
++ overflow3(cols, rows, 3);
+ picsize = cols * rows * 3;
+ planesize = cols * rows;
+ if ( !( sirarray = (unsigned char*) malloc( picsize ) ) )
+diff --git a/converter/other/tifftopnm.c b/converter/other/tifftopnm.c
+index 05493e7..7ea59fd 100644
+--- a/converter/other/tifftopnm.c
++++ b/converter/other/tifftopnm.c
+@@ -1372,6 +1372,7 @@ convertRasterByRows(pnmOut * const pnmOutP,
+ if (scanbuf == NULL)
+ pm_error("can't allocate memory for scanline buffer");
+
++ overflow2(cols,spp);
+ MALLOCARRAY(samplebuf, cols * spp);
+ if (samplebuf == NULL)
+ pm_error("can't allocate memory for row buffer");
+diff --git a/converter/other/xwdtopnm.c b/converter/other/xwdtopnm.c
+index a74da34..4d26a31 100644
+--- a/converter/other/xwdtopnm.c
++++ b/converter/other/xwdtopnm.c
+@@ -210,6 +210,10 @@ processX10Header(X10WDFileHeader * const h10P,
+ *colorsP = pnm_allocrow(2);
+ PNM_ASSIGN1((*colorsP)[0], 0);
+ PNM_ASSIGN1((*colorsP)[1], *maxvalP);
++ overflow_add(h10P->pixmap_width, 15);
++ if(h10P->pixmap_width < 0)
++ pm_error("assert: negative width");
++ overflow2((((h10P->pixmap_width + 15) / 16) * 16 - h10P->pixmap_width), 8);
+ *padrightP =
+ (((h10P->pixmap_width + 15) / 16) * 16 - h10P->pixmap_width) * 8;
+ *bits_per_itemP = 16;
+@@ -635,6 +639,7 @@ processX11Header(X11WDFileHeader * const h11P,
+
+ *colsP = h11FixedP->pixmap_width;
+ *rowsP = h11FixedP->pixmap_height;
++ overflow2(h11FixedP->bytes_per_line, 8);
+ *padrightP =
+ h11FixedP->bytes_per_line * 8 -
+ h11FixedP->pixmap_width * h11FixedP->bits_per_pixel;
+diff --git a/converter/pbm/mdatopbm.c b/converter/pbm/mdatopbm.c
+index 461b3f8..c8bab6c 100644
+--- a/converter/pbm/mdatopbm.c
++++ b/converter/pbm/mdatopbm.c
+@@ -245,10 +245,13 @@ main(int argc, char **argv) {
+ pm_readlittleshort(infile, &yy); nInCols = yy;
+ }
+
++ overflow2(nOutCols, 8);
+ nOutCols = 8 * nInCols;
+ nOutRows = nInRows;
+- if (bScale)
++ if (bScale) {
++ overflow2(nOutRows, 2);
+ nOutRows *= 2;
++ }
+
+ data = pbm_allocarray(nOutCols, nOutRows);
+
+diff --git a/converter/pbm/mgrtopbm.c b/converter/pbm/mgrtopbm.c
+index 9f7004a..f2c1590 100644
+--- a/converter/pbm/mgrtopbm.c
++++ b/converter/pbm/mgrtopbm.c
+@@ -67,6 +67,7 @@ readMgrHeader(FILE * const ifP,
+
+ *colsP = (((int)head.h_wide - ' ') << 6) + ((int)head.l_wide - ' ');
+ *rowsP = (((int)head.h_high - ' ') << 6) + ((int) head.l_high - ' ');
++ overflow_add(*colsP, pad);
+ *padrightP = ( ( *colsP + pad - 1 ) / pad ) * pad - *colsP;
+ }
+
+diff --git a/converter/pbm/pbmto4425.c b/converter/pbm/pbmto4425.c
+index 1d97ac6..c4c8cbb 100644
+--- a/converter/pbm/pbmto4425.c
++++ b/converter/pbm/pbmto4425.c
+@@ -2,6 +2,7 @@
+
+ #include "nstring.h"
+ #include "pbm.h"
++#include
+
+ static char bit_table[2][3] = {
+ {1, 4, 0x10},
+@@ -160,7 +161,7 @@ main(int argc, char * argv[]) {
+ xres = vmap_width * 2;
+ yres = vmap_height * 3;
+
+- vmap = malloc(vmap_width * vmap_height * sizeof(char));
++ vmap = malloc3(vmap_width, vmap_height, sizeof(char));
+ if(vmap == NULL)
+ {
+ pm_error( "Cannot allocate memory" );
+diff --git a/converter/pbm/pbmtogem.c b/converter/pbm/pbmtogem.c
+index 4fd30e9..c82757d 100644
+--- a/converter/pbm/pbmtogem.c
++++ b/converter/pbm/pbmtogem.c
+@@ -79,6 +79,7 @@ putinit (int const rows, int const cols)
+ bitsperitem = 0;
+ bitshift = 7;
+ outcol = 0;
++ overflow_add(cols, 7);
+ outmax = (cols + 7) / 8;
+ outrow = (unsigned char *) pm_allocrow (outmax, sizeof (unsigned char));
+ lastrow = (unsigned char *) pm_allocrow (outmax, sizeof (unsigned char));
+diff --git a/converter/pbm/pbmtogo.c b/converter/pbm/pbmtogo.c
+index 4f84f39..943dc84 100644
+--- a/converter/pbm/pbmtogo.c
++++ b/converter/pbm/pbmtogo.c
+@@ -158,6 +158,7 @@ main(int argc,
+ bitrow = pbm_allocrow(cols);
+
+ /* Round cols up to the nearest multiple of 8. */
++ overflow_add(cols, 7);
+ rucols = ( cols + 7 ) / 8;
+ bytesperrow = rucols; /* GraphOn uses bytes */
+ rucols = rucols * 8;
+diff --git a/converter/pbm/pbmtolj.c b/converter/pbm/pbmtolj.c
+index 3cd7670..0b51932 100644
+--- a/converter/pbm/pbmtolj.c
++++ b/converter/pbm/pbmtolj.c
+@@ -120,7 +120,11 @@ parseCommandLine(int argc, char ** argv,
+ static void
+ allocateBuffers(unsigned int const cols) {
+
++ overflow_add(cols, 8);
+ rowBufferSize = (cols + 7) / 8;
++ overflow_add(rowBufferSize, 128);
++ overflow_add(rowBufferSize, rowBufferSize+128);
++ overflow_add(rowBufferSize+10, rowBufferSize/8);
+ packBufferSize = rowBufferSize + (rowBufferSize + 127) / 128 + 1;
+ deltaBufferSize = rowBufferSize + rowBufferSize / 8 + 10;
+
+diff --git a/converter/pbm/pbmtomda.c b/converter/pbm/pbmtomda.c
+index 3ad5149..9efe5cf 100644
+--- a/converter/pbm/pbmtomda.c
++++ b/converter/pbm/pbmtomda.c
+@@ -179,6 +179,7 @@ int main(int argc, char **argv)
+
+ nOutRowsUnrounded = bScale ? nInRows/2 : nInRows;
+
++ overflow_add(nOutRowsUnrounded, 3);
+ nOutRows = ((nOutRowsUnrounded + 3) / 4) * 4;
+ /* MDA wants rows a multiple of 4 */
+ nOutCols = nInCols / 8;
+diff --git a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
+index ae36e0d..b8c89c9 100644
+--- a/converter/pbm/pbmtoppa/pbm.c
++++ b/converter/pbm/pbmtoppa/pbm.c
+@@ -154,6 +154,7 @@ pbm_readline(pbm_stat * const pbmStatP,
+ break;
+ case P4: {
+ int tmp, tmp2;
++ overflow_add(pbmStatP->width, 7);
+ tmp = (pbmStatP->width+7)/8;
+ tmp2 = fread(data,1,tmp,pbmStatP->fptr);
+ if (tmp2 == tmp) {
+@@ -186,6 +187,7 @@ pbm_unreadline(pbm_stat * const pbmStatP,
+
+ if (!pbmStatP->unread) {
+ pbmStatP->unread = 1;
++ overflow_add(pbmStatP->width, 7);
+ pbmStatP->revdata = malloc ((pbmStatP->width+7)/8);
+ memcpy(pbmStatP->revdata, data, (pbmStatP->width+7)/8);
+ --pbmStatP->current_line;
+diff --git a/converter/pbm/pbmtoppa/pbmtoppa.c b/converter/pbm/pbmtoppa/pbmtoppa.c
+index ff4a599..aa510ec 100644
+--- a/converter/pbm/pbmtoppa/pbmtoppa.c
++++ b/converter/pbm/pbmtoppa/pbmtoppa.c
+@@ -453,6 +453,7 @@ main(int argc, char *argv[]) {
+ pm_error("main(): unrecognized parameter '%s'", argv[argn]);
+ }
+
++ overflow_add(Width, 7);
+ Pwidth=(Width+7)/8;
+ printer.fptr=out;
+
+diff --git a/converter/pbm/pbmtoxbm.c b/converter/pbm/pbmtoxbm.c
+index ecb72b3..600461f 100644
+--- a/converter/pbm/pbmtoxbm.c
++++ b/converter/pbm/pbmtoxbm.c
+@@ -352,6 +352,7 @@ convertRaster(FILE * const ifP,
+
+ unsigned char * bitrow;
+ unsigned int row;
++ overflow_add(cols, padright);
+
+ putinit(xbmVersion);
+
+diff --git a/converter/pbm/pktopbm.c b/converter/pbm/pktopbm.c
+index 712f339..b6fcb02 100644
+--- a/converter/pbm/pktopbm.c
++++ b/converter/pbm/pktopbm.c
+@@ -280,6 +280,7 @@ main(int argc, char *argv[]) {
+ if (flagbyte == 7) { /* long form preamble */
+ integer packetlength = get32() ; /* character packet length */
+ car = get32() ; /* character number */
++ overflow_add(packetlength, pktopbm_pkloc);
+ endofpacket = packetlength + pktopbm_pkloc;
+ /* calculate end of packet */
+ if ((car >= MAXPKCHAR) || !filename[car]) {
+diff --git a/converter/pbm/thinkjettopbm.l b/converter/pbm/thinkjettopbm.l
+index 5de4f2b..cc1810c 100644
+--- a/converter/pbm/thinkjettopbm.l
++++ b/converter/pbm/thinkjettopbm.l
+@@ -114,7 +114,9 @@ DIG [0-9]
+ \033\*b{DIG}+W {
+ int l;
+ if (rowCount >= rowCapacity) {
++ overflow_add(rowCapacity, 100);
+ rowCapacity += 100;
++ overflow2(rowCapacity, sizeof *rows);
+ rows = realloc (rows, rowCapacity * sizeof *rows);
+ if (rows == NULL)
+ pm_error ("Out of memory.");
+@@ -226,6 +228,7 @@ yywrap (void)
+ /*
+ * Quite simple since ThinkJet bit arrangement matches PBM
+ */
++ overflow2(maxRowLength, 8);
+ pbm_writepbminit(stdout, maxRowLength*8, rowCount, 0);
+
+ packed_bitrow = malloc(maxRowLength);
+diff --git a/converter/pbm/ybmtopbm.c b/converter/pbm/ybmtopbm.c
+index 2a42908..cf1ff03 100644
+--- a/converter/pbm/ybmtopbm.c
++++ b/converter/pbm/ybmtopbm.c
+@@ -43,6 +43,7 @@ getinit(FILE * const ifP,
+ pm_error("EOF / read error");
+
+ *depthP = 1;
++ overflow_add(*colsP, 15);
+ }
+
+
+diff --git a/converter/pgm/lispmtopgm.c b/converter/pgm/lispmtopgm.c
+index 40dd3fb..8dd9cae 100644
+--- a/converter/pgm/lispmtopgm.c
++++ b/converter/pgm/lispmtopgm.c
+@@ -58,6 +58,7 @@ main( argc, argv )
+ pm_error( "depth (%d bits) is too large", depth);
+
+ pgm_writepgminit( stdout, cols, rows, (gray) maxval, 0 );
++ overflow_add(cols, 7);
+ grayrow = pgm_allocrow( ( cols + 7 ) / 8 * 8 );
+
+ for ( row = 0; row < rows; ++row )
+@@ -103,6 +104,7 @@ getinit( file, colsP, rowsP, depthP, padrightP )
+ if ( *depthP == 0 )
+ *depthP = 1; /* very old file */
+
++ overflow_add((int)colsP, 31);
+ *padrightP = ( ( *colsP + 31 ) / 32 ) * 32 - *colsP;
+
+ if ( *colsP != (cols_32 - *padrightP) ) {
+diff --git a/converter/pgm/psidtopgm.c b/converter/pgm/psidtopgm.c
+index 07417d1..25bb311 100644
+--- a/converter/pgm/psidtopgm.c
++++ b/converter/pgm/psidtopgm.c
+@@ -78,6 +78,7 @@ main(int argc,
+ pm_error("bits/sample (%d) is too large.", bitspersample);
+
+ pgm_writepgminit(stdout, cols, rows, maxval, 0);
++ overflow_add(cols, 7);
+ grayrow = pgm_allocrow((cols + 7) / 8 * 8);
+ for (row = 0; row < rows; ++row) {
+ unsigned int col;
+diff --git a/converter/ppm/Makefile b/converter/ppm/Makefile
+index 003ef8d..b97349d 100644
+--- a/converter/ppm/Makefile
++++ b/converter/ppm/Makefile
+@@ -11,7 +11,7 @@ SUBDIRS = hpcdtoppm ppmtompeg
+
+ PORTBINARIES = 411toppm eyuvtoppm gouldtoppm ilbmtoppm imgtoppm \
+ leaftoppm mtvtoppm neotoppm \
+- pcxtoppm pc1toppm pi1toppm picttoppm pjtoppm \
++ pcxtoppm pc1toppm pi1toppm pjtoppm \
+ ppmtoacad ppmtoapplevol ppmtoarbtxt ppmtoascii \
+ ppmtobmp ppmtoeyuv ppmtogif ppmtoicr ppmtoilbm \
+ ppmtoleaf ppmtolj ppmtomitsu ppmtoneo \
+diff --git a/converter/ppm/ilbmtoppm.c b/converter/ppm/ilbmtoppm.c
+index b9b8986..f4fe331 100644
+--- a/converter/ppm/ilbmtoppm.c
++++ b/converter/ppm/ilbmtoppm.c
+@@ -608,6 +608,7 @@ decode_row(FILE * const ifP,
+ rawtype *chp;
+
+ cols = bmhdP->w;
++ overflow_add(cols, 15);
+ bytes = RowBytes(cols);
+ for( plane = 0; plane < nPlanes; plane++ ) {
+ int mask;
+@@ -695,6 +696,23 @@ decode_mask(FILE * const ifP,
+ Multipalette handling
+ ****************************************************************************/
+
++static void *
++xmalloc2(x, y)
++ int x;
++ int y;
++{
++ void *mem;
++
++ overflow2(x,y);
++ if( x * y == 0 )
++ return NULL;
++
++ mem = malloc2(x,y);
++ if( mem == NULL )
++ pm_error("out of memory allocating %d bytes", x * y);
++ return mem;
++}
++
+
+ static void
+ multi_adjust(ColorMap * const cmapP,
+@@ -1363,6 +1381,9 @@ dcol_to_ppm(FILE * const ifP,
+ if( redmaxval != maxval || greenmaxval != maxval || bluemaxval != maxval )
+ pm_message("scaling colors to %d bits", pm_maxvaltobits(maxval));
+
++ overflow_add(redmaxval, 1);
++ overflow_add(greenmaxval, 1);
++ overflow_add(bluemaxval, 1);
+ MALLOCARRAY_NOFAIL(redtable, redmaxval +1);
+ MALLOCARRAY_NOFAIL(greentable, greenmaxval +1);
+ MALLOCARRAY_NOFAIL(bluetable, bluemaxval +1);
+@@ -1802,7 +1823,9 @@ PCHG_ConvertSmall(PCHGHeader * const pchgP,
+ ChangeCount32 = *data++;
+ remDataSize -= 2;
+
++ overflow_add(ChangeCount16, ChangeCount32);
+ changes = ChangeCount16 + ChangeCount32;
++ overflow_add(changes, 1);
+ for (i = 0; i < changes; ++i) {
+ if (totalchanges >= pchgP->TotalChanges) goto fail;
+ if (remDataSize < 2) goto fail;
+@@ -2067,6 +2090,9 @@ read_pchg(FILE * const ifP,
+ cmap->mp_change[i] = NULL;
+ if( PCHG.StartLine < 0 ) {
+ int nch;
++ if(PCHG.MaxReg < PCHG.MinReg)
++ pm_error("assert: MinReg > MaxReg");
++ overflow_add(PCHG.MaxReg-PCHG.MinReg, 2);
+ nch = PCHG.MaxReg - PCHG.MinReg +1;
+ MALLOCARRAY_NOFAIL(cmap->mp_init, nch + 1);
+ for( i = 0; i < nch; i++ )
+@@ -2143,6 +2169,7 @@ process_body( FILE * const ifP,
+ if (typeid == ID_ILBM) {
+ int isdeep;
+
++ overflow_add(bmhdP->w, 15);
+ MALLOCARRAY_NOFAIL(ilbmrow, RowBytes(bmhdP->w));
+ *viewportmodesP |= fakeviewport; /* -isham/-isehb */
+
+diff --git a/converter/ppm/imgtoppm.c b/converter/ppm/imgtoppm.c
+index 7078b88..eb8509e 100644
+--- a/converter/ppm/imgtoppm.c
++++ b/converter/ppm/imgtoppm.c
+@@ -84,6 +84,7 @@ main(int argc, char ** argv) {
+ len = atoi((char*) buf );
+ if ( fread( buf, len, 1, ifp ) != 1 )
+ pm_error( "bad colormap buf" );
++ overflow2(cmaplen, 3);
+ if ( cmaplen * 3 != len )
+ {
+ pm_message(
+@@ -105,6 +106,7 @@ main(int argc, char ** argv) {
+ pm_error( "bad pixel data header" );
+ buf[8] = '\0';
+ len = atoi((char*) buf );
++ overflow2(cols, rows);
+ if ( len != cols * rows )
+ pm_message(
+ "pixel data length (%d) does not match image size (%d)",
+diff --git a/converter/ppm/pcxtoppm.c b/converter/ppm/pcxtoppm.c
+index e252ba2..270ae3b 100644
+--- a/converter/ppm/pcxtoppm.c
++++ b/converter/ppm/pcxtoppm.c
+@@ -409,6 +409,7 @@ pcx_planes_to_pixels(pixels, bitplanes, bytesperline, planes, bitsperpixel)
+ /*
+ * clear the pixel buffer
+ */
++ overflow2(bytesperline, 8);
+ npixels = (bytesperline * 8) / bitsperpixel;
+ p = pixels;
+ while (--npixels >= 0)
+@@ -470,6 +471,7 @@ pcx_16col_to_ppm(FILE * const ifP,
+ }
+
+ /* BytesPerLine should be >= BitsPerPixel * cols / 8 */
++ overflow2(BytesPerLine, 8);
+ rawcols = BytesPerLine * 8 / BitsPerPixel;
+ if (headerCols > rawcols) {
+ pm_message("warning - BytesPerLine = %d, "
+diff --git a/converter/ppm/picttoppm.c b/converter/ppm/picttoppm.c
+index 9cf570e..6020f67 100644
+--- a/converter/ppm/picttoppm.c
++++ b/converter/ppm/picttoppm.c
+@@ -1,3 +1,4 @@
++#error "Unfixable. Don't ship me"
+ /*
+ * picttoppm.c -- convert a MacIntosh PICT file to PPM format.
+ *
+diff --git a/converter/ppm/pjtoppm.c b/converter/ppm/pjtoppm.c
+index ffb01d0..eb11e8d 100644
+--- a/converter/ppm/pjtoppm.c
++++ b/converter/ppm/pjtoppm.c
+@@ -149,12 +149,17 @@ main(int argc, const char ** argv) {
+ case 'V': /* send plane */
+ case 'W': /* send last plane */
+ if (rows == -1 || row >= rows || image == NULL) {
+- if (rows == -1 || row >= rows)
++ if (rows == -1 || row >= rows) {
++ overflow_add(rows, 100);
+ rows += 100;
++ }
++
+ if (image == NULL) {
++ overflow2(rows,planes);
+ MALLOCARRAY(image, uintProduct(rows, planes));
+ MALLOCARRAY(imlen, uintProduct(rows, planes));
+ } else {
++ overflow2(rows,planes);
+ REALLOCARRAY(image, uintProduct(rows, planes));
+ REALLOCARRAY(imlen, uintProduct(rows, planes));
+ }
+@@ -235,8 +240,10 @@ main(int argc, const char ** argv) {
+ col += 2)
+ for (cmd = image[plane + row * planes][col],
+ val = image[plane + row * planes][col+1];
+- cmd >= 0 && i < newcols; cmd--, i++)
++ cmd >= 0 && i < newcols; cmd--, i++) {
+ buf[i] = val;
++ overflow_add(i, 1);
++ }
+ cols = MAX(cols, i);
+ free(image[plane + row * planes]);
+ /*
+@@ -247,6 +254,7 @@ main(int argc, const char ** argv) {
+ image[plane + row * planes] = realloc(buf, i);
+ }
+ }
++ overflow2(cols, 8);
+ cols *= 8;
+ }
+
+diff --git a/converter/ppm/ppmtoeyuv.c b/converter/ppm/ppmtoeyuv.c
+index f5ce115..6f072be 100644
+--- a/converter/ppm/ppmtoeyuv.c
++++ b/converter/ppm/ppmtoeyuv.c
+@@ -114,6 +114,7 @@ create_multiplication_tables(const pixval maxval) {
+
+ int index;
+
++ overflow_add(maxval, 1);
+ MALLOCARRAY_NOFAIL(mult299 , maxval+1);
+ MALLOCARRAY_NOFAIL(mult587 , maxval+1);
+ MALLOCARRAY_NOFAIL(mult114 , maxval+1);
+diff --git a/converter/ppm/ppmtolj.c b/converter/ppm/ppmtolj.c
+index 7ed814e..b4e7db1 100644
+--- a/converter/ppm/ppmtolj.c
++++ b/converter/ppm/ppmtolj.c
+@@ -182,6 +182,7 @@ int main(int argc, char *argv[]) {
+ ppm_readppminit( ifp, &cols, &rows, &maxval, &format );
+ pixelrow = ppm_allocrow( cols );
+
++ overflow2(cols, 6);
+ obuf = (unsigned char *) pm_allocrow(cols * 3, sizeof(unsigned char));
+ cbuf = (unsigned char *) pm_allocrow(cols * 6, sizeof(unsigned char));
+ if (mode == C_TRANS_MODE_DELTA)
+diff --git a/converter/ppm/ppmtomitsu.c b/converter/ppm/ppmtomitsu.c
+index 50b790d..63d3182 100644
+--- a/converter/ppm/ppmtomitsu.c
++++ b/converter/ppm/ppmtomitsu.c
+@@ -685,6 +685,8 @@ main(int argc, char * argv[]) {
+ medias = MSize_User;
+
+ if (dpi300) {
++ overflow2(medias.maxcols, 2);
++ overflow2(medias.maxrows, 2);
+ medias.maxcols *= 2;
+ medias.maxrows *= 2;
+ }
+diff --git a/converter/ppm/ppmtopcx.c b/converter/ppm/ppmtopcx.c
+index 76f0629..e7b06ff 100644
+--- a/converter/ppm/ppmtopcx.c
++++ b/converter/ppm/ppmtopcx.c
+@@ -422,6 +422,8 @@ ppmTo16ColorPcx(pixel ** const pixels,
+ else Planes = 1;
+ }
+ }
++ overflow2(BitsPerPixel, cols);
++ overflow_add(BitsPerPixel * cols, 7);
+ BytesPerLine = ((cols * BitsPerPixel) + 7) / 8;
+ MALLOCARRAY_NOFAIL(indexRow, cols);
+ MALLOCARRAY_NOFAIL(planesrow, BytesPerLine);
+diff --git a/converter/ppm/ppmtopict.c b/converter/ppm/ppmtopict.c
+index 36464b6..c91ccf2 100644
+--- a/converter/ppm/ppmtopict.c
++++ b/converter/ppm/ppmtopict.c
+@@ -450,6 +450,8 @@ main(int argc, const char ** argv) {
+ putShort(stdout, 0); /* mode */
+
+ /* Finally, write out the data. */
++ overflow_add(cols/MAX_COUNT, 1);
++ overflow_add(cols, cols/MAX_COUNT+1);
+ outBuf = malloc((unsigned)(cols+cols/MAX_COUNT+1));
+ for (row = 0, oc = 0; row < rows; ++row) {
+ unsigned int rowSize;
+diff --git a/converter/ppm/ppmtopj.c b/converter/ppm/ppmtopj.c
+index d116773..49d08fc 100644
+--- a/converter/ppm/ppmtopj.c
++++ b/converter/ppm/ppmtopj.c
+@@ -179,6 +179,7 @@ char *argv[];
+ pixels = ppm_readppm( ifp, &cols, &rows, &maxval );
+
+ pm_close( ifp );
++ overflow2(cols,2);
+ obuf = (unsigned char *) pm_allocrow(cols, sizeof(unsigned char));
+ cbuf = (unsigned char *) pm_allocrow(cols * 2, sizeof(unsigned char));
+
+diff --git a/converter/ppm/ppmtopjxl.c b/converter/ppm/ppmtopjxl.c
+index 90bcef0..72d0027 100644
+--- a/converter/ppm/ppmtopjxl.c
++++ b/converter/ppm/ppmtopjxl.c
+@@ -267,6 +267,9 @@ main(int argc, const char * argv[]) {
+ if (maxval > PCL_MAXVAL)
+ pm_error("color range too large; reduce with ppmcscale");
+
++ if (cols < 0 || rows < 0)
++ pm_error("negative size is not possible");
++
+ /* Figure out the colormap. */
+ pm_message("Computing colormap...");
+ chv = ppm_computecolorhist(pixels, cols, rows, MAXCOLORS, &colors);
+@@ -286,6 +289,8 @@ main(int argc, const char * argv[]) {
+ case 0: /* direct mode (no palette) */
+ bpp = bitsperpixel(maxval); /* bits per pixel */
+ bpg = bpp; bpb = bpp;
++ overflow2(bpp, 3);
++ overflow_add(bpp*3, 7);
+ bpp = (bpp*3+7)>>3; /* bytes per pixel now */
+ bpr = (bpp<<3)-bpg-bpb;
+ bpp *= cols; /* bytes per row now */
+@@ -295,9 +300,13 @@ main(int argc, const char * argv[]) {
+ case 3: case 7: pclindex++;
+ default:
+ bpp = 8/pclindex;
++ overflow_add(cols, bpp);
++ if(bpp == 0)
++ pm_error("assert: no bpp");
+ bpp = (cols+bpp-1)/bpp; /* bytes per row */
+ }
+ }
++ overflow2(bpp,2);
+ inrow = (char *)malloc((unsigned)bpp);
+ outrow = (char *)malloc((unsigned)bpp*2);
+ runcnt = (signed char *)malloc((unsigned)bpp);
+diff --git a/converter/ppm/ppmtowinicon.c b/converter/ppm/ppmtowinicon.c
+index c673798..f026c08 100644
+--- a/converter/ppm/ppmtowinicon.c
++++ b/converter/ppm/ppmtowinicon.c
+@@ -12,6 +12,7 @@
+
+ #include
+ #include
++#include
+
+ #include "pm_c_util.h"
+ #include "winico.h"
+@@ -214,6 +215,7 @@ createAndBitmap (gray ** const ba, int const cols, int const rows,
+ MALLOCARRAY_NOFAIL(rowData, rows);
+ icBitmap->xBytes = xBytes;
+ icBitmap->data = rowData;
++ overflow2(xBytes, rows);
+ icBitmap->size = xBytes * rows;
+ for (y=0;yxBytes = xBytes;
+ icBitmap->data = rowData;
++ overflow2(xBytes, rows);
+ icBitmap->size = xBytes * rows;
+
+ for (y=0;yxBytes = xBytes;
+ icBitmap->data = rowData;
++ overflow2(xBytes, rows);
+ icBitmap->size = xBytes * rows;
+
+ for (y=0;ybitcount = bpp;
+ entry->ih = createInfoHeader(entry, xorBitmap, andBitmap);
+ entry->colors = palette->colors;
++ overflow2(4, entry->color_count);
++ overflow_add(xorBitmap->size, andBitmap->size);
++ overflow_add(xorBitmap->size + andBitmap->size, 40);
++ overflow_add(xorBitmap->size + andBitmap->size + 40, 4 * entry->color_count);
+ entry->size_in_bytes =
+ xorBitmap->size + andBitmap->size + 40 + (4 * entry->color_count);
+ if (verbose)
+diff --git a/converter/ppm/ppmtoxpm.c b/converter/ppm/ppmtoxpm.c
+index 0e31692..1b3923f 100644
+--- a/converter/ppm/ppmtoxpm.c
++++ b/converter/ppm/ppmtoxpm.c
+@@ -198,6 +198,7 @@ genNumstr(unsigned int const input, int const digits) {
+ unsigned int i;
+
+ /* Allocate memory for printed number. Abort if error. */
++ overflow_add(digits, 1);
+ if (!(str = (char *) malloc(digits + 1)))
+ pm_error("out of memory");
+
+@@ -315,6 +316,7 @@ genCmap(colorhist_vector const chv,
+ unsigned int charsPerPixel;
+ unsigned int xpmMaxval;
+
++ if (includeTransparent) overflow_add(ncolors, 1);
+ MALLOCARRAY(cmap, cmapSize);
+ if (cmapP == NULL)
+ pm_error("Out of memory allocating %u bytes for a color map.",
+diff --git a/converter/ppm/qrttoppm.c b/converter/ppm/qrttoppm.c
+index 935463e..653084c 100644
+--- a/converter/ppm/qrttoppm.c
++++ b/converter/ppm/qrttoppm.c
+@@ -46,7 +46,7 @@ main( argc, argv )
+
+ ppm_writeppminit( stdout, cols, rows, maxval, 0 );
+ pixelrow = ppm_allocrow( cols );
+- buf = (unsigned char *) malloc( 3 * cols );
++ buf = (unsigned char *) malloc2( 3 , cols );
+ if ( buf == (unsigned char *) 0 )
+ pm_error( "out of memory" );
+
+diff --git a/converter/ppm/sldtoppm.c b/converter/ppm/sldtoppm.c
+index 2fef023..ce73025 100644
+--- a/converter/ppm/sldtoppm.c
++++ b/converter/ppm/sldtoppm.c
+@@ -506,6 +506,8 @@ slider(slvecfn slvec,
+
+ /* Allocate image buffer and clear it to black. */
+
++ overflow_add(ixdots, 1);
++ overflow_add(iydots, 1);
+ pixels = ppm_allocarray(pixcols = ixdots + 1, pixrows = iydots + 1);
+ PPM_ASSIGN(rgbcolor, 0, 0, 0);
+ ppmd_filledrectangle(pixels, pixcols, pixrows, pixmaxval, 0, 0,
+diff --git a/converter/ppm/ximtoppm.c b/converter/ppm/ximtoppm.c
+index 9620942..e9083f3 100644
+--- a/converter/ppm/ximtoppm.c
++++ b/converter/ppm/ximtoppm.c
+@@ -118,6 +118,7 @@ ReadXimHeader(FILE * const in_fp,
+ header->bits_channel = atoi(a_head.bits_per_channel);
+ header->alpha_flag = atoi(a_head.alpha_channel);
+ if (strlen(a_head.author)) {
++ overflow_add(strlen(a_head.author),1);
+ if (!(header->author = calloc((unsigned int)strlen(a_head.author)+1,
+ 1))) {
+ pm_message("ReadXimHeader: can't calloc author string" );
+@@ -127,6 +128,7 @@ ReadXimHeader(FILE * const in_fp,
+ strncpy(header->author, a_head.author, strlen(a_head.author));
+ }
+ if (strlen(a_head.date)) {
++ overflow_add(strlen(a_head.date),1);
+ if (!(header->date =calloc((unsigned int)strlen(a_head.date)+1,1))){
+ pm_message("ReadXimHeader: can't calloc date string" );
+ return(0);
+@@ -135,6 +137,7 @@ ReadXimHeader(FILE * const in_fp,
+ strncpy(header->date, a_head.date, strlen(a_head.date));
+ }
+ if (strlen(a_head.program)) {
++ overflow_add(strlen(a_head.program),1);
+ if (!(header->program = calloc(
+ (unsigned int)strlen(a_head.program) + 1, 1))) {
+ pm_message("ReadXimHeader: can't calloc program string" );
+@@ -161,6 +164,7 @@ ReadXimHeader(FILE * const in_fp,
+ if (header->nchannels == 3 && header->bits_channel == 8)
+ header->ncolors = 0;
+ else if (header->nchannels == 1 && header->bits_channel == 8) {
++ overflow2(header->ncolors, sizeof(Color));
+ header->colors = (Color *)calloc((unsigned int)header->ncolors,
+ sizeof(Color));
+ if (header->colors == NULL) {
+diff --git a/editor/pamcut.c b/editor/pamcut.c
+index 1fc9d9b..ad0e030 100644
+--- a/editor/pamcut.c
++++ b/editor/pamcut.c
+@@ -799,6 +799,8 @@ cutOneImage(FILE * const ifP,
+
+ outpam = inpam; /* Initial value -- most fields should be same */
+ outpam.file = ofP;
++ overflow_add(rightcol, 1);
++ overflow_add(bottomrow, 1);
+ outpam.width = rightcol - leftcol + 1;
+ outpam.height = bottomrow - toprow + 1;
+
+diff --git a/editor/pnmgamma.c b/editor/pnmgamma.c
+index 1fdf20e..98b7e90 100644
+--- a/editor/pnmgamma.c
++++ b/editor/pnmgamma.c
+@@ -596,6 +596,7 @@ createGammaTables(enum transferFunction const transferFunction,
+ xelval ** const btableP) {
+
+ /* Allocate space for the tables. */
++ overflow_add(maxval, 1);
+ MALLOCARRAY(*rtableP, maxval+1);
+ MALLOCARRAY(*gtableP, maxval+1);
+ MALLOCARRAY(*btableP, maxval+1);
+diff --git a/editor/pnmhisteq.c b/editor/pnmhisteq.c
+index a339f73..c2c85a3 100644
+--- a/editor/pnmhisteq.c
++++ b/editor/pnmhisteq.c
+@@ -107,6 +107,7 @@ computeLuminosityHistogram(xel * const * const xels,
+ unsigned int pixelCount;
+ unsigned int * lumahist;
+
++ overflow_add(maxval, 1);
+ MALLOCARRAY(lumahist, maxval + 1);
+ if (lumahist == NULL)
+ pm_error("Out of storage allocating array for %u histogram elements",
+diff --git a/editor/pnmindex.csh b/editor/pnmindex.csh
+index c6f1e84..c513a84 100755
+--- a/editor/pnmindex.csh
++++ b/editor/pnmindex.csh
+@@ -1,5 +1,7 @@
+ #!/bin/csh -f
+ #
++echo "Unsafe code, needs debugging, do not ship"
++exit 1
+ # pnmindex - build a visual index of a bunch of anymaps
+ #
+ # Copyright (C) 1991 by Jef Poskanzer.
+diff --git a/editor/pnmpad.c b/editor/pnmpad.c
+index 55cdcd6..10da3af 100644
+--- a/editor/pnmpad.c
++++ b/editor/pnmpad.c
+@@ -654,6 +654,8 @@ main(int argc, const char ** argv) {
+
+ computePadSizes(cmdline, cols, rows, &lpad, &rpad, &tpad, &bpad);
+
++ overflow_add(cols, lpad);
++ overflow_add(cols + lpad, rpad);
+ newcols = cols + lpad + rpad;
+
+ if (cmdline.reportonly)
+diff --git a/editor/pnmremap.c b/editor/pnmremap.c
+index 0c0096b..8b86cb7 100644
+--- a/editor/pnmremap.c
++++ b/editor/pnmremap.c
+@@ -468,6 +468,7 @@ fserr_init(struct pam * const pamP,
+
+ unsigned int const fserrSize = pamP->width + 2;
+
++ overflow_add(pamP->width, 2);
+ fserrP->width = pamP->width;
+
+ MALLOCARRAY(fserrP->thiserr, pamP->depth);
+@@ -506,6 +507,7 @@ floydInitRow(struct pam * const pamP,
+
+ unsigned int col;
+
++ overflow_add(pamP->width, 2);
+ for (col = 0; col < pamP->width + 2; ++col) {
+ unsigned int plane;
+ for (plane = 0; plane < pamP->depth; ++plane)
+diff --git a/editor/pnmscalefixed.c b/editor/pnmscalefixed.c
+index 884ca31..f4d7086 100644
+--- a/editor/pnmscalefixed.c
++++ b/editor/pnmscalefixed.c
+@@ -214,6 +214,7 @@ compute_output_dimensions(const struct cmdline_info cmdline,
+ const int rows, const int cols,
+ int * newrowsP, int * newcolsP) {
+
++ overflow2(rows, cols);
+ if (cmdline.pixels) {
+ if (rows * cols <= cmdline.pixels) {
+ *newrowsP = rows;
+@@ -265,6 +266,7 @@ compute_output_dimensions(const struct cmdline_info cmdline,
+
+ if (*newcolsP < 1) *newcolsP = 1;
+ if (*newrowsP < 1) *newrowsP = 1;
++ overflow2(*newcolsP, *newrowsP);
+ }
+
+
+@@ -446,6 +448,8 @@ main(int argc, char **argv ) {
+ unfilled. We can address that by stretching, whereas the other
+ case would require throwing away some of the input.
+ */
++ overflow2(newcols, SCALE);
++ overflow2(newrows, SCALE);
+ sxscale = SCALE * newcols / cols;
+ syscale = SCALE * newrows / rows;
+
+diff --git a/editor/ppmdither.c b/editor/ppmdither.c
+index ec1b977..c46a974 100644
+--- a/editor/ppmdither.c
++++ b/editor/ppmdither.c
+@@ -352,6 +352,9 @@ dithMatrix(unsigned int const dithPower) {
+ assert(dithPower < sizeof(unsigned int) * 8);
+
+ {
++ overflow2(dithDim, sizeof(*dithMat));
++ overflow3(dithDim, dithDim, sizeof(**dithMat));
++ overflow_add(dithDim * sizeof(*dithMat), dithDim * dithDim * sizeof(**dithMat));
+ unsigned int const dithMatSize =
+ (dithDim * sizeof(*dithMat)) + /* pointers */
+ (dithDim * dithDim * sizeof(**dithMat)); /* data */
+diff --git a/editor/specialty/pamoil.c b/editor/specialty/pamoil.c
+index 6cb8d3a..6f4bde9 100644
+--- a/editor/specialty/pamoil.c
++++ b/editor/specialty/pamoil.c
+@@ -112,6 +112,7 @@ main(int argc, char *argv[] ) {
+ tuples = pnm_readpam(ifp, &inpam, PAM_STRUCT_SIZE(tuple_type));
+ pm_close(ifp);
+
++ overflow_add(inpam.maxval, 1);
+ MALLOCARRAY(hist, inpam.maxval + 1);
+ if (hist == NULL)
+ pm_error("Unable to allocate memory for histogram.");
+diff --git a/lib/libpam.c b/lib/libpam.c
+index a8f140b..e6986f1 100644
+--- a/lib/libpam.c
++++ b/lib/libpam.c
+@@ -225,7 +225,8 @@ allocPamRow(const struct pam * const pamP) {
+ unsigned int const bytesPerTuple = allocationDepth(pamP) * sizeof(sample);
+ tuple * tuplerow;
+
+- tuplerow = malloc(pamP->width * (sizeof(tuple *) + bytesPerTuple));
++ overflow_add(sizeof(tuple *), bytesPerTuple);
++ tuplerow = malloc2(pamP->width, (sizeof(tuple *) + bytesPerTuple));
+
+ if (tuplerow != NULL) {
+ /* Now we initialize the pointers to the individual tuples
+diff --git a/lib/libpammap.c b/lib/libpammap.c
+index 569156f..bc24d22 100644
+--- a/lib/libpammap.c
++++ b/lib/libpammap.c
+@@ -108,6 +108,8 @@ allocTupleIntListItem(struct pam * const pamP) {
+ */
+ struct tupleint_list_item * retval;
+
++ overflow2(pamP->depth, sizeof(sample));
++ overflow_add(sizeof(*retval)-sizeof(retval->tupleint.tuple), pamP->depth*sizeof(sample));
+ unsigned int const size =
+ sizeof(*retval) - sizeof(retval->tupleint.tuple)
+ + pamP->depth * sizeof(sample);
+diff --git a/lib/libpm.c b/lib/libpm.c
+index 47a2f49..a263598 100644
+--- a/lib/libpm.c
++++ b/lib/libpm.c
+@@ -888,5 +888,53 @@ pm_parse_height(const char * const arg) {
+ return height;
+ }
+
++/*
++ * Maths wrapping
++ */
+
++void __overflow2(int a, int b)
++{
++ if(a < 0 || b < 0)
++ pm_error("object too large");
++ if(b == 0)
++ return;
++ if(a > INT_MAX / b)
++ pm_error("object too large");
++}
++
++void overflow3(int a, int b, int c)
++{
++ overflow2(a,b);
++ overflow2(a*b, c);
++}
++
++void overflow_add(int a, int b)
++{
++ if( a > INT_MAX - b)
++ pm_error("object too large");
++}
++
++void *malloc2(int a, int b)
++{
++ overflow2(a, b);
++ if(a*b == 0)
++ pm_error("Zero byte allocation");
++ return malloc(a*b);
++}
++
++void *malloc3(int a, int b, int c)
++{
++ overflow3(a, b, c);
++ if(a*b*c == 0)
++ pm_error("Zero byte allocation");
++ return malloc(a*b*c);
++}
++
++void *realloc2(void * a, int b, int c)
++{
++ overflow2(b, c);
++ if(b*c == 0)
++ pm_error("Zero byte allocation");
++ return realloc(a, b*c);
++}
+
+diff --git a/lib/pm.h b/lib/pm.h
+index 3fc92fb..17a25f1 100644
+--- a/lib/pm.h
++++ b/lib/pm.h
+@@ -441,5 +441,12 @@ pm_parse_height(const char * const arg);
+ }
+ #endif
+
++#define overflow2(a,b) __overflow2(a,b)
++void __overflow2(int, int);
++void overflow3(int, int, int);
++void overflow_add(int, int);
++void *malloc2(int, int);
++void *malloc3(int, int, int);
++void *realloc2(void *, int, int);
+
+ #endif
+diff --git a/other/pnmcolormap.c b/other/pnmcolormap.c
+index 7da3122..dafa390 100644
+--- a/other/pnmcolormap.c
++++ b/other/pnmcolormap.c
+@@ -1002,6 +1002,7 @@ colormapToSquare(struct pam * const pamP,
+ pamP->width = intsqrt;
+ else
+ pamP->width = intsqrt + 1;
++ overflow_add(intsqrt, 1);
+ }
+ {
+ unsigned int const intQuotient = colormap.size / pamP->width;
+diff --git a/urt/Runput.c b/urt/Runput.c
+index 3bc562a..cb6e7c5 100644
+--- a/urt/Runput.c
++++ b/urt/Runput.c
+@@ -202,9 +202,11 @@ RunSetup(rle_hdr * the_hdr)
+ if ( the_hdr->background != 0 )
+ {
+ register int i;
+- register rle_pixel *background =
+- (rle_pixel *)malloc( (unsigned)(the_hdr->ncolors + 1) );
++ register rle_pixel *background;
+ register int *bg_color;
++
++ overflow_add(the_hdr->ncolors,1);
++ background = (rle_pixel *)malloc( (unsigned)(the_hdr->ncolors + 1) );
+ /*
+ * If even number of bg color bytes, put out one more to get to
+ * 16 bit boundary.
+@@ -224,7 +226,7 @@ RunSetup(rle_hdr * the_hdr)
+ /* Big-endian machines are harder */
+ register int i, nmap = (1 << the_hdr->cmaplen) *
+ the_hdr->ncmap;
+- register char *h_cmap = (char *)malloc( nmap * 2 );
++ register char *h_cmap = (char *)malloc2( nmap, 2 );
+ if ( h_cmap == NULL )
+ {
+ fprintf( stderr,
+diff --git a/urt/rle.h b/urt/rle.h
+index 0071774..6a905ba 100644
+--- a/urt/rle.h
++++ b/urt/rle.h
+@@ -152,6 +152,17 @@ rle_hdr /* End of typedef. */
+ */
+ extern rle_hdr rle_dflt_hdr;
+
++/*
++ * Provided by pm library
++ */
++
++extern void overflow_add(int, int);
++#define overflow2(a,b) __overflow2(a,b)
++extern void __overflow2(int, int);
++extern void overflow3(int, int, int);
++extern void *malloc2(int, int);
++extern void *malloc3(int, int, int);
++extern void *realloc2(void *, int, int);
+
+ /* Declare RLE library routines. */
+
+diff --git a/urt/rle_addhist.c b/urt/rle_addhist.c
+index b165175..e09ed94 100644
+--- a/urt/rle_addhist.c
++++ b/urt/rle_addhist.c
+@@ -70,13 +70,18 @@ rle_addhist(char * argv[],
+ return;
+
+ length = 0;
+- for (i = 0; argv[i]; ++i)
++ for (i = 0; argv[i]; ++i) {
++ overflow_add(length, strlen(argv[i]));
++ overflow_add(length+1, strlen(argv[i]));
+ length += strlen(argv[i]) +1; /* length of each arg plus space. */
++ }
+
+ time(&temp);
+ timedate = ctime(&temp);
+ length += strlen(timedate); /* length of date and time in ASCII. */
+-
++ overflow_add(strlen(padding), 4);
++ overflow_add(strlen(histoire), strlen(padding) + 4);
++ overflow_add(length, strlen(histoire) + strlen(padding) + 4);
+ length += strlen(padding) + 3 + strlen(histoire) + 1;
+ /* length of padding, "on " and length of history name plus "="*/
+ if (in_hdr) /* if we are interested in the old comments... */
+@@ -84,8 +89,10 @@ rle_addhist(char * argv[],
+ else
+ old = NULL;
+
+- if (old && *old)
++ if (old && *old) {
++ overflow_add(length, strlen(old));
+ length += strlen(old); /* add length if there. */
++ }
+
+ ++length; /*Cater for the null. */
+
+diff --git a/urt/rle_getrow.c b/urt/rle_getrow.c
+index ae220f5..39010ba 100644
+--- a/urt/rle_getrow.c
++++ b/urt/rle_getrow.c
+@@ -164,6 +164,7 @@ rle_get_setup(rle_hdr * const the_hdr) {
+ char * cp;
+
+ VAXSHORT(comlen, infile); /* get comment length */
++ overflow_add(comlen, 1);
+ evenlen = (comlen + 1) & ~1; /* make it even */
+ if (evenlen) {
+ MALLOCARRAY(comment_buf, evenlen);
+diff --git a/urt/rle_hdr.c b/urt/rle_hdr.c
+index 1edb7a3..c3dd60f 100644
+--- a/urt/rle_hdr.c
++++ b/urt/rle_hdr.c
+@@ -148,6 +148,7 @@ rle_hdr_cp(rle_hdr * const fromHdrP,
+ if (toHdrP->cmap) {
+ size_t const size =
+ toHdrP->ncmap * (1 << toHdrP->cmaplen) * sizeof(rle_map);
++ overflow3(toHdrP->ncmap, 1<cmaplen, sizeof(rle_map));
+ toHdrP->cmap = malloc(size);
+ if (!toHdrP->cmap)
+ pm_error("Failed to allocate memory for %u color maps "
+@@ -163,12 +164,16 @@ rle_hdr_cp(rle_hdr * const fromHdrP,
+ const char ** cp;
+
+ /* Count the comments. */
+- for (cp = toHdrP->comments, size = 0; *cp; ++cp)
++ for (cp = toHdrP->comments, size = 0; *cp; ++cp) {
++ overflow_add(size, 1);
+ ++size;
++ }
+
+ /* Check if there are really any comments. */
+ if (size > 0) {
++ overflow_add(size, 1);
+ ++size; /* Copy the NULL pointer, too. */
++ overflow2(size, sizeof(char *));
+ size *= sizeof(char *);
+ toHdrP->comments = malloc(size);
+ if (!toHdrP->comments)
+diff --git a/urt/rle_open_f.c b/urt/rle_open_f.c
+index 1aeb644..595b15c 100644
+--- a/urt/rle_open_f.c
++++ b/urt/rle_open_f.c
+@@ -163,65 +163,7 @@ dealWithSubprocess(const char * const file_name,
+ FILE ** const fpP,
+ bool * const noSubprocessP,
+ const char ** const errorP) {
+-
+-#ifdef NO_OPEN_PIPES
+ *noSubprocessP = TRUE;
+-#else
+- const char *cp;
+-
+- reapChildren(catchingChildrenP, pids);
+-
+- /* Real file, not stdin or stdout. If name ends in ".Z",
+- * pipe from/to un/compress (depending on r/w mode).
+- *
+- * If it starts with "|", popen that command.
+- */
+-
+- cp = file_name + strlen(file_name) - 2;
+- /* Pipe case. */
+- if (file_name[0] == '|') {
+- pid_t thepid; /* PID from my_popen */
+-
+- *noSubprocessP = FALSE;
+-
+- *fpP = my_popen(file_name + 1, mode, &thepid);
+- if (*fpP == NULL)
+- *errorP = "%s: can't invoke <<%s>> for %s: ";
+- else {
+- /* One more child to catch, eventually. */
+- if (*catchingChildrenP < MAX_CHILDREN)
+- pids[(*catchingChildrenP)++] = thepid;
+- }
+- } else if (cp > file_name && *cp == '.' && *(cp + 1) == 'Z' ) {
+- /* Compress case. */
+- pid_t thepid; /* PID from my_popen. */
+- const char * command;
+-
+- *noSubprocessP = FALSE;
+-
+- if (*mode == 'w')
+- pm_asprintf(&command, "compress > %s", file_name);
+- else if (*mode == 'a')
+- pm_asprintf(&command, "compress >> %s", file_name);
+- else
+- pm_asprintf(&command, "compress -d < %s", file_name);
+-
+- *fpP = my_popen(command, mode, &thepid);
+-
+- if (*fpP == NULL)
+- *errorP = "%s: can't invoke 'compress' program, "
+- "trying to open %s for %s";
+- else {
+- /* One more child to catch, eventually. */
+- if (*catchingChildrenP < MAX_CHILDREN)
+- pids[(*catchingChildrenP)++] = thepid;
+- }
+- pm_strfree(command);
+- } else {
+- *noSubprocessP = TRUE;
+- *errorP = NULL;
+- }
+-#endif
+ }
+
+
+diff --git a/urt/rle_putcom.c b/urt/rle_putcom.c
+index ab2eb20..ce83615 100644
+--- a/urt/rle_putcom.c
++++ b/urt/rle_putcom.c
+@@ -98,12 +98,14 @@ rle_putcom(const char * const value,
+ const char * v;
+ const char ** old_comments;
+ int i;
+- for (i = 2, cp = the_hdr->comments; *cp != NULL; ++i, ++cp)
++ for (i = 2, cp = the_hdr->comments; *cp != NULL; ++i, ++cp) {
++ overflow_add(i, 1);
+ if (match(value, *cp) != NULL) {
+ v = *cp;
+ *cp = value;
+ return v;
+ }
++ }
+ /* Not found */
+ /* Can't realloc because somebody else might be pointing to this
+ * comments block. Of course, if this were true, then the
+diff --git a/urt/scanargs.c b/urt/scanargs.c
+index f3af334..8dfa05b 100644
+--- a/urt/scanargs.c
++++ b/urt/scanargs.c
+@@ -62,8 +62,8 @@ typedef int *ptr;
+ /*
+ * Storage allocation macros
+ */
+-#define NEW( type, cnt ) (type *) malloc( (cnt) * sizeof( type ) )
+-#define RENEW( type, ptr, cnt ) (type *) realloc( ptr, (cnt) * sizeof( type ) )
++#define NEW( type, cnt ) (type *) malloc2( (cnt) , sizeof( type ) )
++#define RENEW( type, ptr, cnt ) (type *) realloc2( ptr, (cnt), sizeof( type ) )
+
+ static CONST_DECL char * prformat( CONST_DECL char *, int );
+ static int isnum( CONST_DECL char *, int, int );
+
diff --git a/netpbm-CAN-2005-2471.patch b/netpbm-CAN-2005-2471.patch
index ae17d6b..de6bc59 100644
--- a/netpbm-CAN-2005-2471.patch
+++ b/netpbm-CAN-2005-2471.patch
@@ -1,6 +1,6 @@
diff -urNp a/converter/other/pstopnm.c b/converter/other/pstopnm.c
---- a/converter/other/pstopnm.c 2018-07-23 15:14:51.200658026 +0200
-+++ b/converter/other/pstopnm.c 2018-07-23 15:18:12.579910612 +0200
+--- a/converter/other/pstopnm.c 2025-02-04 10:47:27.857451432 +0100
++++ b/converter/other/pstopnm.c 2025-02-04 10:55:56.430470597 +0100
@@ -896,11 +896,11 @@ execGhostscript(int const
ghostscriptProg, arg0,
deviceopt, outfileopt, gopt, ropt, textalphabitsopt,
@@ -9,9 +9,9 @@ diff -urNp a/converter/other/pstopnm.c b/converter/other/pstopnm.c
+ "-dPARANOIDSAFER", "-");
}
- execl(ghostscriptProg, arg0, deviceopt, outfileopt, gopt, ropt,
-- textalphabitsopt, "-q", "-dNOPAUSE", "-dSAFER", "-", NULL);
-+ "-q", "-dNOPAUSE", "-dPARANOIDSAFER", "-", NULL);
+ execl(ghostscriptProg, arg0, deviceopt, outfileopt, gopt, ropt,
+- textalphabitsopt, "-q", "-dNOPAUSE", "-dSAFER", "-", NULL);
++ "-q", "-dNOPAUSE", "-dPARANOIDSAFER", "-", NULL);
pm_error("execl() of Ghostscript ('%s') failed, errno=%d (%s)",
ghostscriptProg, errno, strerror(errno));
diff --git a/netpbm-c99-2.patch b/netpbm-c99-2.patch
deleted file mode 100644
index bcb8a99..0000000
--- a/netpbm-c99-2.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-Remove the contents of libjasper_compat.c. The assignment
-
- *errorP = errorP;
-
-is bogus because it creates a non-null value in *errorP even on
-success, and the caller expects a null pointer int his case.
-
-The source file is compiled, but not actually linked in, so this is
-only a problem because of the type error that fails the build.
-
-diff --git a/converter/other/jpeg2000/libjasper_compat.c b/converter/other/jpeg2000/libjasper_compat.c
-index 101820a321212dc6..e69de29bb2d1d643 100644
---- a/converter/other/jpeg2000/libjasper_compat.c
-+++ b/converter/other/jpeg2000/libjasper_compat.c
-@@ -1,26 +0,0 @@
--#include "netpbm/nstring.h"
--
--#include "jasper/jasper.h"
--#include "jasper/jas_image.h"
--
--#ifndef JAS_HAVE_PMJAS_IMAGE_DECODE
--
--void
--pmjas_image_decode(jas_stream_t * const in,
-- int const fmtArg,
-- const char * const optstr,
-- jas_image_t ** const imagePP,
-- const char ** const errorP) {
--
-- jas_image_t * const jasperP = jas_image_decode(in, fmtArg, optstr);
--
-- if (jasperP) {
-- *imagePP = jasperP;
-- *errorP = errorP;
-- } else {
-- pm_asprintf(errorP, "Failed. Details may have been written to "
-- "Standard Error");
-- }
--}
--
--#endif
diff --git a/netpbm-c99.patch b/netpbm-c99.patch
index ed0a887..bcb8a99 100644
--- a/netpbm-c99.patch
+++ b/netpbm-c99.patch
@@ -1,46 +1,41 @@
-Include "pm.h" for the declaration of the overflow_add function. This
-avoids an implicit function declaration. Future C compilers will
-require that all functions are declared explicitly. Implicit function
-declarations are a language feature that was removed in 1999.
+Remove the contents of libjasper_compat.c. The assignment
-Likewise, include "pm.h" for the newly added declarations of realloc2.
-This fixes a pointer truncation bug in pjtoppm.
+ *errorP = errorP;
-Both issues are specific to downstream patches.
+is bogus because it creates a non-null value in *errorP even on
+success, and the caller expects a null pointer int his case.
-diff --git a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
-index 1c8d236219b297e1..d63cab63b13f2051 100644
---- a/converter/pbm/pbmtoppa/pbm.c
-+++ b/converter/pbm/pbmtoppa/pbm.c
-@@ -12,6 +12,7 @@
- #include
- #include
-
-+#include "pm.h"
- #include "ppapbm.h"
-
- int make_pbm_stat(pbm_stat* pbm,FILE* fptr)
-diff --git a/converter/ppm/pjtoppm.c b/converter/ppm/pjtoppm.c
-index c458c06457c2b9bd..5e93a6acb8d6f198 100644
---- a/converter/ppm/pjtoppm.c
-+++ b/converter/ppm/pjtoppm.c
-@@ -10,6 +10,7 @@
- ** implied warranty.
- */
-
-+#include "pm.h"
- #include "ppm.h"
- #include "mallocvar.h"
-
-diff --git a/lib/pm.h b/lib/pm.h
-index 5037c2519c565fbc..435445d5e7f52fbf 100644
---- a/lib/pm.h
-+++ b/lib/pm.h
-@@ -457,6 +457,7 @@ pm_parse_height(const char * const arg);
-
- void *malloc2(int, int);
- void *malloc3(int, int, int);
-+void *realloc2(void * a, int b, int c);
- #define overflow2(a,b) __overflow2(a,b)
- void __overflow2(int, int);
- void overflow3(int, int, int);
+The source file is compiled, but not actually linked in, so this is
+only a problem because of the type error that fails the build.
+
+diff --git a/converter/other/jpeg2000/libjasper_compat.c b/converter/other/jpeg2000/libjasper_compat.c
+index 101820a321212dc6..e69de29bb2d1d643 100644
+--- a/converter/other/jpeg2000/libjasper_compat.c
++++ b/converter/other/jpeg2000/libjasper_compat.c
+@@ -1,26 +0,0 @@
+-#include "netpbm/nstring.h"
+-
+-#include "jasper/jasper.h"
+-#include "jasper/jas_image.h"
+-
+-#ifndef JAS_HAVE_PMJAS_IMAGE_DECODE
+-
+-void
+-pmjas_image_decode(jas_stream_t * const in,
+- int const fmtArg,
+- const char * const optstr,
+- jas_image_t ** const imagePP,
+- const char ** const errorP) {
+-
+- jas_image_t * const jasperP = jas_image_decode(in, fmtArg, optstr);
+-
+- if (jasperP) {
+- *imagePP = jasperP;
+- *errorP = errorP;
+- } else {
+- pm_asprintf(errorP, "Failed. Details may have been written to "
+- "Standard Error");
+- }
+-}
+-
+-#endif
diff --git a/netpbm-glibc.patch b/netpbm-glibc.patch
index 4ae71e8..c500386 100644
--- a/netpbm-glibc.patch
+++ b/netpbm-glibc.patch
@@ -1,9 +1,10 @@
---- netpbm-10.35/converter/other/pnmtotiffcmyk.c.glibc 2006-09-18 12:20:06.000000000 +0200
-+++ netpbm-10.35/converter/other/pnmtotiffcmyk.c 2007-08-23 09:18:30.000000000 +0200
-@@ -974,8 +974,8 @@ int main( int argc, char **argv ) {
+diff -urNp a/converter/other/pnmtotiffcmyk.c b/converter/other/pnmtotiffcmyk.c
+--- a/converter/other/pnmtotiffcmyk.c 2025-02-04 10:47:27.858451429 +0100
++++ b/converter/other/pnmtotiffcmyk.c 2025-02-04 11:04:46.118394226 +0100
+@@ -989,8 +989,8 @@ int main( int argc, char **argv ) {
if ( (err = parseOpts( argc, argv, rt )) ) goto exit ;
-
+
- if ( (err = rt->in->open( rt->in, rt )) ) goto exit ;
- if ( (err = rt->out->open( rt->out, rt )) ) goto exit ;
+ if ( (err = (rt->in->open)( rt->in, rt )) ) goto exit ;
diff --git a/netpbm-manfix.patch b/netpbm-manfix.patch
index 10f635d..6d759c1 100644
--- a/netpbm-manfix.patch
+++ b/netpbm-manfix.patch
@@ -1,25 +1,20 @@
diff -urNp a/userguide/avstopam.html b/userguide/avstopam.html
---- a/userguide/avstopam.html 2022-01-03 16:56:37.731614243 +0100
-+++ b/userguide/avstopam.html 2022-01-03 16:58:29.889416006 +0100
-@@ -2,12 +2,13 @@
+--- a/userguide/avstopam.html 2025-02-04 10:47:27.823451565 +0100
++++ b/userguide/avstopam.html 2025-02-04 17:49:34.981978989 +0100
+@@ -2,9 +2,9 @@
Avstopam User Manual
avstopam
-Updated: 07 February 2010
-
-Table Of Contents
-+
+Updated: 07 February 2010
+
+
NAME
--avstopam - convert an AVS X image to a Netpbm image
-+
avstopam - convert an AVS X image to a Netpbm image
-
- SYNOPSIS
-
-@@ -16,40 +17,40 @@ Updated: 07 February 2010
+ avstopam - convert an AVS X image to a Netpbm image
+@@ -16,40 +16,40 @@ Updated: 07 February 2010
DESCRIPTION
@@ -72,8 +67,8 @@ diff -urNp a/userguide/avstopam.html b/userguide/avstopam.html
diff -urNp a/userguide/faxformat.html b/userguide/faxformat.html
---- a/userguide/faxformat.html 2022-01-03 16:56:37.731614243 +0100
-+++ b/userguide/faxformat.html 2022-01-03 16:58:29.890416013 +0100
+--- a/userguide/faxformat.html 2025-02-04 10:47:27.824451560 +0100
++++ b/userguide/faxformat.html 2025-02-04 17:50:41.300631089 +0100
@@ -5,10 +5,11 @@
Updated: 03 December 2008
@@ -88,8 +83,8 @@ diff -urNp a/userguide/faxformat.html b/userguide/faxformat.html
(the idea is to provide a way to be sure that a fax machine is able to receive
a fax sent by another). These standards incidentally specify graphics file
diff -urNp a/userguide/libnetpbm_ug.html b/userguide/libnetpbm_ug.html
---- a/userguide/libnetpbm_ug.html 2022-01-03 16:56:37.732614250 +0100
-+++ b/userguide/libnetpbm_ug.html 2022-01-03 16:58:29.891416020 +0100
+--- a/userguide/libnetpbm_ug.html 2025-02-04 10:47:27.824451560 +0100
++++ b/userguide/libnetpbm_ug.html 2025-02-04 17:52:02.045207328 +0100
@@ -374,7 +374,7 @@ plain format.
Reference
@@ -100,8 +95,8 @@ diff -urNp a/userguide/libnetpbm_ug.html b/userguide/libnetpbm_ug.html
The Libnetpbm Utility Manual
diff -urNp a/userguide/pamfunc.html b/userguide/pamfunc.html
---- a/userguide/pamfunc.html 2022-01-03 16:56:37.730614236 +0100
-+++ b/userguide/pamfunc.html 2022-01-03 16:58:29.892416027 +0100
+--- a/userguide/pamfunc.html 2025-02-04 10:47:27.823451565 +0100
++++ b/userguide/pamfunc.html 2025-02-04 17:52:19.661114878 +0100
@@ -60,7 +60,7 @@ output image.
and bit string (such as and with 01001000). For the arithmetic functions, the
function arguments and results are the fraction that a sample is of the
@@ -112,9 +107,9 @@ diff -urNp a/userguide/pamfunc.html b/userguide/pamfunc.html
Arithmetic functions
diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
---- a/userguide/pammixmulti.html 2022-01-03 16:56:37.731614243 +0100
-+++ b/userguide/pammixmulti.html 2022-01-03 16:58:29.893416034 +0100
-@@ -7,8 +7,8 @@ Updated: 18 November 2018
+--- a/userguide/pammixmulti.html 2025-02-04 10:47:27.820451577 +0100
++++ b/userguide/pammixmulti.html 2025-02-04 17:56:58.538651212 +0100
+@@ -7,8 +7,8 @@ Updated: 18 December 2024
Table Of Contents
@@ -125,9 +120,15 @@ diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
SYNOPSIS
-@@ -22,14 +22,14 @@ Updated: 18 November 2018
- Minimum unique abbreviation of an option is acceptable. You can use a
- single hyphen instead of double hyphens to denote options. You can use white
+@@ -17,19 +17,19 @@ Updated: 18 December 2024
+ [-maskfile=filename]
+ [-stdev=number]
+ [-randomseed integer]
+- filename ...
++ filename ...
+
+ Minimum unique abbreviation of an option is acceptable. You can use double
+ hyphen instead of a single hyphen to denote options. You can use white
space in place of the equals sign to separate an option name from its
-value.
+value.
@@ -151,17 +152,19 @@ diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
+command line options:
- - --blend=average|random|mask
-@@ -50,7 +50,7 @@ output is produced by selecting the corr
- images, chosen at random on a per-pixel basis. With
- --blend=mask, each pixel in the output is produced by a
- weighted average of the corresponding pixels from all the input images based
--on the grayscale level of an additional mask image.
-+on the grayscale level of an additional mask image.
+ - -blend=average|alpha-weighted|random|mask
+@@ -55,8 +55,8 @@ of the input images, chosen at random on
+ With -blend=mask, each pixel in the output is
+ produced by a weighted average of the corresponding pixels from all
+ the input images based on the grayscale level of an additional mask
+-image.
+--alpha-weighted was new in Netpbm 11.09 (December 2024).
++image.
++-alpha-weighted was new in Netpbm 11.09 (December 2024).
- - --maskfile=filename
-@@ -60,7 +60,7 @@ grayscale mask file to control the blend
+ - -maskfile=filename
+@@ -66,7 +66,7 @@ grayscale mask file to control the blend
not grayscale, the first channel is treated as gray). Where the mask file is
black, the first image is selected. Where the mask file is white, the last
image is selected. Intermediate levels of gray select intermediate
@@ -169,19 +172,19 @@ diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
+images.
- - --stdev=number
-@@ -77,7 +77,7 @@ that includes roughly equal amounts of t
+ - -stdev=number
+@@ -83,7 +83,7 @@ that includes roughly equal amounts of t
and 2 but less of the corresponding pixel from image 3. As number
tends towards the number of input images (going beyond that has diminishing
impact), the output tends to look more
--like --blend=average. number defaults to 0.25.
-+like --blend=average. number defaults to 0.25.
+-like -blend=average. number defaults to 0.25.
++like -blend=average. number defaults to 0.25.
- - --randomseed integer
-@@ -85,45 +85,45 @@ like --blend=average. number
+
- -randomseed integer
+@@ -91,45 +91,45 @@ like -blend=average. numberThis is the seed for the random number generator used with
- --blend=random
+ -blend=random
-
Use this to ensure you get the same image on separate invocations.
+
Use this to ensure you get the same image on separate invocations.
@@ -207,7 +210,7 @@ diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
+image:
- pammixmulti --blend=random input*.ppm >output.ppm
+ pammixmulti -blend=random input*.ppm >output.ppm
Use a mask image to control the fading among input images on a
@@ -215,7 +218,7 @@ diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
+pixel-by-pixel basis:
- pammixmulti --blend=mask --maskfile=mask.pgm >output.pam \
+ pammixmulti -blend=mask -maskfile=mask.pgm >output.pam \
one.pam two.pam three.pam four.pam
@@ -223,7 +226,7 @@ diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
+Do the same but with more abrupt transitions:
- pammixmulti --blend=mask --maskfile=mask.pgm --stdev=0.0 >output.pam \
+ pammixmulti -blend=mask -maskfile=mask.pgm -stdev=0.0 >output.pam \
one.pam two.pam three.pam four.pam
@@ -231,8 +234,8 @@ diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
+and now with more gradual transitions:
- pammixmulti --blend=mask --maskfile=mask.pgm --stdev=1.0 >output.pam \
-@@ -133,12 +133,12 @@ pixel-by-pixel basis:
+ pammixmulti -blend=mask -maskfile=mask.pgm -stdev=1.0 >output.pam \
+@@ -139,12 +139,12 @@ pixel-by-pixel basis:
HISTORY
@@ -242,12 +245,12 @@ diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
AUTHOR
--Copyright 2018 Scott Pakin, scott+pbm@pakin.org.
-+
Copyright 2018 Scott Pakin, scott+pbm@pakin.org.
+-Copyright 2018–2024 Scott Pakin, scott+pbm@pakin.org.
++
Copyright 2018–2024 Scott Pakin, scott+pbm@pakin.org.
SEE ALSO
-@@ -146,20 +146,20 @@ pixel-by-pixel basis:
+@@ -152,20 +152,20 @@ pixel-by-pixel basis:
ppmmix,
pamarith,
pnm,
@@ -278,8 +281,8 @@ diff -urNp a/userguide/pammixmulti.html b/userguide/pammixmulti.html
diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
---- a/userguide/pampaintspill.html 2022-01-03 16:56:37.730614236 +0100
-+++ b/userguide/pampaintspill.html 2022-01-03 17:05:08.124277395 +0100
+--- a/userguide/pampaintspill.html 2025-02-04 10:47:27.823451565 +0100
++++ b/userguide/pampaintspill.html 2025-02-04 18:01:50.746117598 +0100
@@ -7,7 +7,7 @@ Updated: 02 November 2021
Table Of Contents
@@ -289,7 +292,7 @@ diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
SYNOPSIS
-@@ -19,17 +19,17 @@ pampaintspill - smoothly spill colors in
+@@ -19,48 +19,48 @@ pampaintspill - smoothly spill colors in
[--downsample=number]
[--near=number]
[--power=number] [filename]
@@ -310,7 +313,11 @@ diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
pampaintspill produces a smooth color gradient from all of the
non-background-colored pixels in an input image, effectively "spilling
-@@ -40,27 +40,27 @@ paint" onto the background. pampaint
+ paint" onto the background. pampaintspill is similar to
+-pamgradient but differs in the following characteristics:
++pamgradient but differs in the following characteristics:
+
+
- pampaintspill accepts any number of paint
sources (non-background-colored pixels), which can lie anywhere
on the canvas. pamgradient accepts exactly
@@ -343,14 +350,13 @@ diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
- --bgcolor=color
-@@ -116,46 +116,46 @@ command line options:
- 2.0) make the paint sources stand out in the output image by pushing the
+@@ -117,45 +117,45 @@ command line options:
gradients away from them.
-- - -randomseed=integer
-+
- -randomseed=integer
- - This is the seed for the random number generator that generates the
+
- -randomseed=integer
+-
- This is the seed for the random number generator that generates the
- pixels.
++
- This is the seed fodr the random number generator that generates the
+ pixels.
- Use this to ensure you get the same image on separate invocations.
@@ -409,8 +415,8 @@ diff -urNp a/userguide/pampaintspill.html b/userguide/pampaintspill.html
diff -urNp a/userguide/pamrecolor.html b/userguide/pamrecolor.html
---- a/userguide/pamrecolor.html 2022-01-03 16:56:37.731614243 +0100
-+++ b/userguide/pamrecolor.html 2022-01-03 16:58:29.894416041 +0100
+--- a/userguide/pamrecolor.html 2025-02-04 10:47:27.823451565 +0100
++++ b/userguide/pamrecolor.html 2025-02-04 18:10:00.968545076 +0100
@@ -2,9 +2,9 @@
Pamrecolor User Manual
@@ -472,6 +478,15 @@ diff -urNp a/userguide/pamrecolor.html b/userguide/pamrecolor.html
+@@ -67,7 +67,7 @@ to luminance of each of the red, green,
+ example, in the SMPTE-C color space an RGB color is converted to
+ grayscale by multiplying the red channel by 0.2124132, the green
+ channel by 0.7010437, and the blue channel by 0.0865432 and summing
+-the resulting three products.
++the resulting three products.
+
+ When you use this option, the input and output images are not true Netpbm
+ images, because the Netpbm image format specifies a particular color space.
@@ -76,9 +76,9 @@ the raster have different meaning. Many
images actually use a variation with a different color space. For example,
GIMP uses sRGB internally and if you
@@ -484,7 +499,7 @@ diff -urNp a/userguide/pamrecolor.html b/userguide/pamrecolor.html
- adobe
-@@ -109,7 +109,7 @@ the format that uses sRGB.
+@@ -109,12 +109,12 @@ the format that uses sRGB.
The default is "ntsc" because this is the color space that the Netpbm
formats and many graphics utilities use. As a counterexample,
GIMP uses sRGB as its native color
@@ -493,18 +508,172 @@ diff -urNp a/userguide/pamrecolor.html b/userguide/pamrecolor.html
The luminance values pamrecolor uses for each of the above come from
Bruce Lindbloom's
-diff -urNp a/userguide/pbmtog3.html b/userguide/pbmtog3.html
---- a/userguide/pbmtog3.html 2022-01-03 16:56:37.732614250 +0100
-+++ b/userguide/pbmtog3.html 2022-01-03 16:58:29.894416041 +0100
-@@ -36,7 +36,7 @@ use those encodings.
-
In addition to the options common to all programs based on libnetpbm
- (most notably -quiet, see
- Common Options), pbmtog3 recognizes the following
--command line options:
-+command line options:
+
+-Computing RGB-to-XYZ and XYZ-to-RGB matrices page.
++Computing RGB-to-XYZ and XYZ-to-RGB matrices page.
-
- - -reversebits
+
- --rmult=fraction
+ - --gmult=fraction
+@@ -133,15 +133,13 @@ image. pamrecolor will make each
+ to color subject to the constraint that the luminance must stay the
+ same as in the original image. Specify color as in
+ the argument of the pnm_parsecolor()
+-library routine (e.g., "hotpink" or "#ff69b4").
++library routine (e.g., "hotpink" or "#ff69b4").
+
+ If you specify neither --targetcolor nor
+ --colorfile, pamrecolor will randomly select a target color for
+-each pixel of the input image.
+-
+-
You may not specify both -targetcolor and -colorfile.
++each pixel of the input image.
+
+-
++You may not specify both -targetcolor and -colorfile.
+
+ - --colorfile=file
+ - Take per-pixel target colors from Netpbm file file instead
+@@ -150,40 +148,38 @@ of using a single target color for the e
+ If the image in the file wider or taller than the input image,
+ pamrecolor uses only the left and top part of it.
+ If the image is narrower or shorter, pamrecolor considers the
+-image to be repeated in a tile pattern.
++image to be repeated in a tile pattern.
+
+ If you specify neither --targetcolor nor
+ --colorfile, pamrecolor will randomly select a target color for
+-each pixel of the input image.
++each pixel of the input image.
+
+-You may not specify both -targetcolor and -colorfile.
++
You may not specify both -targetcolor and -colorfile.
+
+-- -randomseed=integer
++
- -randomseed=integer
+
+ - This is the seed for the random number generator that generates the
+-pixels.
++pixels.
+
+-Use this to ensure you get the same image on separate invocations.
++
Use this to ensure you get the same image on separate invocations.
+
+ By default, pamrecolor uses a seed derived from the time of day
+ and process ID, which gives you fairly uncorrelated results in multiple
+-invocations.
+-
+-
This option was new in Netpbm 10.61 (December 2012).
++invocations.
+
+-
++This option was new in Netpbm 10.61 (December 2012).
+
+
+ EXAMPLES
+
+-This command tints an image yellow:
++
This command tints an image yellow:
+
+
+ pamrecolor --targetcolor=yellow colorpic.pam > yellowpic.pam
+
+
+ This command takes the colors from colorpicture.ppm and applies
+-them to graypicture.pgm:
++them to graypicture.pgm:
+
+
+ pamrecolor --colorfile=colorpic.ppm graypic.pgm > colorizedpic.pam
+@@ -192,52 +188,52 @@ them to graypicture.pgm:
+ The grayscale version of colorizedpic.pam will look just like
+ graypic.pgm. Note that if you use a non-Netpbm tool to do the conversion to
+ grayscale, you may additionally need to specify an
+-appropriate --colorspace value for your conversion tool.
++appropriate --colorspace value for your conversion tool.
+
+
+ NOTES
+
+ Here are a couple of fun special effects you can produce with
+-pamrecolor:
++pamrecolor:
+
+
+ - Specify a color file that is identical to the input image but with
+ some large, colored text added to it. The text will "magically"
+-vanish when the image is converted to grayscale.
++vanish when the image is converted to grayscale.
+
+ - Provide a low-contrast grayscale image — perhaps a secret
+ message written in similar shades of gray — as the input file and
+ a colorful but completely different image as the color file. If done
+ carefully, the grayscale image can be hidden by the colorful image.
+ Only people who know to convert the result to grayscale can recover
+-the original grayscale image.
++the original grayscale image.
+
+ - Use --targetcolor=tan to make an image look like an
+ old-timey photograph (or, more precisely, a
+ sepia-toned
+-photograph of the late 1800s).
++photograph of the late 1800s).
+
+
+
+ HISTORY
+
+-Scott Pakin wrote pamrecolor in July 2010.
++
Scott Pakin wrote pamrecolor in July 2010.
+
+-pamrecolor was new in Netpbm 10.52 (September 2010).
++
pamrecolor was new in Netpbm 10.52 (September 2010).
+
+
+ AUTHOR
+
+ Copyright (C) 2010 Scott
+-Pakin, scott+pbm@pakin.org
++Pakin, scott+pbm@pakin.org
+
+
+ SEE ALSO
+
+
+
+
+@@ -246,14 +242,14 @@ Pakin, Table Of Contents
+
+
+-- SYNOPSIS
+-
- DESCRIPTION
+-
- OPTIONS
+-
- EXAMPLES
+-
- NOTES
+-
- HISTORY
+-
- AUTHOR
+-
- SEE ALSO
++
- SYNOPSIS
++- DESCRIPTION
++- OPTIONS
++- EXAMPLES
++- NOTES
++- HISTORY
++- AUTHOR
++- SEE ALSO
+
+
+
+diff -urNp a/userguide/pbmtog3.html b/userguide/pbmtog3.html
+--- a/userguide/pbmtog3.html 2025-02-04 10:47:27.827451549 +0100
++++ b/userguide/pbmtog3.html 2025-02-04 18:10:55.328259786 +0100
@@ -80,7 +80,7 @@ You cannot specify both.
HISTORY
@@ -515,8 +684,8 @@ diff -urNp a/userguide/pbmtog3.html b/userguide/pbmtog3.html
and then modified extensively by others.
diff -urNp a/userguide/ppmtogif.html b/userguide/ppmtogif.html
---- a/userguide/ppmtogif.html 2022-01-03 16:56:37.733614257 +0100
-+++ b/userguide/ppmtogif.html 2022-01-03 16:58:29.895416049 +0100
+--- a/userguide/ppmtogif.html 2025-02-04 10:47:27.828451545 +0100
++++ b/userguide/ppmtogif.html 2025-02-04 18:12:39.950710820 +0100
@@ -5,17 +5,17 @@
NAME
diff --git a/netpbm-ppmfadeusage.patch b/netpbm-ppmfadeusage.patch
index d48f5f5..2943ddb 100644
--- a/netpbm-ppmfadeusage.patch
+++ b/netpbm-ppmfadeusage.patch
@@ -1,57 +1,62 @@
-diff -urNp old/editor/ppmfade new/editor/ppmfade
---- old/editor/ppmfade 2017-11-01 11:47:49.869611402 +0100
-+++ new/editor/ppmfade 2017-11-01 11:53:25.524973342 +0100
-@@ -84,7 +84,7 @@ for ($n = 0; $n < @ARGV; $n++) {
- if (-e $first_file) {
+diff -urNp a/editor/ppmfade b/editor/ppmfade
+--- a/editor/ppmfade 2025-02-04 10:47:27.812451607 +0100
++++ b/editor/ppmfade 2025-02-04 10:52:14.233336029 +0100
+@@ -99,6 +99,9 @@ sub commandLineArgs() {
+ $mode = 'BLOCK';
+ } elsif ($arg eq "-mix") {
+ $mode = 'MIX';
++ } elsif ($arg eq "-help" || $arg eq "--help" || $arg eq "-h") {
++ print STDERR ("ppmfade: Use 'man ppmfade' for help.\n");
++ exit 1;
} else {
- print "I can't find first file '$first_file'\n";
-- exit 20;
+ if (substr($arg, 0, 1) eq '-') {
+ print STDERR ("Unknown option '$arg'. " .
+@@ -109,13 +112,13 @@ sub commandLineArgs() {
+ print STDERR ("There are no non-option arguments possible. " .
+ "You specified '$arg'\n");
+ }
+- exit 100;
+ exit 1;
}
- } elsif ($ARGV[$n] eq "-l") {
- $n++;
-@@ -92,7 +92,7 @@ for ($n = 0; $n < @ARGV; $n++) {
- if (-e $last_file) {
+ }
+
+ if (!defined($firstFileNm) && !defined($lastFileNm)) {
+ print STDERR ("You must specify -f or -l (or both)\n");
+- exit 90;
++ exit 1
+ }
+
+ if (!defined($mode)) {
+@@ -142,7 +145,7 @@ sub imageDimensions($$) {
} else {
- print "I can't find last file '$last_file'\n";
-- exit 20;
-+ exit 1;
+ print STDERR
+ ("Unrecognized results from pnmfile on $firstFileNm.\n");
+- exit(50);
++ exit(1);
}
- } elsif ($ARGV[$n] eq "-base") {
- $n++;
-@@ -113,9 +113,12 @@ for ($n = 0; $n < @ARGV; $n++) {
- $mode = $BLOCK;
- } elsif ("$ARGV[$n]" eq "-mix") {
- $mode = $MIX;
-+ } elsif ($ARGV[$n] eq "-help" || $ARGV[$n] eq "--help" || $ARGV[$n] eq "-h") {
-+ print "ppmfade: Use 'man ppmfade' for help.\n";
-+ exit 1;
} else {
- print "Unknown argument: $ARGV[$n]\n";
-- exit 100;
-+ exit 1;
- }
- }
- #
-@@ -134,18 +137,18 @@ if ($first_file ne "undefined") {
- $width = $1; $height = $2;
- } else {
- print("Unrecognized results from pnmfile on $first_file.\n");
-- exit(50);
-+ exit 1;
+ # $lastFileNm is defined
+@@ -151,7 +154,7 @@ sub imageDimensions($$) {
+ } else {
+ print STDERR
+ ("Unrecognized results from pnmfile on $firstFileNm.\n");
+- exit(50);
++ exit(1);
+ }
}
- } elsif ($last_file ne "undefined") {
- if ((`pnmfile $last_file` =~ m{\b(\d+)\sby\s(\d+)} )) {
- $width = $1; $height = $2;
- } else {
- print("Unrecognized results from pnmfile on $first_file.\n");
-- exit(50);
-+ exit 1;
- }
- } else {
- print("ppmfade: You must specify -f or -l (or both)\n");
-- exit(90);
+ return $width, $height;
+@@ -436,12 +439,12 @@ my ($mode, $firstFileNm, $lastFileNm, $b
+
+ if (defined($firstFileNm) && !-e($firstFileNm)) {
+ print STDERR ("First file '$firstFileNm' does not exist\n");
+- exit 20;
+ exit 1;
}
- print("Frames are " . $width . "W x " . $height . "H\n");
+ if (defined($lastFileNm) && !-e($lastFileNm)) {
+ print STDERR ("Last file '$lastFileNm' does not exist\n");
+- exit 20;
++ exit 1;
+ }
+
+ my ($width, $height) = imageDimensions($firstFileNm, $lastFileNm);
diff --git a/netpbm-security-code.patch b/netpbm-security-code.patch
index 75c66e5..4de690d 100644
--- a/netpbm-security-code.patch
+++ b/netpbm-security-code.patch
@@ -1,45 +1,49 @@
-diff -ruNp a/analyzer/pgmtexture.c b/analyzer/pgmtexture.c
---- a/analyzer/pgmtexture.c 2021-06-02 15:53:59.866205957 +0200
-+++ b/analyzer/pgmtexture.c 2021-06-02 16:13:04.906252648 +0200
-@@ -54,6 +54,7 @@ vector(unsigned int const nl,
+diff -urNp a/analyzer/pgmtexture.c b/analyzer/pgmtexture.c
+--- a/analyzer/pgmtexture.c 2025-02-03 09:24:28.362500390 +0100
++++ b/analyzer/pgmtexture.c 2025-02-03 09:27:57.991369817 +0100
+@@ -97,6 +97,8 @@ vector(unsigned int const nl,
- assert(nh >= nl);
+ assert(nh >= nl); assert(nh <= UINT_MAX-1);
+ overflow_add(nh - nl, 1);
++
MALLOCARRAY(v, (unsigned) (nh - nl + 1));
if (v == NULL)
-@@ -85,6 +86,7 @@ matrix (unsigned int const nrl,
- assert(nrh >= nrl);
+@@ -133,6 +135,8 @@ matrix (unsigned int const nrl,
+
+ assert(nrh >= nrl); assert(nrh <= UINT_MAX-1);
- /* allocate pointers to rows */
+ overflow_add(nrh - nrl, 1);
- MALLOCARRAY(m, (unsigned) (nrh - nrl + 1));
- if (m == NULL)
- pm_error("Unable to allocate memory for a matrix.");
-@@ -93,6 +95,7 @@ matrix (unsigned int const nrl,
++
+ /* allocate pointers to rows */
+ MALLOCARRAY(matrix, (unsigned) (nrh - nrl + 1));
+ if (matrix == NULL)
+@@ -142,6 +146,8 @@ matrix (unsigned int const nrl,
- assert (nch >= ncl);
+ assert (nch >= ncl); assert(nch <= UINT_MAX-1);
+ overflow_add(nch - ncl, 1);
++
/* allocate rows and set pointers to them */
for (i = nrl; i <= nrh; ++i) {
- MALLOCARRAY(m[i], (unsigned) (nch - ncl + 1));
-diff -ruNp a/converter/other/gemtopnm.c b/converter/other/gemtopnm.c
---- a/converter/other/gemtopnm.c 2021-06-02 15:53:59.835205659 +0200
-+++ b/converter/other/gemtopnm.c 2021-06-02 16:15:29.598641385 +0200
-@@ -106,6 +106,7 @@ main(argc, argv)
+ MALLOCARRAY(matrix[i], (unsigned) (nch - ncl + 1));
+diff -urNp a/converter/other/gemtopnm.c b/converter/other/gemtopnm.c
+--- a/converter/other/gemtopnm.c 2025-02-03 09:24:28.345500482 +0100
++++ b/converter/other/gemtopnm.c 2025-02-03 09:28:49.455092222 +0100
+@@ -153,6 +153,8 @@ main(int argc, const char ** argv) {
- pnm_writepnminit( stdout, cols, rows, MAXVAL, type, 0 );
+ pnm_writepnminit(stdout, cols, rows, MAXVAL, type, 0);
+ overflow_add(cols, padright);
++
{
/* allocate input row data structure */
- int plane;
-diff -ruNp a/converter/other/jpegtopnm.c b/converter/other/jpegtopnm.c
---- a/converter/other/jpegtopnm.c 2021-06-02 15:53:59.833205640 +0200
-+++ b/converter/other/jpegtopnm.c 2021-06-02 16:16:28.520206914 +0200
-@@ -862,6 +862,8 @@ convertImage(FILE *
+ unsigned int plane;
+diff -urNp a/converter/other/jpegtopnm.c b/converter/other/jpegtopnm.c
+--- a/converter/other/jpegtopnm.c 2025-02-03 09:24:28.346500477 +0100
++++ b/converter/other/jpegtopnm.c 2025-02-03 09:29:57.845723398 +0100
+@@ -894,6 +894,8 @@ convertImage(FILE *
/* Calculate output image dimensions so we can allocate space */
jpeg_calc_output_dimensions(cinfoP);
@@ -48,21 +52,21 @@ diff -ruNp a/converter/other/jpegtopnm.c b/converter/other/jpegtopnm.c
/* Start decompressor */
jpeg_start_decompress(cinfoP);
-diff -ruNp a/converter/other/pbmtopgm.c b/converter/other/pbmtopgm.c
---- a/converter/other/pbmtopgm.c 2021-06-02 15:53:59.831205621 +0200
-+++ b/converter/other/pbmtopgm.c 2021-06-02 16:17:14.248645808 +0200
-@@ -60,6 +60,7 @@ main(int argc, char *argv[]) {
-
+diff -urNp a/converter/other/pbmtopgm.c b/converter/other/pbmtopgm.c
+--- a/converter/other/pbmtopgm.c 2025-02-03 09:24:28.346500477 +0100
++++ b/converter/other/pbmtopgm.c 2025-02-03 09:32:07.478024266 +0100
+@@ -88,6 +88,7 @@ main(int argc, const char ** argv) {
+ up = cmdline.convRows / 2; down = cmdline.convRows - up;
outrow = pgm_allocrow(cols) ;
-+ overflow2(width, height);
- maxval = MIN(PGM_OVERALLMAXVAL, width*height);
++ overflow2(cmdline.convCols, cmdline.convRows);
+ maxval = MIN(PGM_OVERALLMAXVAL, cmdline.convCols * cmdline.convRows);
pgm_writepgminit(stdout, cols, rows, maxval, 0) ;
-diff -ruNp a/converter/other/pnmtoddif.c b/converter/other/pnmtoddif.c
---- a/converter/other/pnmtoddif.c 2021-06-02 15:53:59.832205630 +0200
-+++ b/converter/other/pnmtoddif.c 2021-06-02 16:18:17.064248709 +0200
-@@ -629,6 +629,7 @@ main(int argc, char *argv[]) {
+diff -urNp a/converter/other/pnmtoddif.c b/converter/other/pnmtoddif.c
+--- a/converter/other/pnmtoddif.c 2025-02-03 09:24:28.346500477 +0100
++++ b/converter/other/pnmtoddif.c 2025-02-03 09:33:21.228626549 +0100
+@@ -627,6 +627,7 @@ main(int argc, char *argv[]) {
switch (PNM_FORMAT_TYPE(format)) {
case PBM_TYPE:
ip.bits_per_pixel = 1;
@@ -70,7 +74,7 @@ diff -ruNp a/converter/other/pnmtoddif.c b/converter/other/pnmtoddif.c
ip.bytes_per_line = (cols + 7) / 8;
ip.spectral = 2;
ip.components = 1;
-@@ -644,6 +645,7 @@ main(int argc, char *argv[]) {
+@@ -642,6 +643,7 @@ main(int argc, char *argv[]) {
ip.polarity = 2;
break;
case PPM_TYPE:
@@ -78,146 +82,100 @@ diff -ruNp a/converter/other/pnmtoddif.c b/converter/other/pnmtoddif.c
ip.bytes_per_line = 3 * cols;
ip.bits_per_pixel = 24;
ip.spectral = 5;
-diff -ruNp a/converter/other/pnmtojpeg.c b/converter/other/pnmtojpeg.c
---- a/converter/other/pnmtojpeg.c 2021-06-02 15:53:59.835205659 +0200
-+++ b/converter/other/pnmtojpeg.c 2021-06-02 19:57:44.413225834 +0200
-@@ -606,7 +606,11 @@ read_scan_script(j_compress_ptr const ci
- want JPOOL_PERMANENT.
- */
- const unsigned int scan_info_size = nscans * sizeof(jpeg_scan_info);
-- jpeg_scan_info * const scan_info =
-+ const jpeg_scan_info * scan_info;
-+
-+ overflow2(nscans, sizeof(jpeg_scan_info));
-+
-+ scan_info =
- (jpeg_scan_info *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- scan_info_size);
-@@ -938,6 +942,9 @@ compute_rescaling_array(JSAMPLE ** const
- const long half_maxval = maxval / 2;
- long val;
+diff -urNp a/converter/other/pnmtops.c b/converter/other/pnmtops.c
+--- a/converter/other/pnmtops.c 2025-02-03 09:24:28.345500482 +0100
++++ b/converter/other/pnmtops.c 2025-02-03 09:42:01.586878661 +0100
+@@ -298,17 +298,21 @@ parseCommandLine(int argc, const char **
+ validateCompDimension(width, psScaleFactor, "-width value");
+ validateCompDimension(height, psScaleFactor, "-height value");
-+ overflow_add(maxval, 1);
-+ overflow2(maxval+1, sizeof(JSAMPLE));
-+
- *rescale_p = (JSAMPLE *)
- (cinfo.mem->alloc_small) ((j_common_ptr) &cinfo, JPOOL_IMAGE,
- (size_t) (((long) maxval + 1L) *
-@@ -1016,6 +1023,7 @@ convert_scanlines(struct jpeg_compress_s
- */
-
- /* Allocate the libpnm output and compressor input buffers */
-+ overflow2(cinfo_p->image_width, cinfo_p->input_components);
- buffer = (*cinfo_p->mem->alloc_sarray)
- ((j_common_ptr) cinfo_p, JPOOL_IMAGE,
- (unsigned int) cinfo_p->image_width * cinfo_p->input_components,
-diff -ruNp a/converter/other/pnmtops.c b/converter/other/pnmtops.c
---- a/converter/other/pnmtops.c 2021-06-02 15:53:59.835205659 +0200
-+++ b/converter/other/pnmtops.c 2021-06-02 20:02:06.055502227 +0200
-@@ -294,17 +294,21 @@ parseCommandLine(int argc, const char **
- validateCompDimension(width, 72, "-width value");
- validateCompDimension(height, 72, "-height value");
-
-+ overflow2(width, 72);
- cmdlineP->width = width * 72;
-+ overflow2(height, 72);
- cmdlineP->height = height * 72;
++ overflow2(width, psScaleFactor);
+ cmdlineP->width = width * psScaleFactor;
++ overflow2(height, psScaleFactor);
+ cmdlineP->height = height * psScaleFactor;
if (imagewidthSpec) {
- validateCompDimension(imagewidth, 72, "-imagewidth value");
-+ overflow2(imagewidth, 72);
- cmdlineP->imagewidth = imagewidth * 72;
+ validateCompDimension(imagewidth, psScaleFactor, "-imagewidth value");
++ overflow2(imagewidth, psScaleFactor);
+ cmdlineP->imagewidth = imagewidth * psScaleFactor;
}
else
cmdlineP->imagewidth = 0;
if (imageheightSpec) {
-- validateCompDimension(imagewidth, 72, "-imageheight value");
-+ validateCompDimension(imageheight, 72, "-imageheight value");
-+ overflow2(imageheight, 72);
- cmdlineP->imageheight = imageheight * 72;
+- validateCompDimension(imagewidth, psScaleFactor, "-imageheight value");
++ validateCompDimension(imageheight, psScaleFactor, "-imageheight value");
++ overflow2(imageheight, psScaleFactor);
+ cmdlineP->imageheight = imageheight * psScaleFactor;
}
else
-diff -ruNp a/converter/other/rletopnm.c b/converter/other/rletopnm.c
---- a/converter/other/rletopnm.c 2021-06-02 15:53:59.834205650 +0200
-+++ b/converter/other/rletopnm.c 2021-06-02 20:03:24.864187893 +0200
-@@ -19,6 +19,8 @@
- * If you modify this software, you should include a notice giving the
- * name of the person performing the modification, the date of modification,
- * and the reason for such modification.
-+ *
-+ * 2002-12-19: Fix maths wrapping bugs. Alan Cox
- */
- /*
- * rletopnm - A conversion program to convert from Utah's "rle" image format
-diff -ruNp a/converter/other/sirtopnm.c b/converter/other/sirtopnm.c
---- a/converter/other/sirtopnm.c 2021-06-02 15:53:59.833205640 +0200
-+++ b/converter/other/sirtopnm.c 2021-06-02 20:03:50.280409024 +0200
-@@ -69,6 +69,7 @@ char* argv[];
- }
- break;
- case PPM_TYPE:
-+ overflow3(cols, rows, 3);
- picsize = cols * rows * 3;
- planesize = cols * rows;
- if ( !( sirarray = (unsigned char*) malloc( picsize ) ) )
-diff -ruNp a/converter/other/tifftopnm.c b/converter/other/tifftopnm.c
---- a/converter/other/tifftopnm.c 2021-06-02 15:53:59.834205650 +0200
-+++ b/converter/other/tifftopnm.c 2021-06-02 20:04:47.721908789 +0200
-@@ -1372,7 +1372,9 @@ convertRasterByRows(pnmOut * const
- if (scanbuf == NULL)
- pm_error("can't allocate memory for scanline buffer");
+diff -urNp a/converter/other/sirtopnm.c b/converter/other/sirtopnm.c
+--- a/converter/other/sirtopnm.c 2025-02-03 09:24:28.347500471 +0100
++++ b/converter/other/sirtopnm.c 2025-02-03 09:44:25.547151413 +0100
+@@ -84,6 +84,7 @@ convertPpm(FILE * const ifP,
+ unsigned int const cols,
+ xel * const xelrow) {
++ overflow3(cols, rows, 3);
+ unsigned int const picsize = cols * rows * 3;
+ unsigned int const planesize = cols * rows;
+
+diff -urNp a/converter/other/tifftopnm.c b/converter/other/tifftopnm.c
+--- a/converter/other/tifftopnm.c 2025-02-03 09:24:28.345500482 +0100
++++ b/converter/other/tifftopnm.c 2025-02-03 09:46:55.210395347 +0100
+@@ -1358,7 +1358,8 @@ convertRasterByRows(pnmOut * const
+ if (UINT_MAX/cols < spp)
+ pm_error("Image is too wide/deep (%u x %u) for computations",
+ cols, spp);
- MALLOCARRAY(samplebuf, cols * spp);
+ /* samplebuf is unsigned int * !!! */
-+ samplebuf = (unsigned int *) malloc3(cols , sizeof(unsigned int) , spp);
-+
++ samplebuf = (unsigned int *) malloc3(cols, sizeof(unsigned int), spp);
if (samplebuf == NULL)
pm_error("can't allocate memory for row buffer");
-diff -ruNp a/converter/other/xwdtopnm.c b/converter/other/xwdtopnm.c
---- a/converter/other/xwdtopnm.c 2021-06-02 15:53:59.833205640 +0200
-+++ b/converter/other/xwdtopnm.c 2021-06-02 20:23:21.807634239 +0200
-@@ -210,6 +210,10 @@ processX10Header(X10WDFileHeader * cons
- *colorsP = pnm_allocrow(2);
- PNM_ASSIGN1((*colorsP)[0], 0);
- PNM_ASSIGN1((*colorsP)[1], *maxvalP);
+diff -urNp a/converter/other/xwdtopnm.c b/converter/other/xwdtopnm.c
+--- a/converter/other/xwdtopnm.c 2025-02-03 09:24:28.345500482 +0100
++++ b/converter/other/xwdtopnm.c 2025-02-03 09:55:18.695851996 +0100
+@@ -243,6 +243,10 @@ processX10Header(X10WDFileHeader * cons
+ *colorsP = pnm_allocrow(*maxvalP + 1);
+ for (i = 0; i <= *maxvalP; ++i)
+ PNM_ASSIGN1((*colorsP)[i], i);
+ overflow_add(h10P->pixmap_width, 15);
+ if(h10P->pixmap_width < 0)
+ pm_error("assert: negative width");
+ overflow2((((h10P->pixmap_width + 15) / 16) * 16 - h10P->pixmap_width), 8);
*padrightP =
(((h10P->pixmap_width + 15) / 16) * 16 - h10P->pixmap_width) * 8;
- *bits_per_itemP = 16;
-@@ -635,6 +639,7 @@ processX11Header(X11WDFileHeader * cons
-
- *colsP = h11FixedP->pixmap_width;
- *rowsP = h11FixedP->pixmap_height;
+ *bitsPerItemP = 16;
+@@ -671,6 +675,7 @@ processX11Header(const X11WDFileHeader *
+ "%u bits per pixel, which is too many for this program "
+ "to compute",
+ h11FixedP->pixmap_width, h11FixedP->bits_per_pixel);
+ overflow2(h11FixedP->bytes_per_line, 8);
*padrightP =
h11FixedP->bytes_per_line * 8 -
h11FixedP->pixmap_width * h11FixedP->bits_per_pixel;
-diff -ruNp a/converter/pbm/mdatopbm.c b/converter/pbm/mdatopbm.c
---- a/converter/pbm/mdatopbm.c 2021-06-02 15:53:59.826205573 +0200
-+++ b/converter/pbm/mdatopbm.c 2021-06-02 20:23:21.807634239 +0200
-@@ -245,10 +245,13 @@ main(int argc, char **argv) {
- pm_readlittleshort(infile, &yy); nInCols = yy;
+diff -urNp a/converter/pbm/mdatopbm.c b/converter/pbm/mdatopbm.c
+--- a/converter/pbm/mdatopbm.c 2025-02-03 09:24:28.358500411 +0100
++++ b/converter/pbm/mdatopbm.c 2025-02-03 09:57:03.495422912 +0100
+@@ -283,11 +283,13 @@ main(int argc, const char **argv) {
+ pm_readlittleshort(ifP, &yy); nInCols = yy;
}
-
+
+ overflow2(nOutCols, 8);
nOutCols = 8 * nInCols;
nOutRows = nInRows;
-- if (bScale)
+- if (bScale)
+ if (bScale) {
+ overflow2(nOutRows, 2);
nOutRows *= 2;
+-
+ }
-
data = pbm_allocarray(nOutCols, nOutRows);
-
-diff -ruNp a/converter/pbm/mgrtopbm.c b/converter/pbm/mgrtopbm.c
---- a/converter/pbm/mgrtopbm.c 2022-01-03 16:41:24.856969944 +0100
-+++ b/converter/pbm/mgrtopbm.c 2022-01-03 16:43:27.023842152 +0100
+
+ MALLOCARRAY_NOFAIL(mdrow, nInCols);
+diff -urNp a/converter/pbm/mgrtopbm.c b/converter/pbm/mgrtopbm.c
+--- a/converter/pbm/mgrtopbm.c 2025-02-03 09:24:28.358500411 +0100
++++ b/converter/pbm/mgrtopbm.c 2025-02-03 09:58:19.232265999 +0100
@@ -105,6 +105,8 @@ readMgrHeader(FILE * const ifP,
interpHdrWidth (head, colsP);
interpHdrHeight(head, rowsP);
@@ -227,31 +185,9 @@ diff -ruNp a/converter/pbm/mgrtopbm.c b/converter/pbm/mgrtopbm.c
*padrightP = ((*colsP + pad - 1) / pad) * pad - *colsP;
}
-diff --git a/converter/pbm/pbmto4425.c b/converter/pbm/pbmto4425.c
-index 1d97ac6..c4c8cbb 100644
---- a/converter/pbm/pbmto4425.c
-+++ b/converter/pbm/pbmto4425.c
-@@ -2,6 +2,7 @@
-
- #include "nstring.h"
- #include "pbm.h"
-+#include
-
- static char bit_table[2][3] = {
- {1, 4, 0x10},
-@@ -160,7 +161,7 @@ main(int argc, char * argv[]) {
- xres = vmap_width * 2;
- yres = vmap_height * 3;
-
-- vmap = malloc(vmap_width * vmap_height * sizeof(char));
-+ vmap = malloc3(vmap_width, vmap_height, sizeof(char));
- if(vmap == NULL)
- {
- pm_error( "Cannot allocate memory" );
-diff --git a/converter/pbm/pbmtogem.c b/converter/pbm/pbmtogem.c
-index 4fd30e9..c82757d 100644
---- a/converter/pbm/pbmtogem.c
-+++ b/converter/pbm/pbmtogem.c
+diff -urNp a/converter/pbm/pbmtogem.c b/converter/pbm/pbmtogem.c
+--- a/converter/pbm/pbmtogem.c 2025-02-03 09:24:28.358500411 +0100
++++ b/converter/pbm/pbmtogem.c 2025-02-03 10:25:34.259707343 +0100
@@ -79,6 +79,7 @@ putinit (int const rows, int const cols)
bitsperitem = 0;
bitshift = 7;
@@ -260,9 +196,9 @@ index 4fd30e9..c82757d 100644
outmax = (cols + 7) / 8;
outrow = (unsigned char *) pm_allocrow (outmax, sizeof (unsigned char));
lastrow = (unsigned char *) pm_allocrow (outmax, sizeof (unsigned char));
-diff -ruNp a/converter/pbm/pbmtogo.c b/converter/pbm/pbmtogo.c
---- a/converter/pbm/pbmtogo.c 2021-06-02 15:53:59.826205573 +0200
-+++ b/converter/pbm/pbmtogo.c 2021-06-02 20:23:21.809634256 +0200
+diff -urNp a/converter/pbm/pbmtogo.c b/converter/pbm/pbmtogo.c
+--- a/converter/pbm/pbmtogo.c 2025-02-03 09:24:28.359500407 +0100
++++ b/converter/pbm/pbmtogo.c 2025-02-03 10:26:22.723447123 +0100
@@ -158,6 +158,7 @@ main(int argc,
bitrow = pbm_allocrow(cols);
@@ -271,14 +207,14 @@ diff -ruNp a/converter/pbm/pbmtogo.c b/converter/pbm/pbmtogo.c
rucols = ( cols + 7 ) / 8;
bytesperrow = rucols; /* GraphOn uses bytes */
rucols = rucols * 8;
-diff -ruNp a/converter/pbm/pbmtolj.c b/converter/pbm/pbmtolj.c
---- a/converter/pbm/pbmtolj.c 2021-06-02 15:53:59.828205592 +0200
-+++ b/converter/pbm/pbmtolj.c 2021-06-02 20:23:21.810634265 +0200
-@@ -120,7 +120,11 @@ parseCommandLine(int argc, char ** argv,
+diff -urNp a/converter/pbm/pbmtolj.c b/converter/pbm/pbmtolj.c
+--- a/converter/pbm/pbmtolj.c 2025-02-03 09:24:28.357500417 +0100
++++ b/converter/pbm/pbmtolj.c 2025-02-03 10:29:37.442401385 +0100
+@@ -120,7 +120,11 @@ parseCommandLine(int argc, const char **
static void
allocateBuffers(unsigned int const cols) {
-+ overflow_add(cols, 8);
++ overflow_add(cols, 7);
rowBufferSize = (cols + 7) / 8;
+ overflow_add(rowBufferSize, 128);
+ overflow_add(rowBufferSize, rowBufferSize+128);
@@ -286,420 +222,162 @@ diff -ruNp a/converter/pbm/pbmtolj.c b/converter/pbm/pbmtolj.c
packBufferSize = rowBufferSize + (rowBufferSize + 127) / 128 + 1;
deltaBufferSize = rowBufferSize + rowBufferSize / 8 + 10;
-diff -ruNp a/converter/pbm/pbmtomda.c b/converter/pbm/pbmtomda.c
---- a/converter/pbm/pbmtomda.c 2021-06-02 15:53:59.827205582 +0200
-+++ b/converter/pbm/pbmtomda.c 2021-06-02 20:23:21.810634265 +0200
-@@ -179,6 +179,7 @@ int main(int argc, char **argv)
-
- nOutRowsUnrounded = bScale ? nInRows/2 : nInRows;
+diff -urNp a/converter/pbm/pbmtomda.c b/converter/pbm/pbmtomda.c
+--- a/converter/pbm/pbmtomda.c 2025-02-03 09:24:28.357500417 +0100
++++ b/converter/pbm/pbmtomda.c 2025-02-03 10:31:40.714199457 +0100
+@@ -204,6 +204,7 @@ main(int argc, const char ** argv) {
+
+ nOutRowsUnrounded = cmdline.dscale ? nInRows/2 : nInRows;
+ overflow_add(nOutRowsUnrounded, 3);
nOutRows = ((nOutRowsUnrounded + 3) / 4) * 4;
- /* MDA wants rows a multiple of 4 */
+ /* MDA wants rows a multiple of 4 */
nOutCols = nInCols / 8;
-diff -ruNp a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
---- a/converter/pbm/pbmtoppa/pbm.c 2021-06-02 15:53:59.830205611 +0200
-+++ b/converter/pbm/pbmtoppa/pbm.c 2021-06-02 20:23:21.811634274 +0200
-@@ -11,185 +11,128 @@
- #include
- #include
- #include
--#include
+diff -urNp a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
+--- a/converter/pbm/pbmtoppa/pbm.c 2025-02-03 09:24:28.356500423 +0100
++++ b/converter/pbm/pbmtoppa/pbm.c 2025-02-03 10:48:49.928347495 +0100
+@@ -157,6 +157,7 @@ pbm_readline(pbm_stat * const pbmSt
+ break;
+ case P4: {
+ int tmp, tmp2;
++ overflow_add(pbm->width, 7);
+ tmp = (pbmStatP->width+7)/8;
+ tmp2 = fread(data,1,tmp,pbmStatP->fptr);
+ if (tmp2 == tmp) {
+@@ -189,6 +190,7 @@ pbm_unreadline(pbm_stat * const pbmStatP
--#include "pm.h"
--#include "nstring.h"
- #include "ppapbm.h"
-
--int
--make_pbm_stat(pbm_stat * const pbmStatP,
-- FILE * const ifP) {
--
-- char line[1024];
-- char * rc;
-- int retval;
--
-- pbmStatP->fptr = ifP;
-- pbmStatP->version = none;
-- pbmStatP->current_line = 0;
-- pbmStatP->unread = 0;
--
-- rc = fgets(line, 1024, ifP);
-- if (rc == NULL)
-- retval = 0;
-- else {
-- line[strlen(line)-1] = 0;
--
-- if (streq(line,"P1"))
-- pbmStatP->version=P1;
-- if (streq(line,"P4"))
-- pbmStatP->version=P4;
--
-- if (pbmStatP->version == none) {
-- pm_message("unknown PBM magic '%s'", line);
-- retval = 0;
-- } else {
-- do {
-- char * rc;
-- rc = fgets(line, 1024, ifP);
-- if (rc == NULL)
-- return 0;
-- } while (line[0] == '#');
-- {
-- int rc;
-- rc = sscanf(line, "%d %d",
-- &pbmStatP->width, &pbmStatP->height);
-- if (rc != 2)
-- retval = 0;
-- else {
-- if (pbmStatP->width < 0) {
-- pm_message("Image has negative width");
-- retval = 0;
-- } else if (pbmStatP->width > INT_MAX/2) {
-- pm_message("Uncomputeably large width: %d",
-- pbmStatP->width);
-- retval = 0;
-- } else if (pbmStatP->height < 0) {
-- pm_message("Image has negative height");
-- retval = 0;
-- } else if (pbmStatP->height > INT_MAX/2) {
-- pm_message("Uncomputeably large height: %d",
-- pbmStatP->height);
-- retval = 0;
-- } else
-- retval = 1;
-- }
-- }
-- }
-- }
-- return retval;
--}
-+int make_pbm_stat(pbm_stat* pbm,FILE* fptr)
-+{
-+ char line[1024];
-
-+ pbm->fptr=fptr;
-+ pbm->version=none;
-+ pbm->current_line=0;
-+ pbm->unread = 0;
-
-+ if (fgets (line, 1024, fptr) == NULL)
-+ return 0;
-+ line[strlen(line)-1] = 0;
-
--static int
--getbytes(FILE * const ifP,
-- unsigned int const width,
-- unsigned char * const data) {
--
-- unsigned char mask;
-- unsigned char acc;
-- unsigned char * place;
-- unsigned int num;
-- int retval;
--
-- if (width == 0)
-- retval = 0;
-- else {
-- for (mask = 0x80, acc = 0, num = 0, place = data; num < width; ) {
-- switch (getc(ifP)) {
-- case EOF:
-- return 0;
-- case '1':
-- acc |= mask;
-- /* fall through */
-- case '0':
-- mask >>= 1;
-- ++num;
-- if (mask == 0x00) { /* if (num % 8 == 0) */
-- *place++ = acc;
-- acc = 0;
-- mask = 0x80;
-- }
-- }
-- }
-- if (width % 8 != 0)
-- *place = acc;
--
-- retval = 1;
-- }
-- return retval;
--}
-+ if(!strcmp(line,"P1")) pbm->version=P1;
-+ if(!strcmp(line,"P4")) pbm->version=P4;
-+ if(pbm->version == none)
-+ {
-+ fprintf(stderr,"pbm_readheader(): unknown PBM magic '%s'\n",line);
-+ return 0;
-+ }
-
-+ do
-+ if (fgets (line, 1024, fptr) == NULL)
-+ return 0;
-+ while (line[0] == '#');
-
-+ if (2 != sscanf (line, "%d %d", &pbm->width, &pbm->height))
-+ return 0;
-
--int
--pbm_readline(pbm_stat * const pbmStatP,
-- unsigned char * const data) {
--/*----------------------------------------------------------------------------
-- Read a single line into data which must be at least (pbmStatP->width+7)/8
-- bytes of storage.
-------------------------------------------------------------------------------*/
-- int retval;
--
-- if (pbmStatP->current_line >= pbmStatP->height)
-- retval = 0;
-- else {
-- if (pbmStatP->unread) {
-- memcpy(data, pbmStatP->revdata, (pbmStatP->width+7)/8);
-- ++pbmStatP->current_line;
-- pbmStatP->unread = 0;
-- free(pbmStatP->revdata);
-- pbmStatP->revdata = NULL;
-- retval = 1;
-- } else {
-- switch (pbmStatP->version) {
-- case P1:
-- if (getbytes(pbmStatP->fptr, pbmStatP->width, data)) {
-- pbmStatP->current_line++;
-- retval = 1;
-- } else
-- retval = 0;
-- break;
-- case P4: {
-- int tmp, tmp2;
-- tmp = (pbmStatP->width+7)/8;
-- tmp2 = fread(data,1,tmp,pbmStatP->fptr);
-- if (tmp2 == tmp) {
-- ++pbmStatP->current_line;
-- retval = 1;
-- } else {
-- pm_message("error reading line data (%d)", tmp2);
-- retval = 0;
-- }
-- } break;
--
-- default:
-- pm_message("unknown PBM version");
-- retval = 0;
-- }
-- }
-- }
-- return retval;
-+ return 1;
- }
-
-+static int getbytes(FILE *fptr,int width,unsigned char* data)
-+{
-+ unsigned char mask,acc,*place;
-+ int num;
-+
-+ if(!width) return 0;
-+ for(mask=0x80, acc=0, num=0, place=data; num>=1;
-+ num++;
-+ if(!mask) /* if(num%8 == 0) */
-+ {
-+ *place++ = acc;
-+ acc=0;
-+ mask=0x80;
-+ }
-+ }
-+ }
-+ if(width%8)
-+ *place=acc;
-+ return 1;
-+}
-
-+/* Reads a single line into data which must be at least (pbm->width+7)/8
-+ bytes of storage */
-+int pbm_readline(pbm_stat* pbm,unsigned char* data)
-+{
-+ int tmp,tmp2;
-+
-+ if(pbm->current_line >= pbm->height) return 0;
-+
-+ if (pbm->unread)
-+ {
-+ memcpy (data, pbm->revdata, (pbm->width+7)/8);
-+ pbm->current_line++;
-+ pbm->unread = 0;
-+ free (pbm->revdata);
-+ pbm->revdata = NULL;
-+ return 1;
-+ }
-
--void
--pbm_unreadline(pbm_stat * const pbmStatP,
-- void * const data) {
--/*----------------------------------------------------------------------------
-- Push a line back into the buffer; we read too much!
-------------------------------------------------------------------------------*/
-- /* can store only one line in the unread buffer */
--
-- if (!pbmStatP->unread) {
-- pbmStatP->unread = 1;
-- pbmStatP->revdata = malloc ((pbmStatP->width+7)/8);
-- memcpy(pbmStatP->revdata, data, (pbmStatP->width+7)/8);
-- --pbmStatP->current_line;
-+ switch(pbm->version)
-+ {
-+ case P1:
-+ if(getbytes(pbm->fptr,pbm->width,data))
-+ {
-+ pbm->current_line++;
-+ return 1;
- }
--}
-+ return 0;
-+
-+ case P4:
-+ overflow_add(pbm->width, 7);
-+ tmp=(pbm->width+7)/8;
-+ tmp2=fread(data,1,tmp,pbm->fptr);
-+ if(tmp2 == tmp)
-+ {
-+ pbm->current_line++;
-+ return 1;
-+ }
-+ fprintf(stderr,"pbm_readline(): error reading line data (%d)\n",tmp2);
-+ return 0;
-
-+ default:
-+ fprintf(stderr,"pbm_readline(): unknown PBM version\n");
-+ return 0;
-+ }
-+}
-
-+/* push a line back into the buffer; we read too much! */
-+void pbm_unreadline (pbm_stat *pbm, void *data)
-+{
-+ /* can only store one line in the unread buffer */
-+ if (pbm->unread)
-+ return;
-+
-+ pbm->unread = 1;
-+ overflow_add(pbm->width, 7);
-+ pbm->revdata = malloc ((pbm->width+7)/8);
-+ memcpy (pbm->revdata, data, (pbm->width+7)/8);
-+ pbm->current_line--;
-+}
-diff -ruNp a/converter/pbm/pbmtoppa/pbmtoppa.c b/converter/pbm/pbmtoppa/pbmtoppa.c
---- a/converter/pbm/pbmtoppa/pbmtoppa.c 2021-06-02 15:53:59.829205601 +0200
-+++ b/converter/pbm/pbmtoppa/pbmtoppa.c 2021-06-02 20:23:21.811634274 +0200
-@@ -453,6 +453,7 @@ main(int argc, char *argv[]) {
+ if (!pbmStatP->unread) {
+ pbmStatP->unread = 1;
++ overflow_add(pbm->width, 7);
+ pbmStatP->revdata = malloc ((pbmStatP->width+7)/8);
+ memcpy(pbmStatP->revdata, data, (pbmStatP->width+7)/8);
+ --pbmStatP->current_line;
+diff -urNp a/converter/pbm/pbmtoppa/pbmtoppa.c b/converter/pbm/pbmtoppa/pbmtoppa.c
+--- a/converter/pbm/pbmtoppa/pbmtoppa.c 2025-02-03 09:24:28.356500423 +0100
++++ b/converter/pbm/pbmtoppa/pbmtoppa.c 2025-02-03 10:49:30.440158354 +0100
+@@ -456,6 +456,7 @@ main(int argc, char *argv[]) {
pm_error("main(): unrecognized parameter '%s'", argv[argn]);
}
+ overflow_add(Width, 7);
- Pwidth=(Width+7)/8;
- printer.fptr=out;
+ Pwidth = (Width+7)/8;
+ printer.fptr = ofP;
-diff -ruNp a/converter/pbm/pbmtoxbm.c b/converter/pbm/pbmtoxbm.c
---- a/converter/pbm/pbmtoxbm.c 2021-06-02 15:53:59.829205601 +0200
-+++ b/converter/pbm/pbmtoxbm.c 2021-06-02 20:23:21.812634282 +0200
-@@ -352,6 +352,8 @@ convertRaster(FILE * const ifP,
-
- unsigned char * bitrow;
- unsigned int row;
-+
-+ overflow_add(cols, padright);
+diff -urNp a/converter/pbm/pbmtoxbm.c b/converter/pbm/pbmtoxbm.c
+--- a/converter/pbm/pbmtoxbm.c 2025-02-03 09:24:28.357500417 +0100
++++ b/converter/pbm/pbmtoxbm.c 2025-02-03 10:50:31.351873866 +0100
+@@ -370,6 +370,7 @@ convertRaster(FILE * const ifP,
putinit(xbmVersion);
-diff --git a/converter/pbm/pktopbm.c b/converter/pbm/pktopbm.c
-index 712f339..b6fcb02 100644
---- a/converter/pbm/pktopbm.c
-+++ b/converter/pbm/pktopbm.c
-@@ -280,6 +280,7 @@ main(int argc, char *argv[]) {
- if (flagbyte == 7) { /* long form preamble */
- integer packetlength = get32() ; /* character packet length */
- car = get32() ; /* character number */
-+ overflow_add(packetlength, pktopbm_pkloc);
- endofpacket = packetlength + pktopbm_pkloc;
- /* calculate end of packet */
- if ((car >= MAXPKCHAR) || !filename[car]) {
-diff -ruNp a/converter/pbm/thinkjettopbm.l b/converter/pbm/thinkjettopbm.l
---- a/converter/pbm/thinkjettopbm.l 2021-06-02 15:53:59.828205592 +0200
-+++ b/converter/pbm/thinkjettopbm.l 2021-06-02 20:23:21.813634291 +0200
-@@ -114,7 +114,9 @@ DIG [0-9]
- \033\*b{DIG}+W {
- int l;
++ overflow_add(cols, padright);
+ bitrow = pbm_allocrow_packed(cols + padright);
+
+ for (row = 0; row < rows; ++row) {
+diff -urNp a/converter/pbm/pktopbm.c b/converter/pbm/pktopbm.c
+--- a/converter/pbm/pktopbm.c 2025-02-03 09:24:28.357500417 +0100
++++ b/converter/pbm/pktopbm.c 2025-02-03 17:09:21.430572232 +0100
+@@ -454,6 +454,7 @@ readCharacterHeader(int * const
+ if (packetLength > UINT_MAX - pkLoc)
+ pm_error("Invalid character header - excessive packet length");
+
++ overflow_add(packetLength, pkLoc);
+ *endOfPacketP = packetLength + pkLoc;
+
+ *cheightP = cheight;
+diff -urNp a/converter/pbm/thinkjettopbm.l b/converter/pbm/thinkjettopbm.l
+--- a/converter/pbm/thinkjettopbm.l 2025-02-03 09:24:28.359500407 +0100
++++ b/converter/pbm/thinkjettopbm.l 2025-02-03 17:11:07.302725005 +0100
+@@ -117,6 +117,7 @@ DIG [0-9]
if (rowCount >= rowCapacity) {
-- rowCapacity += 100;
-+ overflow_add(rowCapacity, 100);
-+ rowCapacity += 100;
-+ overflow2(rowCapacity, sizeof *rows);
- rows = realloc (rows, rowCapacity * sizeof *rows);
+ if (rowCapacity > INT_MAX-100)
+ pm_error("Too many rows to count");
++ overflow_add(rowCapacity, 100);
+ rowCapacity += 100;
+ REALLOCARRAY(rows, rowCapacity);
if (rows == NULL)
- pm_error ("Out of memory.");
-@@ -226,6 +228,8 @@ yywrap (void)
+@@ -232,6 +233,7 @@ yywrap (void)
/*
* Quite simple since ThinkJet bit arrangement matches PBM
*/
-+
+ overflow2(maxRowLength, 8);
pbm_writepbminit(stdout, maxRowLength*8, rowCount, 0);
packed_bitrow = malloc(maxRowLength);
-diff -ruNp a/converter/pbm/ybmtopbm.c b/converter/pbm/ybmtopbm.c
---- a/converter/pbm/ybmtopbm.c 2022-01-03 16:41:24.857969951 +0100
-+++ b/converter/pbm/ybmtopbm.c 2022-01-03 16:42:59.671646876 +0100
-@@ -49,6 +49,8 @@ getinit(FILE * const ifP,
- *colsP = (unsigned int) cols;
- *rowsP = (unsigned int) rows;
- *depthP = 1;
+diff -urNp a/converter/pbm/ybmtopbm.c b/converter/pbm/ybmtopbm.c
+--- a/converter/pbm/ybmtopbm.c 2025-02-03 09:24:28.359500407 +0100
++++ b/converter/pbm/ybmtopbm.c 2025-02-03 17:17:57.638369880 +0100
+@@ -88,8 +88,12 @@ main(int argc, const char * argv[]) {
+
+ pbm_writepbminit(stdout, cols, rows, 0);
+
++ overflow_add(cols, 8);
+
-+ overflow_add(*colsP, 15);
- }
+ bitrow = pbm_allocrow_packed(cols + 8);
-
-diff -ruNp a/converter/pgm/lispmtopgm.c b/converter/pgm/lispmtopgm.c
---- a/converter/pgm/lispmtopgm.c 2021-06-02 15:53:59.831205621 +0200
-+++ b/converter/pgm/lispmtopgm.c 2021-06-02 20:23:21.814634300 +0200
-@@ -58,6 +58,7 @@ main( argc, argv )
- pm_error( "depth (%d bits) is too large", depth);
-
- pgm_writepgminit( stdout, cols, rows, (gray) maxval, 0 );
-+ overflow_add(cols, 7);
- grayrow = pgm_allocrow( ( cols + 7 ) / 8 * 8 );
-
- for ( row = 0; row < rows; ++row )
-@@ -102,6 +103,8 @@ getinit( file, colsP, rowsP, depthP, pad
-
- if ( *depthP == 0 )
- *depthP = 1; /* very old file */
++ overflow_add(cols, 15);
+
-+ overflow_add((int)colsP, 31);
-
- *padrightP = ( ( *colsP + 31 ) / 32 ) * 32 - *colsP;
-
-diff -ruNp a/converter/pgm/psidtopgm.c b/converter/pgm/psidtopgm.c
---- a/converter/pgm/psidtopgm.c 2021-06-02 15:53:59.830205611 +0200
-+++ b/converter/pgm/psidtopgm.c 2021-06-02 20:23:21.815634309 +0200
-@@ -78,6 +78,7 @@ main(int argc,
- pm_error("bits/sample (%d) is too large.", bitspersample);
-
- pgm_writepgminit(stdout, cols, rows, maxval, 0);
-+ overflow_add(cols, 7);
- grayrow = pgm_allocrow((cols + 7) / 8 * 8);
for (row = 0; row < rows; ++row) {
- unsigned int col;
-diff --git a/converter/ppm/Makefile b/converter/ppm/Makefile
-index 003ef8d..b97349d 100644
---- a/converter/ppm/Makefile
-+++ b/converter/ppm/Makefile
+ uint16_t * const itemrow = (uint16_t *) bitrow;
+ unsigned int const itemCt = (cols + 15) / 16;
+diff -urNp a/converter/ppm/ilbmtoppm.c b/converter/ppm/ilbmtoppm.c
+--- a/converter/ppm/ilbmtoppm.c 2025-02-03 09:24:28.330500563 +0100
++++ b/converter/ppm/ilbmtoppm.c 2025-02-03 18:06:05.606638402 +0100
+@@ -1385,6 +1385,9 @@ dcol_to_ppm(FILE * const ifP,
+ if (redmaxval != maxval || greenmaxval != maxval || bluemaxval != maxval)
+ pm_message("scaling colors to %u bits", pm_maxvaltobits(maxval));
+
++ overflow_add(redmaxval, 1);
++ overflow_add(greenmaxval, 1);
++ overflow_add(bluemaxval, 1);
+ MALLOCARRAY_NOFAIL(redtable, redmaxval + 1);
+ MALLOCARRAY_NOFAIL(greentable, greenmaxval + 1);
+ MALLOCARRAY_NOFAIL(bluetable, bluemaxval + 1);
+@@ -1875,12 +1878,14 @@ PCHG_ConvertSmall(PCHGHeader * const
+ else {
+ unsigned int const changeCt16 = *dataCursor++;
+ unsigned int const changeCt32 = *dataCursor++;
++ overflow_add(changeCt16, changeCt32);
+ unsigned int const changeCt = changeCt16 + changeCt32;
+
+ unsigned int i;
+
+ remDataSize -= 2;
+
++ overflow_add(changeCt, 1);
+ MALLOCARRAY_NOFAIL(cmapP->mp_change[row], changeCt + 1);
+ for (i = 0; i < changeCt; ++i) {
+ if (totalChangeCt >= pchgP->TotalChanges) goto fail;
+@@ -2122,6 +2127,7 @@ read_pchg(FILE * const ifP,
+ "is less than minreg (%u)",
+ PCHG.MaxReg, PCHG.MinReg);
+ else {
++ overflow_add(PCHG.MaxReg-PCHG.MinReg, 2)
+ unsigned int const nch = PCHG.MaxReg - PCHG.MinReg + 1;
+
+ unsigned int i;
+diff -urNp a/converter/ppm/imgtoppm.c b/converter/ppm/imgtoppm.c
+--- a/converter/ppm/imgtoppm.c 2025-02-03 09:24:28.330500563 +0100
++++ b/converter/ppm/imgtoppm.c 2025-02-03 18:10:34.478961449 +0100
+@@ -85,6 +85,7 @@ main(int argc, const char ** argv) {
+ len = atoi((char*) buf);
+ if (fread(buf, len, 1, ifP) != 1)
+ pm_error("bad colormap buf");
++ overflow2(cmaplen, 3);
+ if (len != cmaplen * 3) {
+ pm_message(
+ "cmaplen (%u) and colormap buf length (%u) do not match",
+@@ -105,6 +106,7 @@ main(int argc, const char ** argv) {
+ pm_error("bad pixel data header");
+ buf[8] = '\0';
+ len = atoi((char*) buf);
++ overflow2(cols, rows);
+ if (len != cols * rows)
+ pm_message(
+ "pixel data length (%u) does not match image size (%u)",
+diff -urNp a/converter/ppm/Makefile b/converter/ppm/Makefile
+--- a/converter/ppm/Makefile 2025-02-03 09:24:28.331500558 +0100
++++ b/converter/ppm/Makefile 2025-02-03 17:39:13.338685028 +0100
@@ -11,7 +11,7 @@ SUBDIRS = hpcdtoppm ppmtompeg
PORTBINARIES = 411toppm eyuvtoppm gouldtoppm ilbmtoppm imgtoppm \
@@ -709,528 +387,84 @@ index 003ef8d..b97349d 100644
ppmtoacad ppmtoapplevol ppmtoarbtxt ppmtoascii \
ppmtobmp ppmtoeyuv ppmtogif ppmtoicr ppmtoilbm \
ppmtoleaf ppmtolj ppmtomitsu ppmtoneo \
-diff --git a/converter/ppm/ilbmtoppm.c b/converter/ppm/ilbmtoppm.c
-index b9b8986..f4fe331 100644
---- a/converter/ppm/ilbmtoppm.c
-+++ b/converter/ppm/ilbmtoppm.c
-@@ -608,6 +608,7 @@ decode_row(FILE * const ifP,
- rawtype *chp;
+diff -urNp a/converter/ppm/pcxtoppm.c b/converter/ppm/pcxtoppm.c
+--- a/converter/ppm/pcxtoppm.c 2025-02-03 09:24:28.329500569 +0100
++++ b/converter/ppm/pcxtoppm.c 2025-02-03 18:12:34.245400166 +0100
+@@ -378,6 +378,7 @@ pcxPlanesToPixels(unsigned char * const
+ to conceive how this subroutine should work with other numbers of bits per
+ sample, but it doesn't.
+ -----------------------------------------------------------------------------*/
++ overflow2(bytesPerLine, 8);
+ unsigned int const pixelCt = bytesPerLine * 8;
- cols = bmhdP->w;
-+ overflow_add(cols, 15);
- bytes = RowBytes(cols);
- for( plane = 0; plane < nPlanes; plane++ ) {
- int mask;
-@@ -695,6 +696,23 @@ decode_mask(FILE * const ifP,
- Multipalette handling
- ****************************************************************************/
-
-+static void *
-+xmalloc2(x, y)
-+ int x;
-+ int y;
-+{
-+ void *mem;
-+
-+ overflow2(x,y);
-+ if( x * y == 0 )
-+ return NULL;
-+
-+ mem = malloc2(x,y);
-+ if( mem == NULL )
-+ pm_error("out of memory allocating %d bytes", x * y);
-+ return mem;
-+}
-+
-
- static void
- multi_adjust(ColorMap * const cmapP,
-@@ -1363,6 +1381,9 @@ dcol_to_ppm(FILE * const ifP,
- if( redmaxval != maxval || greenmaxval != maxval || bluemaxval != maxval )
- pm_message("scaling colors to %d bits", pm_maxvaltobits(maxval));
-
-+ overflow_add(redmaxval, 1);
-+ overflow_add(greenmaxval, 1);
-+ overflow_add(bluemaxval, 1);
- MALLOCARRAY_NOFAIL(redtable, redmaxval +1);
- MALLOCARRAY_NOFAIL(greentable, greenmaxval +1);
- MALLOCARRAY_NOFAIL(bluetable, bluemaxval +1);
-@@ -1802,7 +1823,9 @@ PCHG_ConvertSmall(PCHGHeader * const
- ChangeCount32 = *data++;
- remDataSize -= 2;
-
-+ overflow_add(ChangeCount16, ChangeCount32);
- changes = ChangeCount16 + ChangeCount32;
-+ overflow_add(changes, 1);
- for (i = 0; i < changes; ++i) {
- if (totalchanges >= pchgP->TotalChanges) goto fail;
- if (remDataSize < 2) goto fail;
-@@ -2067,6 +2090,9 @@ read_pchg(FILE * const ifP,
- cmap->mp_change[i] = NULL;
- if( PCHG.StartLine < 0 ) {
- int nch;
-+ if(PCHG.MaxReg < PCHG.MinReg)
-+ pm_error("assert: MinReg > MaxReg");
-+ overflow_add(PCHG.MaxReg-PCHG.MinReg, 2);
- nch = PCHG.MaxReg - PCHG.MinReg +1;
- MALLOCARRAY_NOFAIL(cmap->mp_init, nch + 1);
- for( i = 0; i < nch; i++ )
-@@ -2143,6 +2169,7 @@ process_body( FILE * const ifP,
- if (typeid == ID_ILBM) {
- int isdeep;
-
-+ overflow_add(bmhdP->w, 15);
- MALLOCARRAY_NOFAIL(ilbmrow, RowBytes(bmhdP->w));
- *viewportmodesP |= fakeviewport; /* -isham/-isehb */
-
-diff -ruNp a/converter/ppm/imgtoppm.c b/converter/ppm/imgtoppm.c
---- a/converter/ppm/imgtoppm.c 2021-06-02 15:53:59.845205755 +0200
-+++ b/converter/ppm/imgtoppm.c 2021-06-02 20:23:21.818634335 +0200
-@@ -84,6 +84,7 @@ main(int argc, char ** argv) {
- len = atoi((char*) buf );
- if ( fread( buf, len, 1, ifp ) != 1 )
- pm_error( "bad colormap buf" );
-+ overflow2(cmaplen, 3);
- if ( cmaplen * 3 != len )
- {
- pm_message(
-@@ -105,6 +106,7 @@ main(int argc, char ** argv) {
- pm_error( "bad pixel data header" );
- buf[8] = '\0';
- len = atoi((char*) buf );
-+ overflow2(cols, rows);
- if ( len != cols * rows )
- pm_message(
- "pixel data length (%d) does not match image size (%d)",
-diff --git a/converter/ppm/pcxtoppm.c b/converter/ppm/pcxtoppm.c
-index e252ba2..270ae3b 100644
---- a/converter/ppm/pcxtoppm.c
-+++ b/converter/ppm/pcxtoppm.c
-@@ -409,6 +409,7 @@ pcx_planes_to_pixels(pixels, bitplanes, bytesperline, planes, bitsperpixel)
- /*
- * clear the pixel buffer
- */
-+ overflow2(bytesperline, 8);
- npixels = (bytesperline * 8) / bitsperpixel;
- p = pixels;
- while (--npixels >= 0)
-@@ -470,6 +471,7 @@ pcx_16col_to_ppm(FILE * const ifP,
+ unsigned int bitPlanesIdx;
+diff -urNp a/converter/ppm/pjtoppm.c b/converter/ppm/pjtoppm.c
+--- a/converter/ppm/pjtoppm.c 2025-02-03 09:24:28.329500569 +0100
++++ b/converter/ppm/pjtoppm.c 2025-02-03 18:21:28.636228030 +0100
+@@ -77,6 +77,7 @@ modifyImageMode1(unsigned int const
+ val = image[plane + row * planes][col+1];
+ cmd >= 0 && i < newcols; --cmd, ++i)
+ buf[i] = val;
++ overflow_add(i, 1);
+ }
+ cols = MAX(cols, i);
+ free(image[row * planes + plane]);
+@@ -90,6 +91,7 @@ modifyImageMode1(unsigned int const
+ }
+ }
}
-
- /* BytesPerLine should be >= BitsPerPixel * cols / 8 */
-+ overflow2(BytesPerLine, 8);
- rawcols = BytesPerLine * 8 / BitsPerPixel;
- if (headerCols > rawcols) {
- pm_message("warning - BytesPerLine = %d, "
-diff -ruNp a/converter/ppm/picttoppm.c b/converter/ppm/picttoppm.c
---- a/converter/ppm/picttoppm.c 2021-06-02 15:53:59.845205755 +0200
-+++ b/converter/ppm/picttoppm.c 2021-06-02 20:23:21.820634352 +0200
-@@ -1,3 +1,4 @@
-+#error "Unfixable. Don't ship me"
- /*
- * picttoppm.c -- convert a MacIntosh PICT file to PPM format.
- *
-diff -ruNp a/converter/ppm/pjtoppm.c b/converter/ppm/pjtoppm.c
---- a/converter/ppm/pjtoppm.c 2021-06-02 15:53:59.845205755 +0200
-+++ b/converter/ppm/pjtoppm.c 2021-06-02 20:23:21.821634361 +0200
-@@ -10,98 +10,66 @@
- ** implied warranty.
- */
-
--#include
--
- #include "ppm.h"
--#include "pm_c_util.h"
- #include "mallocvar.h"
-
- static char usage[] = "[paintjetfile]";
-
--
--
--static unsigned int
--uintProduct(unsigned int const multiplicand,
-- unsigned int const multiplier) {
--
-- if (UINT_MAX / multiplier < multiplicand)
-- pm_error("Airthmetic overflow");
--
-- return multiplicand * multiplier;
--}
--
--
--
-+static int egetc ARGS((FILE *fp));
- static int
--egetc(FILE * const ifP) {
-+egetc(fp)
-+ FILE *fp;
-+{
- int c;
--
-- c = fgetc(ifP);
--
-- if (c == -1)
-+ if ((c = fgetc(fp)) == -1)
- pm_error("unexpected end of file");
--
-- return c;
-+ return(c);
++ overflow2(cols, 8);
+ *colsP = cols * 8; assert(cols < UINT_MAX/8);
}
--
--
- int
--main(int argc, const char ** argv) {
--
-+main(argc, argv)
-+ int argc;
-+ char *argv[];
-+{
- int cmd, val;
- char buffer[BUFSIZ];
-- int planes = 3;
-- unsigned int rows;
-- unsigned int rowsX;
-- unsigned int cols;
-- bool colsIsSet;
-+ int planes = 3, rows = -1, cols = -1;
-+ int r = 0, c = 0, p = 0, i;
- unsigned char **image = NULL;
- int *imlen;
-- FILE * ifP;
-+ FILE *fp = stdin;
- int mode;
-- bool modeIsSet;
- int argn;
- unsigned char bf[3];
-- pixel * pixrow;
-- int c;
-- int row;
-- int plane;
-+ pixel *pixrow;
-
-- pm_proginit(&argc, argv);
-
-+ ppm_init(&argc, argv);
- argn = 1;
- if (argn != argc)
-- ifP = pm_openr(argv[argn++]);
-+ fp = pm_openr(argv[argn++]);
- else
-- ifP = stdin;
-+ fp = stdin;
-
- if (argn != argc)
- pm_usage(usage);
-
-- row = 0; /* initial value */
-- plane = 0; /* initial value */
-- modeIsSet = false; /* initial value */
-- colsIsSet = false; /* initial value */
-- rowsX = 0; /* initial value */
--
-- while ((c = fgetc(ifP)) != -1) {
-+ while ((c = fgetc(fp)) != -1) {
- if (c != '\033')
- continue;
-- switch (c = egetc(ifP)) {
-+ switch (c = egetc(fp)) {
- case 'E': /* reset */
- break;
-- case '*': {
-- unsigned int i;
-- cmd = egetc(ifP);
-+ case '*':
-+ cmd = egetc(fp);
- for (i = 0; i < BUFSIZ; i++) {
-- if (!isdigit(c = egetc(ifP)) && c != '+' && c != '-')
-+ if (!isdigit(c = egetc(fp)) && c != '+' && c != '-')
- break;
- buffer[i] = c;
- }
- if (i != 0) {
- buffer[i] = '\0';
-- if (sscanf(buffer, "%d", &val) != 1)
-+ if (sscanf(buffer, "%d", &val) != 1)
- pm_error("bad value `%s' at *%c%c", buffer, cmd, c);
- }
- else
-@@ -125,18 +93,18 @@ main(int argc, const char ** argv) {
- case 'r':
- switch (c) {
- case 'S': /* width */
-- if (val < 0)
-+ if (val < 0) {
- pm_error("invalid width value");
-- else {
-+ } else {
- cols = val;
-- colsIsSet = true;
- }
- break;
- case 'T': /* height */
-- if (val < 0)
-+ if (val < 0) {
- pm_error ("invalid height value");
-- else
-- rowsX = val;
-+ } else {
-+ rows = val;
-+ }
- break;
- case 'U': /* planes */
- planes = val;
-@@ -163,40 +131,43 @@ main(int argc, const char ** argv) {
- if (val != 0 && val != 1)
- pm_error("unimplemented transmission mode %d", val);
- mode = val;
-- modeIsSet = true;
- break;
+@@ -265,8 +267,10 @@ main(int argc, const char ** argv) {
case 'V': /* send plane */
case 'W': /* send last plane */
-- if (row >= rowsX || image == NULL) {
+ if (row >= rowsX || image == NULL) {
- if (row >= rowsX)
-- rowsX += 100;
-+ if (rows == -1 || r >= rows || image == NULL) {
-+ if (rows == -1 || r >= rows) {
++ if (row >= rowsX) {
+ overflow_add(rows, 100);
-+ rows += 100;
+ rowsX += 100;
+ }
-+
- if (image == NULL) {
-- MALLOCARRAY(image, uintProduct(rowsX, planes));
-- MALLOCARRAY(imlen, uintProduct(rowsX, planes));
-- } else {
-- REALLOCARRAY(image, uintProduct(rowsX, planes));
-- REALLOCARRAY(imlen, uintProduct(rowsX, planes));
-+ image = (unsigned char **)
-+ malloc3(rows , planes , sizeof(unsigned char *));
-+ imlen = (int *) malloc3(rows , planes, sizeof(int));
- }
-+ else {
-+ overflow2(rows,planes);
-+ image = (unsigned char **)
-+ realloc2(image, rows * planes,
-+ sizeof(unsigned char *));
-+ imlen = (int *) realloc2(imlen, rows * planes, sizeof(int)); }
+ REALLOCARRAY(image, uintProduct(rowsX, planes));
+ REALLOCARRAY(imlen, uintProduct(rowsX, planes));
}
- if (image == NULL || imlen == NULL)
- pm_error("out of memory");
-- if (plane >= planes)
-+ if (p == planes)
- pm_error("too many planes");
-- if (!colsIsSet)
-- pm_error("missing width value");
--
-- cols = MAX(cols, val);
-- imlen[row * planes + plane] = val;
-- MALLOCARRAY(image[row * planes + plane], val);
-- if (image[row * planes + plane] == NULL)
-+ cols = cols > val ? cols : val;
-+ imlen[r * planes + p] = val;
-+ MALLOCARRAY(image[r * planes + p], val);
-+ if (image[r * planes + p] == NULL)
- pm_error("out of memory");
-- if (fread(image[row * planes + plane], 1, val, ifP) != val)
-+ if (fread(image[r * planes + p], 1, val, fp) != val)
- pm_error("short data");
- if (c == 'V')
-- ++plane;
-+ p++;
- else {
-- plane = 0;
-- ++row;
-+ p = 0;
-+ r++;
- }
- break;
- default:
-@@ -205,7 +176,7 @@ main(int argc, const char ** argv) {
- }
- break;
- case 'p': /* Position */
-- if (plane != 0)
-+ if (p != 0)
- pm_error("changed position in the middle of "
- "transferring planes");
- switch (c) {
-@@ -214,15 +185,15 @@ main(int argc, const char ** argv) {
- break;
- case 'Y':
- if (buffer[0] == '+')
-- val = row + val;
-+ val = r + val;
- if (buffer[0] == '-')
-- val = row - val;
-- for (; val > row; ++row)
-- for (plane = 0; plane < 3; ++plane) {
-- imlen[row * planes + plane] = 0;
-- image[row * planes + plane] = NULL;
-+ val = r - val;
-+ for (; val > r; r++)
-+ for (p = 0; p < 3; p++) {
-+ imlen[r * planes + p] = 0;
-+ image[r * planes + p] = NULL;
- }
-- row = val;
-+ r = val;
- break;
- default:
- pm_message("uninmplemented *%c%d%c", cmd, val, c);
-@@ -231,86 +202,65 @@ main(int argc, const char ** argv) {
- default:
- pm_message("uninmplemented *%c%d%c", cmd, val, c);
- break;
-- }
-- } /* case */
-- } /* switch */
-+ }
-+ }
- }
-- pm_close(ifP);
--
-- if (!modeIsSet)
-- pm_error("Input does not contain a 'bM' transmission mode order");
--
-- rows = row;
-+ pm_close(fp);
-+ rows = r;
- if (mode == 1) {
-- unsigned int const newcols = 10240;
-- /* It could not be larger than that! */
--
-- unsigned char * buf;
-- unsigned int row;
--
-- for (row = 0, cols = 0; row < rows; ++row) {
-- unsigned int plane;
-- if (image[row * planes] == NULL)
-+ unsigned char *buf;
-+ int newcols = 0;
-+ newcols = 10240; /* It could not be larger that that! */
-+ cols = 0;
-+ for (r = 0; r < rows; r++) {
-+ if (image[r * planes] == NULL)
- continue;
-- for (plane = 0; plane < planes; ++plane) {
-- unsigned int i;
-- unsigned int col;
-+ for (p = 0; p < planes; p++) {
- MALLOCARRAY(buf, newcols);
-- if (buf == NULL)
-+ if (buf == NULL)
- pm_error("out of memory");
-- for (i = 0, col = 0;
-- col < imlen[plane + row * planes];
-- col += 2)
-- for (cmd = image[plane + row * planes][col],
-- val = image[plane + row * planes][col+1];
-- cmd >= 0 && i < newcols; cmd--, i++)
-+ for (i = 0, c = 0; c < imlen[p + r * planes]; c += 2)
-+ for (cmd = image[p + r * planes][c],
-+ val = image[p + r * planes][c+1];
-+ cmd >= 0 && i < newcols; cmd--, i++) {
- buf[i] = val;
-- cols = MAX(cols, i);
-- free(image[plane + row * planes]);
-- /*
-- * This is less than what we have so it realloc should
-+ overflow_add(i, 1);
-+ }
-+ cols = cols > i ? cols : i;
-+ free(image[p + r * planes]);
-+ /*
-+ * This is less than what we have so it realloc should
- * not return null. Even if it does, tough! We will
- * lose a line, and probably die on the next line anyway
- */
-- image[plane + row * planes] = realloc(buf, i);
-+ image[p + r * planes] = (unsigned char *) realloc(buf, i);
- }
- }
-+ overflow2(cols, 8);
- cols *= 8;
- }
--
-+
-+
- ppm_writeppminit(stdout, cols, rows, (pixval) 255, 0);
- pixrow = ppm_allocrow(cols);
--
-- for (row = 0; row < rows; ++row) {
-- if (image[row * planes] == NULL) {
-- unsigned int col;
-- for (col = 0; col < cols; ++col)
-- PPM_ASSIGN(pixrow[col], 0, 0, 0);
-+ for (r = 0; r < rows; r++) {
-+ if (image[r * planes] == NULL) {
-+ for (c = 0; c < cols; c++)
-+ PPM_ASSIGN(pixrow[c], 0, 0, 0);
- continue;
- }
-- {
-- unsigned int col;
-- unsigned int cmd;
-- for (cmd = 0, col = 0; col < cols; col += 8, ++cmd) {
-- unsigned int i;
-- for (i = 0; i < 8 && col + i < cols; ++i) {
-- unsigned int plane;
-- for (plane = 0; plane < planes; ++plane)
-- if (mode == 0 && cmd >= imlen[row * planes + plane])
-- bf[plane] = 0;
-- else
-- bf[plane] = (image[row * planes + plane][cmd] &
-- (1 << (7 - i))) ? 255 : 0;
-- PPM_ASSIGN(pixrow[col + i], bf[0], bf[1], bf[2]);
-- }
-+ for (cmd = 0, c = 0; c < cols; c += 8, cmd++)
-+ for (i = 0; i < 8 && c + i < cols; i++) {
-+ for (p = 0; p < planes; p++)
-+ if (mode == 0 && cmd >= imlen[r * planes + p])
-+ bf[p] = 0;
-+ else
-+ bf[p] = (image[r * planes + p][cmd] &
-+ (1 << (7 - i))) ? 255 : 0;
-+ PPM_ASSIGN(pixrow[c + i], bf[0], bf[1], bf[2]);
- }
-- }
-- ppm_writeppmrow(stdout, pixrow, cols, 255, 0);
-+ ppm_writeppmrow(stdout, pixrow, cols, (pixval) 255, 0);
- }
- pm_close(stdout);
--
-- return 0;
-+ exit(0);
- }
--
--
--
-diff -ruNp a/converter/ppm/ppmtoeyuv.c b/converter/ppm/ppmtoeyuv.c
---- a/converter/ppm/ppmtoeyuv.c 2021-06-02 15:53:59.845205755 +0200
-+++ b/converter/ppm/ppmtoeyuv.c 2021-06-02 20:23:21.821634361 +0200
-@@ -114,6 +114,7 @@ create_multiplication_tables(const pixva
+@@ -277,6 +281,8 @@ main(int argc, const char ** argv) {
+ if (!colsIsSet)
+ pm_error("missing width value");
- int index;
++ overflow2(rows,planes);
++ overflow_add(rows * planes, plane);
+ cols = MAX(cols, val);
+ imlen[row * planes + plane] = val;
+ MALLOCARRAY(image[row * planes + plane], val);
+diff -urNp a/converter/ppm/ppmtoeyuv.c b/converter/ppm/ppmtoeyuv.c
+--- a/converter/ppm/ppmtoeyuv.c 2025-02-03 09:24:28.330500563 +0100
++++ b/converter/ppm/ppmtoeyuv.c 2025-02-03 18:22:08.012087384 +0100
+@@ -117,6 +117,7 @@ chrominanceBlue(pixel const p) {
+ static void
+ createMultiplicationTables(pixval const maxval) {
+ overflow_add(maxval, 1);
MALLOCARRAY_NOFAIL(mult299 , maxval+1);
MALLOCARRAY_NOFAIL(mult587 , maxval+1);
MALLOCARRAY_NOFAIL(mult114 , maxval+1);
-diff -ruNp a/converter/ppm/ppmtolj.c b/converter/ppm/ppmtolj.c
---- a/converter/ppm/ppmtolj.c 2021-06-02 15:53:59.846205765 +0200
-+++ b/converter/ppm/ppmtolj.c 2021-06-02 20:23:21.821634361 +0200
-@@ -182,6 +182,7 @@ int main(int argc, char *argv[]) {
- ppm_readppminit( ifp, &cols, &rows, &maxval, &format );
- pixelrow = ppm_allocrow( cols );
+diff -urNp a/converter/ppm/ppmtolj.c b/converter/ppm/ppmtolj.c
+--- a/converter/ppm/ppmtolj.c 2025-02-03 09:24:28.330500563 +0100
++++ b/converter/ppm/ppmtolj.c 2025-02-03 18:24:55.523489226 +0100
+@@ -212,6 +212,8 @@ printRaster(FILE * const ifP,
+ pm_error("Image is uncomputably wide (%u columns)", cols);
+ }
+ overflow2(cols, 6);
++
obuf = (unsigned char *) pm_allocrow(cols * 3, sizeof(unsigned char));
cbuf = (unsigned char *) pm_allocrow(cols * 6, sizeof(unsigned char));
- if (mode == C_TRANS_MODE_DELTA)
-diff -ruNp a/converter/ppm/ppmtomitsu.c b/converter/ppm/ppmtomitsu.c
---- a/converter/ppm/ppmtomitsu.c 2021-06-02 15:53:59.846205765 +0200
-+++ b/converter/ppm/ppmtomitsu.c 2021-06-02 20:23:21.822634370 +0200
-@@ -685,6 +685,8 @@ main(int argc, char * argv[]) {
+
+diff -urNp a/converter/ppm/ppmtomitsu.c b/converter/ppm/ppmtomitsu.c
+--- a/converter/ppm/ppmtomitsu.c 2025-02-03 09:24:28.331500558 +0100
++++ b/converter/ppm/ppmtomitsu.c 2025-02-03 18:27:10.691006400 +0100
+@@ -68,6 +68,8 @@ mediaSize(const char * const media,
medias = MSize_User;
if (dpi300) {
@@ -1239,1378 +473,144 @@ diff -ruNp a/converter/ppm/ppmtomitsu.c b/converter/ppm/ppmtomitsu.c
medias.maxcols *= 2;
medias.maxrows *= 2;
}
-diff -ruNp a/converter/ppm/ppmtopcx.c b/converter/ppm/ppmtopcx.c
---- a/converter/ppm/ppmtopcx.c 2021-06-02 15:53:59.846205765 +0200
-+++ b/converter/ppm/ppmtopcx.c 2021-06-02 20:23:21.823634378 +0200
-@@ -31,13 +31,13 @@
- #define PCX_MAXVAL (pixval)255
+diff -urNp a/converter/ppm/ppmtopcx.c b/converter/ppm/ppmtopcx.c
+--- a/converter/ppm/ppmtopcx.c 2025-02-03 09:24:28.330500563 +0100
++++ b/converter/ppm/ppmtopcx.c 2025-02-03 18:31:08.699156362 +0100
+@@ -314,6 +314,8 @@ writeHeader(FILE * const of
+ putbyte(0, ofP); /* reserved byte */
+ putbyte(planes, ofP); /* number of color planes */
++ overflow2(bitsPerPixel, cols);
++ overflow_add(bitsPerPixel * cols, 7);
+ bytesPerLine = ((cols * bitsPerPixel) + 7) / 8;
+ putword(bytesPerLine, ofP); /* number of bytes per scanline */
--struct CmdlineInfo {
-+struct cmdlineInfo {
- /* All the information the user supplied in the command line,
- in a form easy for the program to use.
- */
-- const char * inputFilespec; /* '-' if stdin */
-+ const char *inputFilespec; /* '-' if stdin */
- unsigned int truecolor; /* -24bit option */
-- unsigned int use8Bit; /* -8bit option */
-+ unsigned int use_8_bit; /* -8bit option */
- unsigned int planes; /* zero means minimum */
- unsigned int packed;
- unsigned int verbose;
-@@ -49,16 +49,16 @@ struct CmdlineInfo {
-
-
-
--struct PcxCmapEntry {
-+struct pcxCmapEntry {
- unsigned char r;
- unsigned char g;
- unsigned char b;
- };
-
--static struct PcxCmapEntry
-+static struct pcxCmapEntry
- pcxCmapEntryFromPixel(pixel const colorPixel) {
-
-- struct PcxCmapEntry retval;
-+ struct pcxCmapEntry retval;
-
- retval.r = PPM_GETR(colorPixel);
- retval.g = PPM_GETG(colorPixel);
-@@ -70,8 +70,8 @@ pcxCmapEntryFromPixel(pixel const colorP
-
-
- static void
--parseCommandLine(int argc, const char ** argv,
-- struct CmdlineInfo * const cmdlineP) {
-+parseCommandLine(int argc, char ** argv,
-+ struct cmdlineInfo * const cmdlineP) {
- /*----------------------------------------------------------------------------
- parse program command line described in Unix standard form by argc
- and argv. Return the information in the options as *cmdlineP.
-@@ -82,7 +82,7 @@ parseCommandLine(int argc, const char **
- Note that the strings we return are stored in the storage that
- was passed to us as the argv array. We also trash *argv.
- -----------------------------------------------------------------------------*/
-- optEntry * option_def;
-+ optEntry *option_def;
- /* Instructions to pm_optParseOptions3 on how to parse our options.
- */
- optStruct3 opt;
-@@ -97,7 +97,7 @@ parseCommandLine(int argc, const char **
- OPTENT3(0, "24bit", OPT_FLAG, NULL,
- &cmdlineP->truecolor, 0);
- OPTENT3(0, "8bit", OPT_FLAG, NULL,
-- &cmdlineP->use8Bit, 0);
-+ &cmdlineP->use_8_bit, 0);
- OPTENT3(0, "planes", OPT_UINT, &cmdlineP->planes,
- &planesSpec, 0);
- OPTENT3(0, "packed", OPT_FLAG, NULL,
-@@ -115,7 +115,7 @@ parseCommandLine(int argc, const char **
- 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 );
-+ pm_optParseOptions3( &argc, argv, opt, sizeof(opt), 0 );
- /* Uses and sets argc, argv, and some of *cmdline_p and others. */
-
- if (!xposSpec)
-@@ -141,7 +141,7 @@ parseCommandLine(int argc, const char **
- pm_error("-planes is meaningless with -packed.");
- if (cmdlineP->truecolor)
- pm_error("-planes is meaningless with -24bit");
-- if (cmdlineP->use8Bit)
-+ if (cmdlineP->use_8_bit)
- pm_error("-planes is meaningless with -8bit");
+diff -urNp a/converter/ppm/ppmtopict.c b/converter/ppm/ppmtopict.c
+--- a/converter/ppm/ppmtopict.c 2025-02-03 09:24:28.330500563 +0100
++++ b/converter/ppm/ppmtopict.c 2025-02-03 18:41:02.377096627 +0100
+@@ -394,6 +394,9 @@ writeRaster(FILE * const ofP,
+ pm_error("Image is too wide (%u columns) for computation", cols);
}
-@@ -151,7 +151,7 @@ parseCommandLine(int argc, const char **
- if (!paletteSpec)
- cmdlineP->palette = NULL;
-
-- if (cmdlineP->use8Bit && cmdlineP->truecolor)
-+ if (cmdlineP->use_8_bit && cmdlineP->truecolor)
- pm_error("You cannot specify both -8bit and -truecolor");
-
- if (argc-1 < 1)
-@@ -172,8 +172,8 @@ parseCommandLine(int argc, const char **
- * Write out a two-byte little-endian word to the PCX file
- */
- static void
--putword(unsigned int const w,
-- FILE * const fp) {
-+Putword(int const w,
-+ FILE * const fp) {
-
- int rc;
-
-@@ -189,13 +189,12 @@ putword(unsigned int const w,
- * Write out a byte to the PCX file
- */
- static void
--putbyte(unsigned int const b,
-- FILE * const ofP) {
-+Putbyte(int const b,
-+ FILE * const fp) {
-
- int rc;
-
-- rc = fputc(b & 0xff, ofP);
--
-+ rc = fputc(b & 0xff, fp);
- if (rc == EOF)
- pm_error("Error writing byte to output file.");
- }
-@@ -204,9 +203,9 @@ putbyte(unsigned int const b,
-
- static void
- extractPlane(unsigned char * const rawrow,
-- unsigned int const cols,
-+ int const cols,
- unsigned char * const buf,
-- unsigned int const plane) {
-+ int const plane) {
- /*----------------------------------------------------------------------------
- From the image row 'rawrow', which is an array of 'cols' palette indices
- (as unsigned 8 bit integers), extract plane number 'plane' and return
-@@ -224,7 +223,9 @@ extractPlane(unsigned char * const rawro
-
- cp = buf; /* initial value */
-
-- for (col = 0, cbit = 7, byteUnderConstruction = 0x00; col < cols; ++col) {
-+ cbit = 7;
-+ byteUnderConstruction = 0x00;
-+ for (col = 0; col < cols; ++col) {
- if (rawrow[col] & planeMask)
- byteUnderConstruction |= (1 << cbit);
-
-@@ -246,17 +247,14 @@ extractPlane(unsigned char * const rawro
-
-
- static void
--packBits(unsigned char * const rawrow,
-- unsigned int const width,
-+PackBits(unsigned char * const rawrow,
-+ int const width,
- unsigned char * const buf,
-- unsigned int const bits) {
-+ int const bits) {
-
-- unsigned int x;
-- int i;
-- int shift;
-+ int x, i, shift;
-
-- shift = -1;
-- i = -1;
-+ shift = i = -1;
-
- for (x = 0; x < width; ++x) {
- if (shift < 0) {
-@@ -272,73 +270,71 @@ packBits(unsigned char * const rawrow,
-
-
- static void
--writeHeader(FILE * const ofP,
-- unsigned int const cols,
-- unsigned int const rows,
-- unsigned int const bitsPerPixel,
-- unsigned int const planes,
-- struct PcxCmapEntry const cmap16[],
-- unsigned int const xPos,
-- unsigned int const yPos) {
--
-- unsigned int bytesPerLine;
--
-- putbyte(PCX_MAGIC, ofP); /* .PCX magic number */
-- putbyte(0x05, ofP); /* PC Paintbrush version */
-- putbyte(0x01, ofP); /* .PCX run length encoding */
-- putbyte(bitsPerPixel, ofP); /* bits per pixel */
--
-- putword(xPos, ofP); /* x1 - image left */
-- putword(yPos, ofP); /* y1 - image top */
-- putword(xPos+cols-1, ofP); /* x2 - image right */
-- putword(yPos+rows-1, ofP); /* y2 - image bottom */
--
-- putword(cols, ofP); /* horizontal resolution */
-- putword(rows, ofP); /* vertical resolution */
-+write_header(FILE * const fp,
-+ int const cols,
-+ int const rows,
-+ int const BitsPerPixel,
-+ int const Planes,
-+ struct pcxCmapEntry const cmap16[],
-+ unsigned int const xPos,
-+ unsigned int const yPos) {
-+
-+ int i, BytesPerLine;
-+
-+ Putbyte(PCX_MAGIC, fp); /* .PCX magic number */
-+ Putbyte(0x05, fp); /* PC Paintbrush version */
-+ Putbyte(0x01, fp); /* .PCX run length encoding */
-+ Putbyte(BitsPerPixel, fp); /* bits per pixel */
-+
-+ Putword(xPos, fp); /* x1 - image left */
-+ Putword(yPos, fp); /* y1 - image top */
-+ Putword(xPos+cols-1, fp); /* x2 - image right */
-+ Putword(yPos+rows-1, fp); /* y2 - image bottom */
-+
-+ Putword(cols, fp); /* horizontal resolution */
-+ Putword(rows, fp); /* vertical resolution */
-
- /* Write out the Color Map for images with 16 colors or less */
-- if (cmap16) {
-- unsigned int i;
-+ if (cmap16)
- for (i = 0; i < 16; ++i) {
-- putbyte(cmap16[i].r, ofP);
-- putbyte(cmap16[i].g, ofP);
-- putbyte(cmap16[i].b, ofP);
-+ Putbyte(cmap16[i].r, fp);
-+ Putbyte(cmap16[i].g, fp);
-+ Putbyte(cmap16[i].b, fp);
- }
-- } else {
-+ else {
- unsigned int i;
- for (i = 0; i < 16; ++i) {
-- putbyte(0, ofP);
-- putbyte(0, ofP);
-- putbyte(0, ofP);
-+ Putbyte(0, fp);
-+ Putbyte(0, fp);
-+ Putbyte(0, fp);
- }
- }
-- putbyte(0, ofP); /* reserved byte */
-- putbyte(planes, ofP); /* number of color planes */
-+ Putbyte(0, fp); /* reserved byte */
-+ Putbyte(Planes, fp); /* number of color planes */
-
-- bytesPerLine = ((cols * bitsPerPixel) + 7) / 8;
-- putword(bytesPerLine, ofP); /* number of bytes per scanline */
-+ BytesPerLine = ((cols * BitsPerPixel) + 7) / 8;
-+ Putword(BytesPerLine, fp); /* number of bytes per scanline */
-
-- putword(1, ofP); /* palette info */
-+ Putword(1, fp); /* palette info */
-
- {
- unsigned int i;
- for (i = 0; i < 58; ++i) /* fill to end of header */
-- putbyte(0, ofP);
-+ Putbyte(0, fp);
- }
- }
-
-
-
- static void
--pcxEncode(FILE * const ofP,
-+PCXEncode(FILE * const fp,
- const unsigned char * const buf,
-- unsigned int const size) {
-+ int const Size) {
-
-- const unsigned char * const end = buf + size;
-+ const unsigned char * const end = buf + Size;
-
- const unsigned char * currentP;
-- unsigned int previous;
-- unsigned int count;
-+ int previous, count;
-
- currentP = buf;
- previous = *currentP++;
-@@ -351,19 +347,19 @@ pcxEncode(FILE * const of
- else {
- if (count > 1 || (previous & 0xc0) == 0xc0) {
- count |= 0xc0;
-- putbyte ( count , ofP );
-+ Putbyte ( count , fp );
- }
-- putbyte(previous, ofP);
-+ Putbyte(previous, fp);
- previous = c;
-- count = 1;
-+ count = 1;
- }
- }
-
- if (count > 1 || (previous & 0xc0) == 0xc0) {
- count |= 0xc0;
-- putbyte(count, ofP);
-+ Putbyte ( count , fp );
- }
-- putbyte(previous, ofP);
-+ Putbyte(previous, fp);
- }
-
-
-@@ -390,46 +386,63 @@ indexOfColor(colorhash_table const cht,
-
-
- static void
--writeRaster16Color(FILE * const ofP,
-- pixel ** const pixels,
-- unsigned int const cols,
-- unsigned int const rows,
-- unsigned int const planes,
-- colorhash_table const cht,
-- bool const packbits,
-- unsigned int const bitsPerPixel) {
--
-- unsigned int const bytesPerLine = ((cols * bitsPerPixel) + 7) / 8;
--
-- unsigned char * indexRow; /* malloc'ed */
-- /* indexRow[x] is the palette index of the pixel at column x of
-- the row currently being processed
-- */
-- unsigned char * planesrow; /* malloc'ed */
-- /* This is the input for a single row to the compressor */
-+ppmTo16ColorPcx(pixel ** const pixels,
-+ int const cols,
-+ int const rows,
-+ struct pcxCmapEntry const pcxcmap[],
-+ int const colors,
-+ colorhash_table const cht,
-+ bool const packbits,
-+ unsigned int const planesRequested,
-+ unsigned int const xPos,
-+ unsigned int const yPos) {
-
-- unsigned int row;
-+ int Planes, BytesPerLine, BitsPerPixel;
-+ unsigned char *indexRow; /* malloc'ed */
-+ /* indexRow[x] is the palette index of the pixel at column x of
-+ the row currently being processed
-+ */
-+ unsigned char *planesrow; /* malloc'ed */
-+ /* This is the input for a single row to the compressor */
-+ int row;
-
-+ if (packbits) {
-+ Planes = 1;
-+ if (colors > 4) BitsPerPixel = 4;
-+ else if (colors > 2) BitsPerPixel = 2;
-+ else BitsPerPixel = 1;
-+ } else {
-+ BitsPerPixel = 1;
-+ if (planesRequested)
-+ Planes = planesRequested;
-+ else {
-+ if (colors > 8) Planes = 4;
-+ else if (colors > 4) Planes = 3;
-+ else if (colors > 2) Planes = 2;
-+ else Planes = 1;
-+ }
-+ }
-+ overflow2(BitsPerPixel, cols);
-+ overflow_add(BitsPerPixel * cols, 7);
-+ BytesPerLine = ((cols * BitsPerPixel) + 7) / 8;
- MALLOCARRAY_NOFAIL(indexRow, cols);
-- MALLOCARRAY(planesrow, bytesPerLine);
--
-- if (!planesrow)
-- pm_error("Failed to allocate buffer for a line of %u bytes",
-- bytesPerLine);
-+ MALLOCARRAY_NOFAIL(planesrow, BytesPerLine);
-
-+ write_header(stdout, cols, rows, BitsPerPixel, Planes, pcxcmap,
-+ xPos, yPos);
- for (row = 0; row < rows; ++row) {
-- unsigned int col;
-+ int col;
- for (col = 0; col < cols; ++col)
- indexRow[col] = indexOfColor(cht, pixels[row][col]);
-
- if (packbits) {
-- packBits(indexRow, cols, planesrow, bitsPerPixel);
-- pcxEncode(ofP, planesrow, bytesPerLine);
-+ PackBits(indexRow, cols, planesrow, BitsPerPixel);
-+ PCXEncode(stdout, planesrow, BytesPerLine);
- } else {
- unsigned int plane;
-- for (plane = 0; plane < planes; ++plane) {
-+ for (plane = 0; plane < Planes; ++plane) {
- extractPlane(indexRow, cols, planesrow, plane);
-- pcxEncode(stdout, planesrow, bytesPerLine);
-+ PCXEncode(stdout, planesrow, BytesPerLine);
- }
- }
- }
-@@ -439,143 +452,84 @@ writeRaster16Color(FILE * const ofP,
-
-
-
--static void
--ppmTo16ColorPcx(pixel ** const pixels,
-- unsigned int const cols,
-- unsigned int const rows,
-- struct PcxCmapEntry const pcxcmap[],
-- unsigned int const colorCt,
-- colorhash_table const cht,
-- bool const packbits,
-- unsigned int const planesRequested,
-- unsigned int const xPos,
-- unsigned int const yPos) {
--
-- unsigned int planes;
-- unsigned int bitsPerPixel;
--
-- if (packbits) {
-- planes = 1;
-- if (colorCt > 4) bitsPerPixel = 4;
-- else if (colorCt > 2) bitsPerPixel = 2;
-- else bitsPerPixel = 1;
-- } else {
-- bitsPerPixel = 1;
-- if (planesRequested)
-- planes = planesRequested;
-- else {
-- if (colorCt > 8) planes = 4;
-- else if (colorCt > 4) planes = 3;
-- else if (colorCt > 2) planes = 2;
-- else planes = 1;
-- }
-- }
--
-- writeHeader(stdout, cols, rows, bitsPerPixel, planes, pcxcmap,
-- xPos, yPos);
--
-- writeRaster16Color(stdout, pixels, cols, rows, planes, cht, packbits,
-- bitsPerPixel);
--}
--
--
--
- static void
- ppmTo256ColorPcx(pixel ** const pixels,
-- unsigned int const cols,
-- unsigned int const rows,
-- struct PcxCmapEntry const pcxcmap[],
-- unsigned int const colorCt,
-+ int const cols,
-+ int const rows,
-+ struct pcxCmapEntry const pcxcmap[],
-+ int const colors,
- colorhash_table const cht,
- unsigned int const xPos,
- unsigned int const yPos) {
-
-- unsigned char * rawrow;
-- unsigned int row;
--
-- MALLOCARRAY(rawrow, cols);
-+ int row;
-+ unsigned int i;
-+ unsigned char *rawrow;
-
-- if (!rawrow)
-- pm_error("Failed to allocate a buffer for %u columns", cols);
-+ rawrow = (unsigned char *)pm_allocrow(cols, sizeof(unsigned char));
-
- /* 8 bits per pixel, 1 plane */
-- writeHeader(stdout, cols, rows, 8, 1, NULL, xPos, yPos);
-+ write_header(stdout, cols, rows, 8, 1, NULL, xPos, yPos);
- for (row = 0; row < rows; ++row) {
-- unsigned int col;
-+ int col;
- for (col = 0; col < cols; ++col)
- rawrow[col] = indexOfColor(cht, pixels[row][col]);
-- pcxEncode(stdout, rawrow, cols);
--
-+ PCXEncode(stdout, rawrow, cols);
- }
-- putbyte(PCX_256_COLORS, stdout);
--
-- {
-- unsigned int i;
--
-- for (i = 0; i < MAXCOLORS; ++i) {
-- putbyte(pcxcmap[i].r, stdout);
-- putbyte(pcxcmap[i].g, stdout);
-- putbyte(pcxcmap[i].b, stdout);
-- }
-+ Putbyte(PCX_256_COLORS, stdout);
-+ for (i = 0; i < MAXCOLORS; ++i) {
-+ Putbyte(pcxcmap[i].r, stdout);
-+ Putbyte(pcxcmap[i].g, stdout);
-+ Putbyte(pcxcmap[i].b, stdout);
- }
-- free(rawrow);
-+ pm_freerow((void*)rawrow);
- }
-
-
-
- static void
- ppmToTruecolorPcx(pixel ** const pixels,
-- unsigned int const cols,
-- unsigned int const rows,
-+ int const cols,
-+ int const rows,
- pixval const maxval,
- unsigned int const xPos,
- unsigned int const yPos) {
-
-- unsigned char * redrow;
-- unsigned char * grnrow;
-- unsigned char * blurow;
-- unsigned int row;
-+ unsigned char *redrow, *greenrow, *bluerow;
-+ int col, row;
-
-- MALLOCARRAY(redrow, cols);
-- MALLOCARRAY(grnrow, cols);
-- MALLOCARRAY(blurow, cols);
--
-- if (!redrow || !grnrow || !blurow)
-- pm_error("Unable to allocate buffer for a row of %u pixels", cols);
-+ redrow = (unsigned char *)pm_allocrow(cols, sizeof(unsigned char));
-+ greenrow = (unsigned char *)pm_allocrow(cols, sizeof(unsigned char));
-+ bluerow = (unsigned char *)pm_allocrow(cols, sizeof(unsigned char));
-
- /* 8 bits per pixel, 3 planes */
-- writeHeader(stdout, cols, rows, 8, 3, NULL, xPos, yPos);
--
-- for (row = 0; row < rows; ++row) {
-- pixel * const pixrow = pixels[row];
--
-- unsigned int col;
--
-- for (col = 0; col < cols; ++col) {
-- pixel const pix = pixrow[col];
--
-- if (maxval != PCX_MAXVAL) {
-- redrow[col] = (long)PPM_GETR(pix) * PCX_MAXVAL / maxval;
-- grnrow[col] = (long)PPM_GETG(pix) * PCX_MAXVAL / maxval;
-- blurow[col] = (long)PPM_GETB(pix) * PCX_MAXVAL / maxval;
-- } else {
-- redrow[col] = PPM_GETR(pix);
-- grnrow[col] = PPM_GETG(pix);
-- blurow[col] = PPM_GETB(pix);
-+ write_header(stdout, cols, rows, 8, 3, NULL, xPos, yPos);
-+ for( row = 0; row < rows; row++ ) {
-+ register pixel *pP = pixels[row];
-+ for( col = 0; col < cols; col++, pP++ ) {
-+ if( maxval != PCX_MAXVAL ) {
-+ redrow[col] = (long)PPM_GETR(*pP) * PCX_MAXVAL / maxval;
-+ greenrow[col] = (long)PPM_GETG(*pP) * PCX_MAXVAL / maxval;
-+ bluerow[col] = (long)PPM_GETB(*pP) * PCX_MAXVAL / maxval;
-+ }
-+ else {
-+ redrow[col] = PPM_GETR(*pP);
-+ greenrow[col] = PPM_GETG(*pP);
-+ bluerow[col] = PPM_GETB(*pP);
- }
- }
-- pcxEncode(stdout, redrow, cols);
-- pcxEncode(stdout, grnrow, cols);
-- pcxEncode(stdout, blurow, cols);
-+ PCXEncode(stdout, redrow, cols);
-+ PCXEncode(stdout, greenrow, cols);
-+ PCXEncode(stdout, bluerow, cols);
- }
-- free(blurow);
-- free(grnrow);
-- free(redrow);
-+ pm_freerow((void*)bluerow);
-+ pm_freerow((void*)greenrow);
-+ pm_freerow((void*)redrow);
- }
-
-
-
--static const struct PcxCmapEntry
-+static const struct pcxCmapEntry
- stdPalette[] = {
- { 0, 0, 0 },
- { 0, 0, 170 },
-@@ -653,19 +607,20 @@ putPcxColorInHash(colorhash_table const
-
-
- static void
--generateStandardPalette(struct PcxCmapEntry ** const pcxcmapP,
-+generateStandardPalette(struct pcxCmapEntry ** const pcxcmapP,
- pixval const maxval,
- colorhash_table * const chtP,
-- unsigned int * const colorsP) {
-+ int * const colorsP) {
-
- unsigned int const stdPaletteSize = 16;
--
-- unsigned int colorIndex;
-- struct PcxCmapEntry * pcxcmap;
-- colorhash_table cht;
-+ unsigned int colorIndex;
-+ struct pcxCmapEntry * pcxcmap;
-+ colorhash_table cht;
-
- MALLOCARRAY_NOFAIL(pcxcmap, MAXCOLORS);
-
-+ *pcxcmapP = pcxcmap;
-+
- cht = ppm_alloccolorhash();
-
- for (colorIndex = 0; colorIndex < stdPaletteSize; ++colorIndex) {
-@@ -692,7 +647,6 @@ generateStandardPalette(struct PcxCmapEn
- pcxcmap[colorIndex].b = 0;
- }
-
-- *pcxcmapP = pcxcmap;
- *chtP = cht;
- *colorsP = stdPaletteSize;
- }
-@@ -721,10 +675,11 @@ readPpmPalette(const char * const pale
- *paletteSizeP, MAXCOLORS);
-
- {
-- unsigned int j;
-- unsigned int row;
-- for (row = 0, j = 0; row < rows; ++row) {
-- unsigned int col;
-+ int j;
-+ int row;
-+ j = 0; /* initial value */
-+ for (row = 0; row < rows; ++row) {
-+ int col;
- for (col = 0; col < cols; ++col)
- (*ppmPaletteP)[j++] = pixels[row][col];
- }
-@@ -735,16 +690,16 @@ readPpmPalette(const char * const pale
-
-
- static void
--readPaletteFromFile(struct PcxCmapEntry ** const pcxcmapP,
-+readPaletteFromFile(struct pcxCmapEntry ** const pcxcmapP,
- const char * const paletteFileName,
- pixval const maxval,
- colorhash_table * const chtP,
-- unsigned int * const colorsP) {
-+ int * const colorsP) {
-
- unsigned int colorIndex;
- pixel ppmPalette[MAXCOLORS];
- unsigned int paletteSize;
-- struct PcxCmapEntry * pcxcmap;
-+ struct pcxCmapEntry * pcxcmap;
- colorhash_table cht;
-
- readPpmPalette(paletteFileName, &ppmPalette, &paletteSize);
-@@ -777,7 +732,7 @@ readPaletteFromFile(struct PcxCmapEntry
-
- static void
- moveBlackToIndex0(colorhist_vector const chv,
-- unsigned int const colorCt) {
-+ int const colors) {
- /*----------------------------------------------------------------------------
- If black is in the palette, make it at Index 0.
- -----------------------------------------------------------------------------*/
-@@ -789,7 +744,7 @@ moveBlackToIndex0(colorhist_vector const
-
- blackPresent = FALSE; /* initial assumption */
-
-- for (i = 0; i < colorCt; ++i)
-+ for (i = 0; i < colors; ++i)
- if (PPM_EQUAL(chv[i].color, blackPixel))
- blackPresent = TRUE;
-
-@@ -798,11 +753,10 @@ moveBlackToIndex0(colorhist_vector const
- beginning of the table and if the color is already elsewhere in
- the table, removes it.
- */
-- int colorCt2;
--
-- colorCt2 = colorCt;
-- ppm_addtocolorhist(chv, &colorCt2, MAXCOLORS, &blackPixel, 0, 0);
-- assert(colorCt2 == colorCt);
-+ int colors2;
-+ colors2 = colors;
-+ ppm_addtocolorhist(chv, &colors2, MAXCOLORS, &blackPixel, 0, 0);
-+ assert(colors2 == colors);
- }
- }
-
-@@ -810,12 +764,12 @@ moveBlackToIndex0(colorhist_vector const
-
- static void
- makePcxColormapFromImage(pixel ** const pixels,
-- unsigned int const cols,
-- unsigned int const rows,
-+ int const cols,
-+ int const rows,
- pixval const maxval,
-- struct PcxCmapEntry ** const pcxcmapP,
-+ struct pcxCmapEntry ** const pcxcmapP,
- colorhash_table * const chtP,
-- unsigned int * const colorCtP,
-+ int * const colorsP,
- bool * const tooManyColorsP) {
- /*----------------------------------------------------------------------------
- Make a colormap (palette) for the PCX header that can be used
-@@ -831,29 +785,29 @@ makePcxColormapFromImage(pixel **
- Iff there are too many colors to do that (i.e. more than 256),
- return *tooManyColorsP == TRUE.
- -----------------------------------------------------------------------------*/
-- int colorCt;
-+ int colors;
- colorhist_vector chv;
-
- pm_message("computing colormap...");
-
-- chv = ppm_computecolorhist(pixels, cols, rows, MAXCOLORS, &colorCt);
-+ chv = ppm_computecolorhist(pixels, cols, rows, MAXCOLORS, &colors);
- if (chv == NULL)
- *tooManyColorsP = TRUE;
- else {
-- unsigned int i;
-- struct PcxCmapEntry * pcxcmap;
-+ int i;
-+ struct pcxCmapEntry * pcxcmap;
-
- *tooManyColorsP = FALSE;
-
-- pm_message("%d colors found", colorCt);
-+ pm_message("%d colors found", colors);
-
-- moveBlackToIndex0(chv, colorCt);
-+ moveBlackToIndex0(chv, colors);
-
- MALLOCARRAY_NOFAIL(pcxcmap, MAXCOLORS);
-
- *pcxcmapP = pcxcmap;
-
-- for (i = 0; i < colorCt; ++i) {
-+ for (i = 0; i < colors; ++i) {
- pixel p;
-
- PPM_DEPTH(p, chv[i].color, maxval, PCX_MAXVAL);
-@@ -870,9 +824,9 @@ makePcxColormapFromImage(pixel **
- pcxcmap[i].b = 0;
- }
-
-- *chtP = ppm_colorhisttocolorhash(chv, colorCt);
-+ *chtP = ppm_colorhisttocolorhash(chv, colors);
-
-- *colorCtP = colorCt;
-+ *colorsP = colors;
-
- ppm_freecolorhist(chv);
- }
-@@ -882,43 +836,43 @@ makePcxColormapFromImage(pixel **
-
- static void
- ppmToPalettePcx(pixel ** const pixels,
-- unsigned int const cols,
-- unsigned int const rows,
-+ int const cols,
-+ int const rows,
- pixval const maxval,
- unsigned int const xPos,
- unsigned int const yPos,
-- struct PcxCmapEntry const pcxcmap[],
-+ struct pcxCmapEntry const pcxcmap[],
- colorhash_table const cht,
-- unsigned int const colorCt,
-+ int const colors,
- bool const packbits,
- unsigned int const planes,
-- bool const use8Bit) {
-+ bool const use_8_bit) {
-
- /* convert image */
-- if (colorCt <= 16 && !use8Bit )
-- ppmTo16ColorPcx(pixels, cols, rows, pcxcmap, colorCt, cht,
-+ if( colors <= 16 && !use_8_bit )
-+ ppmTo16ColorPcx(pixels, cols, rows, pcxcmap, colors, cht,
- packbits, planes, xPos, yPos);
- else
-- ppmTo256ColorPcx(pixels, cols, rows, pcxcmap, colorCt, cht,
-+ ppmTo256ColorPcx(pixels, cols, rows, pcxcmap, colors, cht,
- xPos, yPos);
- }
-
-
-
- int
--main(int argc, const char *argv[]) {
-+main(int argc, char *argv[]) {
-
-- struct CmdlineInfo cmdline;
-- FILE * ifP;
-+ struct cmdlineInfo cmdline;
-+ FILE* ifP;
- int rows, cols;
- pixval maxval;
- pixel **pixels;
-- struct PcxCmapEntry * pcxcmap;
-+ struct pcxCmapEntry * pcxcmap;
- colorhash_table cht;
- bool truecolor;
-- unsigned int colorCt;
-+ int colors;
-
-- pm_proginit(&argc, argv);
-+ ppm_init(&argc, argv);
-
- parseCommandLine(argc, argv, &cmdline);
-
-@@ -931,15 +885,15 @@ main(int argc, const char *argv[]) {
- else {
- if (cmdline.stdpalette) {
- truecolor = FALSE;
-- generateStandardPalette(&pcxcmap, maxval, &cht, &colorCt);
-+ generateStandardPalette(&pcxcmap, maxval, &cht, &colors);
- } else if (cmdline.palette) {
- truecolor = FALSE;
- readPaletteFromFile(&pcxcmap, cmdline.palette, maxval,
-- &cht, &colorCt);
-+ &cht, &colors);
- } else {
- bool tooManyColors;
- makePcxColormapFromImage(pixels, cols, rows, maxval,
-- &pcxcmap, &cht, &colorCt,
-+ &pcxcmap, &cht, &colors,
- &tooManyColors);
-
- if (tooManyColors) {
-@@ -958,8 +912,8 @@ main(int argc, const char *argv[]) {
- else {
- ppmToPalettePcx(pixels, cols, rows, maxval,
- cmdline.xpos, cmdline.ypos,
-- pcxcmap, cht, colorCt, cmdline.packed,
-- cmdline.planes, cmdline.use8Bit);
-+ pcxcmap, cht, colors, cmdline.packed,
-+ cmdline.planes, cmdline.use_8_bit);
-
- ppm_freecolorhash(cht);
- free(pcxcmap);
-diff -ruNp a/converter/ppm/ppmtopict.c b/converter/ppm/ppmtopict.c
---- a/converter/ppm/ppmtopict.c 2021-06-02 15:53:59.846205765 +0200
-+++ b/converter/ppm/ppmtopict.c 2021-06-02 20:23:21.824634387 +0200
-@@ -450,6 +450,8 @@ main(int argc, const char ** argv) {
- putShort(stdout, 0); /* mode */
-
- /* Finally, write out the data. */
+ overflow_add(cols/MAX_COUNT, 1);
+ overflow_add(cols, cols/MAX_COUNT+1);
- outBuf = malloc((unsigned)(cols+cols/MAX_COUNT+1));
- for (row = 0, oc = 0; row < rows; ++row) {
- unsigned int rowSize;
-diff -ruNp a/converter/ppm/ppmtopj.c b/converter/ppm/ppmtopj.c
---- a/converter/ppm/ppmtopj.c 2021-06-02 15:53:59.845205755 +0200
-+++ b/converter/ppm/ppmtopj.c 2021-06-02 20:23:21.824634387 +0200
-@@ -179,6 +179,7 @@ char *argv[];
- pixels = ppm_readppm( ifp, &cols, &rows, &maxval );
-
- pm_close( ifp );
-+ overflow2(cols,2);
- obuf = (unsigned char *) pm_allocrow(cols, sizeof(unsigned char));
- cbuf = (unsigned char *) pm_allocrow(cols * 2, sizeof(unsigned char));
-
-diff -ruNp a/converter/ppm/ppmtopjxl.c b/converter/ppm/ppmtopjxl.c
---- a/converter/ppm/ppmtopjxl.c 2021-06-02 15:53:59.845205755 +0200
-+++ b/converter/ppm/ppmtopjxl.c 2021-06-02 20:23:21.825634396 +0200
-@@ -267,6 +267,9 @@ main(int argc, const char * argv[]) {
++
+ MALLOCARRAY(outBuf, cols + cols/MAX_COUNT + 1);
+ if (!outBuf)
+ pm_error("Unable to allocate %u-byte row buffer",
+diff -urNp a/converter/ppm/ppmtopjxl.c b/converter/ppm/ppmtopjxl.c
+--- a/converter/ppm/ppmtopjxl.c 2025-02-03 09:24:28.331500558 +0100
++++ b/converter/ppm/ppmtopjxl.c 2025-02-03 18:48:46.550503012 +0100
+@@ -535,6 +535,8 @@ main(int argc, const char * argv[]) {
+ pm_error("image too large; reduce with ppmscale");
if (maxval > PCL_MAXVAL)
pm_error("color range too large; reduce with ppmcscale");
-
+ if (cols < 0 || rows < 0)
+ pm_error("negative size is not possible");
-+
- /* Figure out the colormap. */
- pm_message("Computing colormap...");
- chv = ppm_computecolorhist(pixels, cols, rows, MAXCOLORS, &colors);
-@@ -286,6 +289,8 @@ main(int argc, const char * argv[]) {
- case 0: /* direct mode (no palette) */
- bpp = bitsperpixel(maxval); /* bits per pixel */
- bpg = bpp; bpb = bpp;
-+ overflow2(bpp, 3);
-+ overflow_add(bpp*3, 7);
- bpp = (bpp*3+7)>>3; /* bytes per pixel now */
- bpr = (bpp<<3)-bpg-bpb;
- bpp *= cols; /* bytes per row now */
-@@ -295,9 +300,13 @@ main(int argc, const char * argv[]) {
- case 3: case 7: pclindex++;
- default:
- bpp = 8/pclindex;
-+ overflow_add(cols, bpp);
-+ if(bpp == 0)
-+ pm_error("assert: no bpp");
- bpp = (cols+bpp-1)/bpp; /* bytes per row */
- }
- }
-+ overflow2(bpp,2);
- inrow = (char *)malloc((unsigned)bpp);
- outrow = (char *)malloc((unsigned)bpp*2);
- runcnt = (signed char *)malloc((unsigned)bpp);
-diff -ruNp a/converter/ppm/ppmtowinicon.c b/converter/ppm/ppmtowinicon.c
---- a/converter/ppm/ppmtowinicon.c 2021-06-02 15:53:59.845205755 +0200
-+++ b/converter/ppm/ppmtowinicon.c 2021-06-02 20:23:21.825634396 +0200
-@@ -12,6 +12,7 @@
+ computeColormap(pixels, cols, rows, MAXCOLORS, &chv, &cht, &colorCt);
+
+diff -urNp a/converter/ppm/ppmtowinicon.c b/converter/ppm/ppmtowinicon.c
+--- a/converter/ppm/ppmtowinicon.c 2025-02-03 09:24:28.330500563 +0100
++++ b/converter/ppm/ppmtowinicon.c 2025-02-03 18:56:25.509890831 +0100
+@@ -14,6 +14,7 @@
+ #include
#include
#include
+#include
#include "pm_c_util.h"
#include "winico.h"
-@@ -214,6 +215,7 @@ createAndBitmap (gray ** const ba, int c
- MALLOCARRAY_NOFAIL(rowData, rows);
- icBitmap->xBytes = xBytes;
- icBitmap->data = rowData;
-+ overflow2(xBytes, rows);
- icBitmap->size = xBytes * rows;
- for (y=0;yxBytes = xBytes;
- icBitmap->data = rowData;
-+ overflow2(xBytes, rows);
- icBitmap->size = xBytes * rows;
-
- for (y=0;yxBytes = xBytes;
- icBitmap->data = rowData;
-+ overflow2(xBytes, rows);
- icBitmap->size = xBytes * rows;
-
- for (y=0;ybitcount = bpp;
- entry->ih = createInfoHeader(entry, xorBitmap, andBitmap);
- entry->colors = palette->colors;
-- entry->size_in_bytes =
-+ overflow2(4, entry->color_count);
-+ overflow_add(xorBitmap->size, andBitmap->size);
-+ overflow_add(xorBitmap->size + andBitmap->size, 40);
-+ overflow_add(xorBitmap->size + andBitmap->size + 40, 4 * entry->color_count);
-+ entry->size_in_bytes =
- xorBitmap->size + andBitmap->size + 40 + (4 * entry->color_count);
- if (verbose)
- pm_message("entry->size_in_bytes = %d + %d + %d = %d",
-diff -ruNp a/converter/ppm/ppmtoxpm.c b/converter/ppm/ppmtoxpm.c
---- a/converter/ppm/ppmtoxpm.c 2021-06-02 15:53:59.846205765 +0200
-+++ b/converter/ppm/ppmtoxpm.c 2021-06-02 20:23:21.826634405 +0200
-@@ -198,6 +198,7 @@ genNumstr(unsigned int const input, int
+@@ -207,6 +208,7 @@ newAndBitmap(gray ** const ba,
+ MALLOCARRAY_NOFAIL(rowData, rows);
+ icBitmapP->xBytes = xByteCt;
+ icBitmapP->data = rowData;
++ overflow2(xByteCt, rows);
+ icBitmapP->size = xByteCt * rows;
+ for (row = 0; row < rows; ++row) {
+ u1 * thisRow; /* malloc'ed */
+@@ -706,6 +708,11 @@ addEntryToIcon(MS_Ico * const MSIcon
+ /* all the icons I looked at ignored this value */
+ entryP->ih = newInfoHeader(*entryP);
+ entryP->colors = paletteP->colors;
++ overflow2(4, entryCols);
++ overflow_add(xorBitmapP->size, andBitmapP->size);
++ overflow_add(xorBitmapP->size + andBitmapP->size, 40);
++ overflow_add(xorBitmapP->size + andBitmapP->size + 40, 4 * entryCols);
++
+ entryP->size_in_bytes =
+ xorBitmapP->size + andBitmapP->size + 40 + (4 * entryCols);
+ if (verbose)
+diff -urNp a/converter/ppm/ppmtoxpm.c b/converter/ppm/ppmtoxpm.c
+--- a/converter/ppm/ppmtoxpm.c 2025-02-03 09:24:28.329500569 +0100
++++ b/converter/ppm/ppmtoxpm.c 2025-02-03 18:59:21.646266347 +0100
+@@ -193,6 +193,7 @@ numstr(unsigned int const input,
unsigned int i;
/* Allocate memory for printed number. Abort if error. */
-+ overflow_add(digits, 1);
- if (!(str = (char *) malloc(digits + 1)))
- pm_error("out of memory");
++ overflow_add(digitCt, 1);
+ MALLOCARRAY_NOFAIL(str, digitCt + 1);
-@@ -315,6 +316,7 @@ genCmap(colorhist_vector const chv,
- unsigned int charsPerPixel;
- unsigned int xpmMaxval;
-
+ i = input; /* initial value */
+@@ -296,6 +297,7 @@ genCmap(colorhist_vector const chv,
+ Return as *charsPerPixel the number of characters, or digits, that
+ will be needed in the XPM raster to form an index into this color map.
+ -----------------------------------------------------------------------------*/
+ if (includeTransparent) overflow_add(ncolors, 1);
- MALLOCARRAY(cmap, cmapSize);
- if (cmapP == NULL)
- pm_error("Out of memory allocating %u bytes for a color map.",
-diff -ruNp a/converter/ppm/qrttoppm.c b/converter/ppm/qrttoppm.c
---- a/converter/ppm/qrttoppm.c 2021-06-02 15:53:59.846205765 +0200
-+++ b/converter/ppm/qrttoppm.c 2021-06-02 20:23:21.826634405 +0200
-@@ -46,7 +46,7 @@ main( argc, argv )
+ unsigned int const cmapSize = ncolors + (includeTransparent ? 1 : 0);
- ppm_writeppminit( stdout, cols, rows, maxval, 0 );
- pixelrow = ppm_allocrow( cols );
-- buf = (unsigned char *) malloc( 3 * cols );
-+ buf = (unsigned char *) malloc2( 3 , cols );
- if ( buf == (unsigned char *) 0 )
- pm_error( "out of memory" );
+ CixelMap * cmap; /* malloc'ed */
+diff -urNp a/converter/ppm/qrttoppm.c b/converter/ppm/qrttoppm.c
+--- a/converter/ppm/qrttoppm.c 2025-02-03 09:24:28.331500558 +0100
++++ b/converter/ppm/qrttoppm.c 2025-02-03 19:00:16.846070585 +0100
+@@ -51,6 +51,7 @@ main(int argc, const char ** argv) {
-diff -ruNp a/converter/ppm/sldtoppm.c b/converter/ppm/sldtoppm.c
---- a/converter/ppm/sldtoppm.c 2021-06-02 15:53:59.845205755 +0200
-+++ b/converter/ppm/sldtoppm.c 2021-06-02 20:23:21.827634413 +0200
-@@ -154,127 +154,85 @@ vscale(int * const px,
+ pixelrow = ppm_allocrow(cols);
++ overflow2(cols, 3)
+ MALLOCARRAY(buf, 3 * cols);
-
--static void
--upcase(const char * const sname,
-- char * const uname) {
--
-- unsigned int i;
-- const char * ip;
--
-- for (i = 0, ip = sname; i < 31; ++i) {
-- char const ch = *ip++;
--
-- if (ch != EOS)
-- uname[i] = islower(ch) ? toupper(ch) : ch;
-- }
-- uname[i] = EOS;
--}
--
--
--
--static void
--skipBytes(FILE * const fileP,
-- unsigned int const count) {
--
-- unsigned int i;
--
-- for (i = 0; i < count; ++i)
-- getc(fileP);
--}
--
--
--
--static void
--scanDirectory(FILE * const slFileP,
-- long const dirPos,
-- bool const dirOnly,
-- const char * const uname,
-- bool * const foundP) {
--/*----------------------------------------------------------------------------
-- Scan the directory at the current position in *slFileP, either listing
-- the directory ('dirOnly' true) or searching for a slide named
-- 'uname' ('dirOnly' false).
--
-- 'dirPos' is the offset in the file of the directory, i.e. the current
-- position of *slFileP.
--
-- In the latter case, return as *foundP whether the slide name is there.
-------------------------------------------------------------------------------*/
-- bool found;
-- bool eof;
-- long pos;
-- unsigned char libent[36];
--
-- for (found = false, eof = false, pos = dirPos; !found && !eof; ) {
-- size_t readCt;
-- readCt = fread(libent, 36, 1, slFileP);
-- if (readCt != 1)
-- eof = true;
-- else {
-- /* The directory entry is 32 bytes of NUL-terminated slide name
-- followed by 4 bytes of offset of the next directory entry.
-- */
-- const char * const slideName = (const char *)(&libent[0]);
-- if (pm_strnlen(slideName, 32) == 32)
-- pm_error("Invalid input: slide name field is not "
-- "nul-terminated");
-- else {
-- if (strlen(slideName) == 0)
-- eof = true;
-- else {
-- pos += 36;
-- if (dirOnly) {
-- pm_message(" %s", slideName);
-- } else if (streq(slideName, uname)) {
-- long const dpos =
-- (((((libent[35] << 8) | libent[34]) << 8) |
-- libent[33]) << 8) | libent[32];
--
-- if ((slFileP == stdin) ||
-- (fseek(slFileP, dpos, 0) == -1)) {
--
-- skipBytes(slFileP, dpos - pos);
-- }
-- found = true;
-- }
-- }
-- }
-- }
-- }
-- *foundP = found;
--}
--
- /* SLIDEFIND -- Find a slide in a library or, if DIRONLY is
- nonzero, print a directory listing of the library.
- If UCASEN is nonzero, the requested slide name is
- converted to upper case. */
-
- static void
--slidefind(const char * const slideName,
-- bool const dirOnly,
-+slidefind(const char * const sname,
-+ bool const dironly,
- bool const ucasen) {
-
-- char uname[32]; /* upper case translation of 'slideName' */
-- char header[32]; /* (supposed) header read from file */
-+ char uname[32];
-+ unsigned char libent[36];
-+ long pos;
- bool found;
-+ bool eof;
-
-- if (dirOnly)
-+ if (dironly)
- pm_message("Slides in library:");
- else {
-- upcase(slideName, uname);
-+ unsigned int i;
-+ const char * ip;
-+
-+ ip = sname; /* initial value */
-+
-+ for (i = 0; i < 31; ++i) {
-+ char const ch = *ip++;
-+ if (ch == EOS)
-+ break;
-+
-+ {
-+ char const upperCh =
-+ ucasen && islower(ch) ? toupper(ch) : ch;
-+
-+ uname[i] = upperCh;
-+ }
-+ }
-+ uname[i] = EOS;
- }
-
- /* Read slide library header and verify. */
--
-- if ((fread(header, 32, 1, slfile) != 1) ||
-- (!STRSEQ(header, "AutoCAD Slide Library 1.0\r\n\32"))) {
-+
-+ if ((fread(libent, 32, 1, slfile) != 1) ||
-+ (!streq((char *)libent, "AutoCAD Slide Library 1.0\015\012\32"))) {
- pm_error("not an AutoCAD slide library file.");
- }
-+ pos = 32;
-+
-+ /* Search for a slide with the requested name or list the directory */
-+
-+ for (found = false, eof = false; !found && !eof; ) {
-+ size_t readCt;
-+ readCt = fread(libent, 36, 1, slfile);
-+ if (readCt != 1)
-+ eof = true;
-+ else if (strlen((char *)libent) == 0)
-+ eof = true;
-+ }
-+ if (!eof) {
-+ pos += 36;
-+ if (dironly) {
-+ pm_message(" %s", libent);
-+ } else if (streq((char *)libent, uname)) {
-+ long dpos;
-+
-+ dpos = (((((libent[35] << 8) | libent[34]) << 8) |
-+ libent[33]) << 8) | libent[32];
-+
-+ if ((slfile == stdin) || (fseek(slfile, dpos, 0) == -1)) {
-+ dpos -= pos;
-+
-+ while (dpos-- > 0)
-+ getc(slfile);
-+ }
-+ found = true;
-+ }
-+ }
-
-- scanDirectory(slfile, 32, dirOnly, ucasen ? uname : slideName, &found);
--
-- if (!found && !dirOnly)
-- pm_error("slide '%s' not in library.", slideName);
-+ if (!found && !dironly)
-+ pm_error("slide '%s' not in library.", sname);
- }
-
-
-@@ -392,7 +350,7 @@ slider(slvecfn slvec,
-
- /* Verify that slide format is compatible with this program. */
-
-- if (!STRSEQ(slfrof.slh, slhi.slh))
-+ if (streq(slfrof.slh, slhi.slh))
- pm_error("this is not an AutoCAD slide file.");
-
- /* Verify that the number format and file level in the header are
-@@ -506,6 +464,8 @@ slider(slvecfn slvec,
+ if (!buf)
+diff -urNp a/converter/ppm/sldtoppm.c b/converter/ppm/sldtoppm.c
+--- a/converter/ppm/sldtoppm.c 2025-02-03 09:24:28.330500563 +0100
++++ b/converter/ppm/sldtoppm.c 2025-02-03 19:02:13.580656717 +0100
+@@ -542,6 +542,8 @@ slider(slvecfn slvec,
/* Allocate image buffer and clear it to black. */
+ overflow_add(ixdots, 1);
+ overflow_add(iydots, 1);
- pixels = ppm_allocarray(pixcols = ixdots + 1, pixrows = iydots + 1);
- PPM_ASSIGN(rgbcolor, 0, 0, 0);
- ppmd_filledrectangle(pixels, pixcols, pixrows, pixmaxval, 0, 0,
-diff -ruNp a/converter/ppm/ximtoppm.c b/converter/ppm/ximtoppm.c
---- a/converter/ppm/ximtoppm.c 2021-06-02 15:53:59.846205765 +0200
-+++ b/converter/ppm/ximtoppm.c 2021-06-02 20:23:21.828634422 +0200
-@@ -22,9 +22,7 @@
- #include "shhopt.h"
- #include "nstring.h"
+ pixcols = ixdots + 1;
+ pixrows = iydots + 1;
+ pixels = ppm_allocarray(pixcols, pixrows);
+diff -urNp a/converter/ppm/ximtoppm.c b/converter/ppm/ximtoppm.c
+--- a/converter/ppm/ximtoppm.c 2025-02-03 09:24:28.330500563 +0100
++++ b/converter/ppm/ximtoppm.c 2025-02-03 19:06:57.979648387 +0100
+@@ -204,8 +204,7 @@ readImageChannel(FILE * const if
+ }
+ /* return to the beginning of the next image's buffer */
+ if (fseek(ifP, marker, 0) == -1) {
+- pm_message("ReadImageChannel: can't fseek to location "
+- "in image buffer");
++ pm_message("ReadImageChannel: can't fseek to location in image buffer");
+ return 0;
+ }
+ free(line);
+diff -urNp a/editor/pamcut.c b/editor/pamcut.c
+--- a/editor/pamcut.c 2025-02-03 09:24:28.296500747 +0100
++++ b/editor/pamcut.c 2025-02-04 09:20:22.743237833 +0100
+@@ -833,6 +833,8 @@ cutOneImage(FILE * const ifP
+ } else {
+ outpam = inpam; /* Initial value -- most fields should be same */
+ outpam.file = ofP;
++ overflow_add(rightcol, 1);
++ overflow_add(bottomrow, 1);
+ outpam.width = rightcol - leftcol + 1;
+ outpam.height = bottomrow - toprow + 1;
--
--
--struct CmdlineInfo {
-+struct cmdlineInfo {
- /* All the information the user supplied in the command line,
- in a form easy for the program to use.
- */
-@@ -36,8 +34,8 @@ struct CmdlineInfo {
-
-
- static void
--parseCommandLine(int argc, const char ** argv,
-- struct CmdlineInfo *cmdlineP) {
-+parseCommandLine(int argc, char ** argv,
-+ struct cmdlineInfo *cmdlineP) {
- /*----------------------------------------------------------------------------
- Note that many of the strings that this function returns in the
- *cmdlineP structure are actually in the supplied argv array. And
-@@ -59,7 +57,7 @@ parseCommandLine(int argc, const char **
- 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);
-+ pm_optParseOptions3(&argc, argv, opt, sizeof(opt), 0);
- /* Uses and sets argc, argv, and all of *cmdlineP. */
-
- if (!alphaoutSpec)
-@@ -102,11 +100,6 @@ ReadXimHeader(FILE * const in_fp,
- pm_message("ReadXimHeader: unable to read file header" );
- return(0);
- }
-- /* Force broken ASCIIZ strings to at least be valid ASCIIZ */
-- a_head.author [sizeof(a_head.author) - 1] = '\0';
-- a_head.date [sizeof(a_head.date) - 1] = '\0';
-- a_head.program[sizeof(a_head.program) - 1] = '\0';
--
- if (atoi(a_head.header_size) != sizeof(ImageHeader)) {
- pm_message("ReadXimHeader: header size mismatch" );
- return(0);
-@@ -120,15 +113,39 @@ ReadXimHeader(FILE * const in_fp,
- header->ncolors = atoi(a_head.num_colors);
- header->nchannels = atoi(a_head.num_channels);
- header->bytes_per_line = atoi(a_head.bytes_per_line);
--#if 0
-- header->npics = atoi(a_head.num_pictures);
--#endif
-+/* header->npics = atoi(a_head.num_pictures);
-+*/
- header->bits_channel = atoi(a_head.bits_per_channel);
- header->alpha_flag = atoi(a_head.alpha_channel);
-- header->author = pm_strdup(a_head.author);
-- header->date = pm_strdup(a_head.date);
-- header->program = pm_strdup(a_head.program);
--
-+ if (strlen(a_head.author)) {
-+ overflow_add(strlen(a_head.author),1);
-+ if (!(header->author = calloc((unsigned int)strlen(a_head.author)+1,
-+ 1))) {
-+ pm_message("ReadXimHeader: can't calloc author string" );
-+ return(0);
-+ }
-+ header->width = atoi(a_head.image_width);
-+ strncpy(header->author, a_head.author, strlen(a_head.author));
-+ }
-+ if (strlen(a_head.date)) {
-+ overflow_add(strlen(a_head.date),1);
-+ if (!(header->date =calloc((unsigned int)strlen(a_head.date)+1,1))){
-+ pm_message("ReadXimHeader: can't calloc date string" );
-+ return(0);
-+ }
-+ header->width = atoi(a_head.image_width);
-+ strncpy(header->date, a_head.date, strlen(a_head.date));
-+ }
-+ if (strlen(a_head.program)) {
-+ overflow_add(strlen(a_head.program),1);
-+ if (!(header->program = calloc(
-+ (unsigned int)strlen(a_head.program) + 1, 1))) {
-+ pm_message("ReadXimHeader: can't calloc program string" );
-+ return(0);
-+ }
-+ header->width = atoi(a_head.image_width);
-+ strncpy(header->program, a_head.program,strlen(a_head.program));
-+ }
- /* Do double checking for backwards compatibility */
- if (header->npics == 0)
- header->npics = 1;
-@@ -147,6 +164,7 @@ ReadXimHeader(FILE * const in_fp,
- if (header->nchannels == 3 && header->bits_channel == 8)
- header->ncolors = 0;
- else if (header->nchannels == 1 && header->bits_channel == 8) {
-+ overflow2(header->ncolors, sizeof(Color));
- header->colors = (Color *)calloc((unsigned int)header->ncolors,
- sizeof(Color));
- if (header->colors == NULL) {
-@@ -197,8 +215,7 @@ ReadImageChannel(FILE * const in
- }
- /* return to the beginning of the next image's buffer */
- if (fseek(infp, marker, 0) == -1) {
-- pm_message("ReadImageChannel: can't fseek to location "
-- "in image buffer");
-+ pm_message("ReadImageChannel: can't fseek to location in image buffer" );
- return(0);
- }
- free((char *)line);
-@@ -307,26 +324,28 @@ ReadXimImage(FILE * const in_fp,
- ***********************************************************************/
-
- static int
--ReadXim(FILE * const in_fp,
-- XimImage * const xim) {
--
-+ReadXim(in_fp, xim)
-+ FILE *in_fp;
-+ XimImage *xim;
-+{
- if (!ReadXimHeader(in_fp, xim)) {
- pm_message("can't read xim header" );
-- return 0;
-- } else if (!ReadXimImage(in_fp, xim)) {
-+ return(0);
-+ }
-+ if (!ReadXimImage(in_fp, xim)) {
- pm_message("can't read xim data" );
-- return 0;
-- } else
-- return 1;
-+ return(0);
-+ }
-+ return(1);
- }
-
-
-
- int
--main(int argc,
-- const char **argv) {
-+main(int argc,
-+ char *argv[]) {
-
-- struct CmdlineInfo cmdline;
-+ struct cmdlineInfo cmdline;
- FILE *ifP, *imageout_file, *alpha_file;
- XimImage xim;
- pixel *pixelrow, colormap[256];
-@@ -338,7 +357,7 @@ main(int argc,
- pixval maxval;
- bool success;
-
-- pm_proginit(&argc, argv);
-+ ppm_init(&argc, argv);
-
- parseCommandLine(argc, argv, &cmdline);
-
-diff -ruNp a/editor/pamcut.c b/editor/pamcut.c
---- a/editor/pamcut.c 2021-06-02 15:53:59.809205409 +0200
-+++ b/editor/pamcut.c 2021-06-02 20:23:21.828634422 +0200
-@@ -799,6 +799,8 @@ cutOneImage(FILE * const ifP
-
- outpam = inpam; /* Initial value -- most fields should be same */
- outpam.file = ofP;
-+ overflow_add(rightcol, 1);
-+ overflow_add(bottomrow, 1);
- outpam.width = rightcol - leftcol + 1;
- outpam.height = bottomrow - toprow + 1;
-
-diff -ruNp a/editor/pnmgamma.c b/editor/pnmgamma.c
---- a/editor/pnmgamma.c 2021-06-02 15:53:59.805205371 +0200
-+++ b/editor/pnmgamma.c 2021-06-02 20:23:21.829634431 +0200
+diff -urNp a/editor/pnmgamma.c b/editor/pnmgamma.c
+--- a/editor/pnmgamma.c 2025-02-03 09:24:28.296500747 +0100
++++ b/editor/pnmgamma.c 2025-02-04 09:21:03.587045507 +0100
@@ -596,6 +596,7 @@ createGammaTables(enum transferFunction
xelval ** const btableP) {
@@ -2619,10 +619,10 @@ diff -ruNp a/editor/pnmgamma.c b/editor/pnmgamma.c
MALLOCARRAY(*rtableP, maxval+1);
MALLOCARRAY(*gtableP, maxval+1);
MALLOCARRAY(*btableP, maxval+1);
-diff -ruNp a/editor/pnmhisteq.c b/editor/pnmhisteq.c
---- a/editor/pnmhisteq.c 2021-06-02 15:53:59.800205323 +0200
-+++ b/editor/pnmhisteq.c 2021-06-02 20:23:21.829634431 +0200
-@@ -107,6 +107,7 @@ computeLuminosityHistogram(xel * const *
+diff -urNp a/editor/pnmhisteq.c b/editor/pnmhisteq.c
+--- a/editor/pnmhisteq.c 2025-02-03 09:24:28.296500747 +0100
++++ b/editor/pnmhisteq.c 2025-02-04 09:21:41.957864812 +0100
+@@ -106,6 +106,7 @@ computeLuminosityHistogram(xel * const *
unsigned int pixelCount;
unsigned int * lumahist;
@@ -2630,11 +630,10 @@ diff -ruNp a/editor/pnmhisteq.c b/editor/pnmhisteq.c
MALLOCARRAY(lumahist, maxval + 1);
if (lumahist == NULL)
pm_error("Out of storage allocating array for %u histogram elements",
-diff --git a/editor/pnmpad.c b/editor/pnmpad.c
-index 9fa9f9e..6b98204 100644
---- a/editor/pnmpad.c
-+++ b/editor/pnmpad.c
-@@ -654,6 +654,8 @@ main(int argc, const char ** argv) {
+diff -urNp a/editor/pnmpad.c b/editor/pnmpad.c
+--- a/editor/pnmpad.c 2025-02-03 09:24:28.299500730 +0100
++++ b/editor/pnmpad.c 2025-02-04 09:22:39.237595043 +0100
+@@ -1127,6 +1127,8 @@ main(int argc, const char ** argv) {
computePadSizes(cmdline, cols, rows, &lpad, &rpad, &tpad, &bpad);
@@ -2643,17 +642,17 @@ index 9fa9f9e..6b98204 100644
newcols = cols + lpad + rpad;
if (cmdline.reportonly)
-diff -ruNp a/editor/pnmremap.c b/editor/pnmremap.c
---- a/editor/pnmremap.c 2021-06-02 15:53:59.809205409 +0200
-+++ b/editor/pnmremap.c 2021-06-02 20:23:21.830634440 +0200
-@@ -470,6 +470,7 @@ fserr_init(struct pam * const pamP,
-
- unsigned int const fserrSize = pamP->width + 2;
+diff -urNp a/editor/pnmremap.c b/editor/pnmremap.c
+--- a/editor/pnmremap.c 2025-02-03 09:24:28.296500747 +0100
++++ b/editor/pnmremap.c 2025-02-04 09:42:44.340919042 +0100
+@@ -468,6 +468,7 @@ fserr_init(struct pam * const pamP,
+ -----------------------------------------------------------------------------*/
+ unsigned int plane;
+ overflow_add(pamP->width, 2);
- fserrP->width = pamP->width;
+ unsigned int const fserrSz = pamP->width + 2;
- MALLOCARRAY(fserrP->thiserr, pamP->depth);
+ fserrP->width = pamP->width;
@@ -508,6 +509,7 @@ floydInitRow(struct pam * const pamP,
unsigned int col;
@@ -2662,98 +661,82 @@ diff -ruNp a/editor/pnmremap.c b/editor/pnmremap.c
for (col = 0; col < pamP->width + 2; ++col) {
unsigned int plane;
for (plane = 0; plane < pamP->depth; ++plane)
-diff -ruNp a/editor/pnmscalefixed.c b/editor/pnmscalefixed.c
---- a/editor/pnmscalefixed.c 2021-06-02 15:53:59.800205323 +0200
-+++ b/editor/pnmscalefixed.c 2021-06-02 20:23:21.830634440 +0200
-@@ -214,6 +214,7 @@ compute_output_dimensions(const struct c
+diff -urNp a/editor/pnmscalefixed.c b/editor/pnmscalefixed.c
+--- a/editor/pnmscalefixed.c 2025-02-03 09:24:28.299500730 +0100
++++ b/editor/pnmscalefixed.c 2025-02-04 09:49:53.152275133 +0100
+@@ -215,6 +215,7 @@ compute_output_dimensions(const struct c
const int rows, const int cols,
int * newrowsP, int * newcolsP) {
+ overflow2(rows, cols);
if (cmdline.pixels) {
- if (rows * cols <= cmdline.pixels) {
+ if (rows <= cmdline.pixels / cols) {
*newrowsP = rows;
-@@ -265,6 +266,8 @@ compute_output_dimensions(const struct c
-
- if (*newcolsP < 1) *newcolsP = 1;
- if (*newrowsP < 1) *newrowsP = 1;
-+
-+ overflow2(*newcolsP, *newrowsP);
- }
-
-
-@@ -446,6 +449,9 @@ main(int argc, char **argv ) {
- unfilled. We can address that by stretching, whereas the other
- case would require throwing away some of the input.
- */
+@@ -222,6 +223,8 @@ compute_output_dimensions(const struct c
+ } else {
+ const double scale =
+ sqrt( (float) cmdline.pixels / ((float) cols * (float) rows));
++ overflow2(rows, scale);
++ overflow2(scale, cols);
+ *newrowsP = rows * scale;
+ *newcolsP = cols * scale;
+ }
+@@ -455,6 +458,9 @@ main(int argc, char **argv ) {
+ pm_error("New image width (%d) is uncomputably large", newcols);
+ if (newrows > INT_MAX / SCALE)
+ pm_error("New image height (%d) is uncomputably large", newrows);
+
+ overflow2(newcols, SCALE);
+ overflow2(newrows, SCALE);
sxscale = SCALE * newcols / cols;
syscale = SCALE * newrows / rows;
-diff -ruNp a/editor/ppmdither.c b/editor/ppmdither.c
---- a/editor/ppmdither.c 2021-06-02 15:53:59.803205352 +0200
-+++ b/editor/ppmdither.c 2021-06-02 20:23:21.831634448 +0200
-@@ -356,6 +356,11 @@ dithMatrix(unsigned int const dithPower)
- (dithDim * sizeof(*dithMat)) + /* pointers */
- (dithDim * dithDim * sizeof(**dithMat)); /* data */
-
-+
-+ overflow2(dithDim, sizeof(*dithMat));
-+ overflow3(dithDim, dithDim, sizeof(**dithMat));
-+ overflow_add(dithDim * sizeof(*dithMat), dithDim * dithDim * sizeof(**dithMat));
-+
- dithMat = malloc(dithMatSize);
-
- if (dithMat == NULL)
-diff -ruNp a/editor/specialty/pamoil.c b/editor/specialty/pamoil.c
---- a/editor/specialty/pamoil.c 2021-06-02 15:53:59.817205486 +0200
-+++ b/editor/specialty/pamoil.c 2021-06-02 20:23:21.831634448 +0200
-@@ -112,6 +112,7 @@ main(int argc, char *argv[] ) {
- tuples = pnm_readpam(ifp, &inpam, PAM_STRUCT_SIZE(tuple_type));
- pm_close(ifp);
+diff -urNp a/editor/specialty/pamoil.c b/editor/specialty/pamoil.c
+--- a/editor/specialty/pamoil.c 2025-02-03 09:24:28.301500720 +0100
++++ b/editor/specialty/pamoil.c 2025-02-04 09:56:21.543650456 +0100
+@@ -185,6 +185,7 @@ main(int argc, const char ** argv) {
+
+ tuples = pnm_readpam(ifP, &inpam, PAM_STRUCT_SIZE(tuple_type));
+ overflow_add(inpam.maxval, 1);
MALLOCARRAY(hist, inpam.maxval + 1);
if (hist == NULL)
pm_error("Unable to allocate memory for histogram.");
-diff -ruNp a/lib/libpam.c b/lib/libpam.c
---- a/lib/libpam.c 2021-06-02 15:53:59.867205967 +0200
-+++ b/lib/libpam.c 2021-06-02 20:23:21.832634457 +0200
-@@ -225,7 +225,8 @@ allocPamRow(const struct pam * const pam
+diff -urNp a/lib/libpam.c b/lib/libpam.c
+--- a/lib/libpam.c 2025-02-03 09:24:28.326500585 +0100
++++ b/lib/libpam.c 2025-02-04 10:04:33.126859799 +0100
+@@ -258,6 +258,7 @@ allocPamRow(const struct pam * const pam
unsigned int const bytesPerTuple = allocationDepth(pamP) * sizeof(sample);
tuple * tuplerow;
-- tuplerow = malloc(pamP->width * (sizeof(tuple *) + bytesPerTuple));
+ overflow_add(sizeof(tuple *), bytesPerTuple);
-+ tuplerow = malloc2(pamP->width, (sizeof(tuple *) + bytesPerTuple));
+ tuplerow = malloc(pamP->width * (sizeof(tuple *) + bytesPerTuple));
if (tuplerow != NULL) {
- /* Now we initialize the pointers to the individual tuples
-diff -ruNp a/lib/libpammap.c b/lib/libpammap.c
---- a/lib/libpammap.c 2021-06-02 15:53:59.867205967 +0200
-+++ b/lib/libpammap.c 2021-06-02 20:23:00.658449503 +0200
-@@ -108,6 +108,8 @@ allocTupleIntListItem(struct pam * const
- */
- struct tupleint_list_item * retval;
+diff -urNp a/lib/libpammap.c b/lib/libpammap.c
+--- a/lib/libpammap.c 2025-02-03 09:24:28.325500590 +0100
++++ b/lib/libpammap.c 2025-02-04 10:05:45.382614292 +0100
+@@ -111,6 +111,9 @@ allocTupleIntListItem(struct pam * const
+ if (pamP->depth > (UINT_MAX - sizeof(*retval)) / sizeof(sample))
+ pm_error("Depth %u is too large for computation", pamP->depth);
+ overflow2(pamP->depth, sizeof(sample));
+ overflow_add(sizeof(*retval)-sizeof(retval->tupleint.tuple), pamP->depth*sizeof(sample));
++
unsigned int const size =
sizeof(*retval) - sizeof(retval->tupleint.tuple)
+ pamP->depth * sizeof(sample);
-diff -ruNp a/lib/libpm.c b/lib/libpm.c
---- a/lib/libpm.c 2021-06-02 15:53:59.867205967 +0200
-+++ b/lib/libpm.c 2021-06-02 20:23:21.832634457 +0200
-@@ -888,5 +888,53 @@ pm_parse_height(const char * const arg)
- return height;
+diff -urNp a/lib/libpm.c b/lib/libpm.c
+--- a/lib/libpm.c 2025-02-03 09:24:28.324500595 +0100
++++ b/lib/libpm.c 2025-02-04 10:27:02.795619696 +0100
+@@ -926,4 +926,52 @@ pm_parse_maxval(const char * const arg)
+ return maxval;
}
+/*
-+ * Maths wrapping
++ * Maths wrapping
+ */
-
++
+void __overflow2(int a, int b)
+{
+ if(a < 0 || b < 0)
@@ -2791,21 +774,20 @@ diff -ruNp a/lib/libpm.c b/lib/libpm.c
+ pm_error("Zero byte allocation");
+ return malloc(a*b*c);
+}
-+
+void *realloc2(void * a, int b, int c)
+{
-+ overflow2(b, c);
-+ if(b*c == 0)
++ overflow2(b, c);
++ if(b*c == 0)
+ pm_error("Zero byte allocation");
+ return realloc(a, b*c);
+}
-diff -ruNp a/lib/pm.h b/lib/pm.h
---- a/lib/pm.h 2021-06-02 15:53:59.866205957 +0200
-+++ b/lib/pm.h 2021-06-02 20:23:21.833634466 +0200
-@@ -442,5 +442,12 @@ pm_parse_height(const char * const arg);
- }
- #endif
+diff -urNp a/lib/pm.h b/lib/pm.h
+--- a/lib/pm.h 2025-02-03 09:24:28.327500579 +0100
++++ b/lib/pm.h 2025-02-04 10:28:10.427411309 +0100
+@@ -439,6 +439,13 @@ pm_parse_height(const char * const arg);
+ unsigned int
+ pm_parse_maxval(const char * const arg);
+void *malloc2(int, int);
+void *malloc3(int, int, int);
@@ -2814,45 +796,58 @@ diff -ruNp a/lib/pm.h b/lib/pm.h
+void overflow3(int, int, int);
+void overflow_add(int, int);
+
-
+ #ifdef __cplusplus
+ }
#endif
-diff -ruNp a/other/pnmcolormap.c b/other/pnmcolormap.c
---- a/other/pnmcolormap.c 2021-06-02 15:53:59.882206111 +0200
-+++ b/other/pnmcolormap.c 2021-06-02 20:23:21.833634466 +0200
-@@ -1002,6 +1002,7 @@ colormapToSquare(struct pam * const pamP
+diff -urNp a/other/pnmcolormap.c b/other/pnmcolormap.c
+--- a/other/pnmcolormap.c 2025-02-03 09:24:28.303500709 +0100
++++ b/other/pnmcolormap.c 2025-02-04 10:29:08.620231936 +0100
+@@ -1130,8 +1130,10 @@ colormapToSquare(struct pam * const pamP
+ unsigned int const intsqrt = (int)sqrt((float)colormap.size);
+ if (SQR(intsqrt) == colormap.size)
pamP->width = intsqrt;
- else
- pamP->width = intsqrt + 1;
+- else
++ else {
+ overflow_add(intsqrt, 1);
+ pamP->width = intsqrt + 1;
++ }
}
{
unsigned int const intQuotient = colormap.size / pamP->width;
-diff --git a/urt/Runput.c b/urt/Runput.c
-index 1a7f2f7..de2737b 100644
---- a/urt/Runput.c
-+++ b/urt/Runput.c
-@@ -202,6 +202,7 @@ RunSetup(rle_hdr * the_hdr)
- if ( the_hdr->background != 0 )
- {
- int i;
-+ overflow_add(the_hdr->ncolors, 1);
- rle_pixel *background =
- (rle_pixel *)malloc( (unsigned)(the_hdr->ncolors + 1) );
- int *bg_color;
-@@ -224,7 +225,7 @@ RunSetup(rle_hdr * the_hdr)
- /* Big-endian machines are harder */
- int i, nmap = (1 << the_hdr->cmaplen) *
- the_hdr->ncmap;
-- char *h_cmap = (char *)malloc( nmap * 2 );
-+ char *h_cmap = (char *)malloc2( nmap, 2 );
- if ( h_cmap == NULL )
- {
- fprintf( stderr,
-diff --git a/urt/rle.h b/urt/rle.h
-index 1e7ddd0..df45dd9 100644
---- a/urt/rle.h
-+++ b/urt/rle.h
-@@ -152,6 +152,17 @@ rle_hdr /* End of typedef. */
+diff -urNp a/urt/rle_addhist.c b/urt/rle_addhist.c
+--- a/urt/rle_addhist.c 2025-02-03 09:24:28.360500401 +0100
++++ b/urt/rle_addhist.c 2025-02-04 10:37:56.010607217 +0100
+@@ -52,6 +52,8 @@ newCommentLen(const char * const histoi
+ for (i = 0; argv[i]; ++i) {
+ size_t const thisArgLen = strlen(argv[i]);
+ if (thisArgLen < UINT_MAX - length - 100) {
++ overflow_add(length, thisArgLen);
++ overflow_add(length+thisArgLen, 1)
+ length += thisArgLen;
+ length += 1; /* For the space */
+ }
+@@ -61,10 +63,16 @@ newCommentLen(const char * const histoi
+ length += strlen(timedate);
+
+ /* Add length of padding, "on ", and length of history name plus "="*/
++ overflow_add(strlen(padding), 4);
++ overflow_add(strlen(histoire), strlen(padding) + 4);
++ overflow_add(length, strlen(histoire) + strlen(padding) + 4);
+ length += strlen(padding) + 3 + strlen(histoire) + 1;
+
+- if (old && *old)
++ overflow_add(length, 1);
++ if (old && *old) {
++ overflow_add(length, strlen(old));
+ length += strlen(old); /* add length if there. */
++ }
+
+ ++length; /* Add size of terminating NUL. */
+
+diff -urNp a/urt/rle.h b/urt/rle.h
+--- a/urt/rle.h 2025-02-03 09:24:28.360500401 +0100
++++ b/urt/rle.h 2025-02-04 10:33:12.842479585 +0100
+@@ -153,6 +153,17 @@ rle_hdr /* End of typedef. *
*/
extern rle_hdr rle_dflt_hdr;
@@ -2870,59 +865,9 @@ index 1e7ddd0..df45dd9 100644
/* Declare RLE library routines. */
-diff --git a/urt/rle_addhist.c b/urt/rle_addhist.c
-index 45c3dbf..ef13973 100644
---- a/urt/rle_addhist.c
-+++ b/urt/rle_addhist.c
-@@ -70,13 +70,19 @@ rle_addhist(char * argv[],
- return;
-
- length = 0;
-- for (i = 0; argv[i]; ++i)
-+ for (i = 0; argv[i]; ++i) {
-+ overflow_add(length, strlen(argv[i]));
-+ overflow_add(length+1, strlen(argv[i]));
- length += strlen(argv[i]) +1; /* length of each arg plus space. */
-+ }
-
- time(&temp);
- timedate = ctime(&temp);
- length += strlen(timedate); /* length of date and time in ASCII. */
-
-+ overflow_add(strlen(padding), 4);
-+ overflow_add(strlen(histoire), strlen(padding) + 4);
-+ overflow_add(length, strlen(histoire) + strlen(padding) + 4);
- length += strlen(padding) + 3 + strlen(histoire) + 1;
- /* length of padding, "on " and length of history name plus "="*/
- if (in_hdr) /* if we are interested in the old comments... */
-@@ -84,8 +90,10 @@ rle_addhist(char * argv[],
- else
- old = NULL;
-
-- if (old && *old)
-+ if (old && *old) {
-+ overflow_add(length, strlen(old));
- length += strlen(old); /* add length if there. */
-+ }
-
- ++length; /*Cater for the null. */
-
-diff --git a/urt/rle_getrow.c b/urt/rle_getrow.c
-index a24870a..0ba62c3 100644
---- a/urt/rle_getrow.c
-+++ b/urt/rle_getrow.c
-@@ -164,6 +164,7 @@ rle_get_setup(rle_hdr * const the_hdr) {
- char * cp;
-
- VAXSHORT(comlen, infile); /* get comment length */
-+ overflow_add(comlen, 1);
- evenlen = (comlen + 1) & ~1; /* make it even */
- if (evenlen) {
- MALLOCARRAY(comment_buf, evenlen);
-diff --git a/urt/rle_hdr.c b/urt/rle_hdr.c
-index 8ceaa9e..4c13037 100644
---- a/urt/rle_hdr.c
-+++ b/urt/rle_hdr.c
+diff -urNp a/urt/rle_hdr.c b/urt/rle_hdr.c
+--- a/urt/rle_hdr.c 2025-02-03 09:24:28.360500401 +0100
++++ b/urt/rle_hdr.c 2025-02-04 10:42:11.745682618 +0100
@@ -148,7 +148,7 @@ rle_hdr_cp(rle_hdr * const fromHdrP,
if (toHdrP->cmap) {
size_t const size =
@@ -2932,11 +877,12 @@ index 8ceaa9e..4c13037 100644
if (!toHdrP->cmap)
pm_error("Failed to allocate memory for %u color maps "
"of length %u", toHdrP->ncmap, 1 << toHdrP->cmaplen);
-@@ -164,11 +164,16 @@ rle_hdr_cp(rle_hdr * const fromHdrP,
+@@ -163,12 +163,16 @@ rle_hdr_cp(rle_hdr * const fromHdrP,
+ const char ** cp;
/* Count the comments. */
- for (cp = toHdrP->comments, size = 0; *cp; ++cp)
-+ {
+- for (cp = toHdrP->comments, size = 0; *cp; ++cp)
++ for (cp = toHdrP->comments, size = 0; *cp; ++cp) {
+ overflow_add(size,1);
++size;
+ }
@@ -2949,22 +895,26 @@ index 8ceaa9e..4c13037 100644
size *= sizeof(char *);
toHdrP->comments = malloc(size);
if (!toHdrP->comments)
-diff -ruNp a/urt/rle_putcom.c b/urt/rle_putcom.c
---- a/urt/rle_putcom.c 2021-06-02 15:53:59.824205554 +0200
-+++ b/urt/rle_putcom.c 2021-06-02 20:25:22.620707940 +0200
-@@ -98,12 +98,14 @@ rle_putcom(const char * const value,
- const char * v;
- const char ** old_comments;
- int i;
-- for (i = 2, cp = the_hdr->comments; *cp != NULL; ++i, ++cp)
-+ for (i = 2, cp = the_hdr->comments; *cp != NULL; ++i, ++cp) {
+diff -urNp a/urt/rle_putcom.c b/urt/rle_putcom.c
+--- a/urt/rle_putcom.c 2025-02-03 09:24:28.360500401 +0100
++++ b/urt/rle_putcom.c 2025-02-04 10:43:04.472477242 +0100
+@@ -101,6 +101,7 @@ rle_putcom(const char * const value,
+ for (i = 2, cp = hdrP->comments;
+ *cp != NULL && i < UINT_MAX;
+ ++i, ++cp) {
+ overflow_add(i, 1);
if (match(value, *cp) != NULL) {
v = *cp;
*cp = value;
- return v;
- }
-+ }
- /* Not found */
- /* Can't realloc because somebody else might be pointing to this
- * comments block. Of course, if this were true, then the
+diff -urNp a/urt/Runput.c b/urt/Runput.c
+--- a/urt/Runput.c 2025-02-03 09:24:28.360500401 +0100
++++ b/urt/Runput.c 2025-02-04 10:30:24.683997548 +0100
+@@ -236,7 +236,7 @@ RunSetup(rle_hdr * const hdrP) {
+ int * bg_color;
+
+ assert(hdrP->ncolors < UINT_MAX);
+-
++ overflow_add(the_hdr->ncolors, 1);
+ MALLOCARRAY_NOFAIL(background, hdrP->ncolors + 1);
+
+ /* If even number of bg color bytes, put out one more to get to
diff --git a/netpbm-security-scripts.patch b/netpbm-security-scripts.patch
deleted file mode 100644
index 2730e5b..0000000
--- a/netpbm-security-scripts.patch
+++ /dev/null
@@ -1,119 +0,0 @@
-diff -urNp a/editor/ppmfade b/editor/ppmfade
---- a/editor/ppmfade 2022-06-28 07:58:59.195317750 +0200
-+++ b/editor/ppmfade 2022-06-28 08:04:56.070643056 +0200
-@@ -215,84 +215,84 @@ for ($i = 1; $i <= $nframes; $i++) {
- $n = $spline20[$i] * 100;
- system("ppmshift $n $tmpdir/junk1.ppm >$tmpdir/junk1a.ppm");
- $n = (1-$spline20[$i-10])*100;
-- system("ppmshift $n junk2.ppm >junk2a.ppm");
-+ system("ppmshift $n $tmpdir/junk2.ppm >$tmpdir/junk2a.ppm");
- $n = $spline10[$i-10];
-- system("ppmmix $n junk1a.ppm junk2a.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk1a.ppm $tmpdir/junk2a.ppm >$tmpdir/junk3.ppm");
- } else {
- my $n = (1-$spline20[$i-10]) * 100;
-- system("ppmshift $n junk2.ppm >junk3.ppm");
-+ system("ppmshift $n $tmpdir/junk2.ppm >$tmpdir/junk3.ppm");
- }
- } elsif ($mode eq $RELIEF) {
- if ($i == 1) {
-- system("ppmrelief junk1.ppm >junk1r.ppm");
-+ system("ppmrelief $tmpdir/junk1.ppm >$tmpdir/junk1r.ppm");
- }
- if ($i <= 10) {
- my $n = $spline10[$i];
-- system("ppmmix $n junk1.ppm junk1r.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk1.ppm $tmpdir/junk1r.ppm >$tmpdir/junk3.ppm");
- } elsif ($i <= 20) {
- my $n = $spline10[$i-10];
-- system("ppmmix $n junk1r.ppm junk2r.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk1r.ppm $tmpdir/junk2r.ppm >$tmpdir/junk3.ppm");
- } else {
- my $n = $spline10[$i-20];
-- system("ppmmix $n junk2r.ppm junk2.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk2r.ppm $tmpdir/junk2.ppm >$tmpdir/junk3.ppm");
- }
- if ($i == 10) {
-- system("ppmrelief junk2.ppm >junk2r.ppm");
-+ system("ppmrelief $tmpdir/junk2.ppm >$tmpdir/junk2r.ppm");
- }
- } elsif ($mode eq $OIL) {
- if ($i == 1) {
-- system("ppmtopgm junk1.ppm | pgmoil >junko.ppm");
-- system("rgb3toppm junko.ppm junko.ppm junko.ppm " .
-- ">junk1o.ppm");
-+ system("ppmtopgm $tmpdir/junk1.ppm | pgmoil >$tmpdir/junko.ppm");
-+ system("rgb3toppm $tmpdir/junko.ppm $tmpdir/junko.ppm $tmpdir/junko.ppm " .
-+ ">$tmpdir/junk1o.ppm");
- }
- if ($i <= 10) {
- my $n = $spline10[$i];
-- system("ppmmix $n junk1.ppm junk1o.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk1.ppm $tmpdir/junk1o.ppm >$tmpdir/junk3.ppm");
- } elsif ($i <= 20) {
- my $n = $spline10[$i-10];
-- system("ppmmix $n junk1o.ppm junk2o.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk1o.ppm $tmpdir/junk2o.ppm >$tmpdir/junk3.ppm");
- } else {
- my $n = $spline10[$i-20];
-- system("ppmmix $n junk2o.ppm junk2.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk2o.ppm $tmpdir/junk2.ppm >$tmpdir/junk3.ppm");
- }
- if ($i == 10) {
-- system("ppmtopgm junk2.ppm | pgmoil >junko.ppm");
-- system("rgb3toppm junko.ppm junko.ppm junko.ppm " .
-- ">junk2o.ppm");
-+ system("ppmtopgm $tmpdir/junk2.ppm | pgmoil >$tmpdir/junko.ppm");
-+ system("rgb3toppm $tmpdir/junko.ppm $tmpdir/junko.ppm $tmpdir/junko.ppm " .
-+ ">$tmpdir/junk2o.ppm");
- }
- } elsif ($mode eq $EDGE) {
- if ($i == 1) {
-- system("ppmtopgm junk1.ppm | pgmedge >junko.ppm");
-- system("rgb3toppm junko.ppm junko.ppm junko.ppm " .
-- ">junk1o.ppm");
-+ system("ppmtopgm $tmpdir/junk1.ppm | pgmedge >$tmpdir/junko.ppm");
-+ system("rgb3toppm $tmpdir/junko.ppm $tmpdir/junko.ppm $tmpdir/junko.ppm " .
-+ ">$tmpdir/junk1o.ppm");
- }
- if ($i <= 10) {
- my $n = $spline10[$i];
-- system("ppmmix $n junk1.ppm junk1o.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk1.ppm $tmpdir/junk1o.ppm >$tmpdir/junk3.ppm");
- } elsif ($i <= 20) {
- my $n = $spline10[$i-10];
-- system("ppmmix $n junk1o.ppm junk2o.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk1o.ppm $tmpdir/junk2o.ppm >$tmpdir/junk3.ppm");
- } else {
- my $n = $spline10[$i-20];
-- system("ppmmix $n junk2o.ppm junk2.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk2o.ppm $tmpdir/junk2.ppm >$tmpdir/junk3.ppm");
- }
- if ($i == 10) {
-- system("ppmtopgm junk2.ppm | pgmedge >junko.ppm");
-- system("rgb3toppm junko.ppm junko.ppm junko.ppm " .
-- ">junk2o.ppm");
-+ system("ppmtopgm $tmpdir/junk2.ppm | pgmedge >$tmpdir/junko.ppm");
-+ system("rgb3toppm $tmpdir/junko.ppm $tmpdir/junko.ppm $tmpdir/junko.ppm " .
-+ ">$tmpdir/junk2o.ppm");
- }
- } elsif ($mode eq $BENTLEY) {
- if ($i == 1) {
-- system("ppmtopgm junk1.ppm | pgmbentley >junko.ppm");
-- system("rgb3toppm junko.ppm junko.ppm junko.ppm " .
-- ">junk1o.ppm");
-+ system("ppmtopgm $tmpdir/junk1.ppm | pgmbentley >$tmpdir/junko.ppm");
-+ system("rgb3toppm $tmpdir/junko.ppm $tmpdir/junko.ppm $tmpdir/junko.ppm " .
-+ ">$tmpdir/junk1o.ppm");
- }
- if ($i <= 10) {
- my $n = $spline10[$i];
-- system("ppmmix $n junk1.ppm junk1o.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk1.ppm $tmpdir/junk1o.ppm >$tmpdir/junk3.ppm");
- } elsif ($i <= 20) {
- my $n = $spline10[$i-10];
-- system("ppmmix $n junk1o.ppm junk2o.ppm >junk3.ppm");
-+ system("ppmmix $n $tmpdir/junk1o.ppm $tmpdir/junk2o.ppm >$tmpdir/junk3.ppm");
- } else {
- my $n = $spline10[$i-20];
- system("ppmmix $n $tmpdir/junk2o.ppm $tmpdir/junk2.ppm " .
diff --git a/netpbm.spec b/netpbm.spec
index 8213049..3556010 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,10 +1,9 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 11.02.00
-Release: 10%{?dist}
+Version: 11.09.00
+Release: 1%{?dist}
# See copyright_summary for details
-# Automatically converted from old format: BSD and GPLv2 and IJG and MIT and Public Domain - review is highly recommended.
-License: LicenseRef-Callaway-BSD AND GPL-2.0-only AND IJG AND LicenseRef-Callaway-MIT AND LicenseRef-Callaway-Public-Domain
+License: BSD-3-Clause AND GPL-2.0-only AND LGPL-2.1-or-later AND GPL-3.0-or-later AND IJG AND MIT AND NTP AND PostgreSQL AND LicenseRef-MIT-CRL-Xim AND LicenseRef-Fedora-Public-Domain
URL: http://netpbm.sourceforge.net/
# Source0 is prepared by
# svn checkout https://svn.code.sf.net/p/netpbm/code/advanced netpbm-%%{version}
@@ -12,7 +11,6 @@ URL: http://netpbm.sourceforge.net/
# svn checkout https://svn.code.sf.net/p/netpbm/code/trunk/test netpbm-%%{version}/test
# and removing the .svn directories ( find -name "\.svn" -type d -print0 | xargs -0 rm -rf )
Source0: netpbm-%{version}.tar.xz
-Patch0: netpbm-security-scripts.patch
Patch1: netpbm-security-code.patch
Patch2: netpbm-ppmfadeusage.patch
Patch3: netpbm-CVE-2017-2587.patch
@@ -29,11 +27,9 @@ Patch14: netpbm-pamtojpeg2k.patch
Patch15: netpbm-manfix.patch
Patch16: netpbm-jasper.patch
Patch17: netpbm-libdir-so.patch
-Patch18: netpbm-c99.patch
-Patch19: netpbm-c99-2.patch
-Patch20: netpbm-shlib-ldflags.patch
+Patch19: netpbm-c99.patch
-BuildRequires: make
+BuildRequires: make
BuildRequires: libjpeg-devel, libpng-devel, libtiff-devel, flex, gcc, jbigkit-devel
BuildRequires: libX11-devel, perl-generators, python3, jasper-devel, libxml2-devel
BuildRequires: perl(Config), perl(Cwd), perl(English), perl(Fcntl), perl(File::Basename)
@@ -232,6 +228,10 @@ popd
%doc userguide/*
%changelog
+* Tue Jan 28 2025 Josef Ridky - 11.09.00-1
+- New upstream release 11.09.00 (#2218312)
+- Review and update license field
+
* Fri Jan 17 2025 Fedora Release Engineering - 11.02.00-10
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
diff --git a/sources b/sources
index 26ee665..9a51e4e 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-11.02.00.tar.xz) = 499cb8fb3897025b25842bd3408f91d08270ce912a9003e7ae4e6c16b7bb0a5c15372aa375ba464255bb4f005c213627b7e7c9749e37087cd0a895ba199899ae
+SHA512 (netpbm-11.09.00.tar.xz) = 46c34dc7155345a3689c64bd1131c5376494b8b116e32059b0c15cc323af61974873817e23b038b57281fcde1cd34e899d11a91e68f8f656d94e01f872ad189d
From ebbabc036184a3ecde58ee5cc7841b8c3a158d3a Mon Sep 17 00:00:00 2001
From: Josef Ridky
Date: Wed, 5 Feb 2025 08:23:41 +0100
Subject: [PATCH 37/42] Fix typos in patch
Signed-off-by: Josef Ridky
---
netpbm-security-code.patch | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/netpbm-security-code.patch b/netpbm-security-code.patch
index 4de690d..d7daa7f 100644
--- a/netpbm-security-code.patch
+++ b/netpbm-security-code.patch
@@ -240,7 +240,7 @@ diff -urNp a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
break;
case P4: {
int tmp, tmp2;
-+ overflow_add(pbm->width, 7);
++ overflow_add(pbmStatP->width, 7);
tmp = (pbmStatP->width+7)/8;
tmp2 = fread(data,1,tmp,pbmStatP->fptr);
if (tmp2 == tmp) {
@@ -248,7 +248,7 @@ diff -urNp a/converter/pbm/pbmtoppa/pbm.c b/converter/pbm/pbmtoppa/pbm.c
if (!pbmStatP->unread) {
pbmStatP->unread = 1;
-+ overflow_add(pbm->width, 7);
++ overflow_add(pbmStatP->width, 7);
pbmStatP->revdata = malloc ((pbmStatP->width+7)/8);
memcpy(pbmStatP->revdata, data, (pbmStatP->width+7)/8);
--pbmStatP->current_line;
@@ -352,7 +352,7 @@ diff -urNp a/converter/ppm/ilbmtoppm.c b/converter/ppm/ilbmtoppm.c
"is less than minreg (%u)",
PCHG.MaxReg, PCHG.MinReg);
else {
-+ overflow_add(PCHG.MaxReg-PCHG.MinReg, 2)
++ overflow_add(PCHG.MaxReg-PCHG.MinReg, 2);
unsigned int const nch = PCHG.MaxReg - PCHG.MinReg + 1;
unsigned int i;
@@ -567,7 +567,7 @@ diff -urNp a/converter/ppm/qrttoppm.c b/converter/ppm/qrttoppm.c
pixelrow = ppm_allocrow(cols);
-+ overflow2(cols, 3)
++ overflow2(cols, 3);
MALLOCARRAY(buf, 3 * cols);
if (!buf)
@@ -822,7 +822,7 @@ diff -urNp a/urt/rle_addhist.c b/urt/rle_addhist.c
size_t const thisArgLen = strlen(argv[i]);
if (thisArgLen < UINT_MAX - length - 100) {
+ overflow_add(length, thisArgLen);
-+ overflow_add(length+thisArgLen, 1)
++ overflow_add(length+thisArgLen, 1);
length += thisArgLen;
length += 1; /* For the space */
}
@@ -914,7 +914,7 @@ diff -urNp a/urt/Runput.c b/urt/Runput.c
assert(hdrP->ncolors < UINT_MAX);
-
-+ overflow_add(the_hdr->ncolors, 1);
++ overflow_add(hdrP->ncolors, 1);
MALLOCARRAY_NOFAIL(background, hdrP->ncolors + 1);
/* If even number of bg color bytes, put out one more to get to
From a90024f3a23b7422f868b95ffa6827cc328e96c3 Mon Sep 17 00:00:00 2001
From: Josef Ridky
Date: Thu, 6 Feb 2025 09:35:15 +0100
Subject: [PATCH 38/42] Add LDFLAGS patch
Signed-off-by: Josef Ridky
---
netpbm.spec | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/netpbm.spec b/netpbm.spec
index 3556010..5601188 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.09.00
-Release: 1%{?dist}
+Release: 2%{?dist}
# See copyright_summary for details
License: BSD-3-Clause AND GPL-2.0-only AND LGPL-2.1-or-later AND GPL-3.0-or-later AND IJG AND MIT AND NTP AND PostgreSQL AND LicenseRef-MIT-CRL-Xim AND LicenseRef-Fedora-Public-Domain
URL: http://netpbm.sourceforge.net/
@@ -23,11 +23,12 @@ Patch9: netpbm-xwdfix.patch
Patch10: netpbm-multilib.patch
Patch11: netpbm-glibc.patch
Patch12: netpbm-docfix.patch
-Patch14: netpbm-pamtojpeg2k.patch
-Patch15: netpbm-manfix.patch
-Patch16: netpbm-jasper.patch
-Patch17: netpbm-libdir-so.patch
-Patch19: netpbm-c99.patch
+Patch13: netpbm-pamtojpeg2k.patch
+Patch14: netpbm-manfix.patch
+Patch15: netpbm-jasper.patch
+Patch16: netpbm-libdir-so.patch
+Patch17: netpbm-c99.patch
+Patch18: netpbm-shlib-ldflags.patch
BuildRequires: make
BuildRequires: libjpeg-devel, libpng-devel, libtiff-devel, flex, gcc, jbigkit-devel
@@ -228,6 +229,9 @@ popd
%doc userguide/*
%changelog
+* Thu Feb 06 2025 Josef Ridky - 11.09.00-2
+- add LDFLAGS patch (RHEL-70899)
+
* Tue Jan 28 2025 Josef Ridky - 11.09.00-1
- New upstream release 11.09.00 (#2218312)
- Review and update license field
From 5c0b4b11d1194ed0f44ead30463378b60ad35a45 Mon Sep 17 00:00:00 2001
From: Josef Ridky
Date: Tue, 8 Apr 2025 07:58:54 +0200
Subject: [PATCH 39/42] Resolves: #2355869 - new upstream release 11.10.00
Signed-off-by: Josef Ridky
---
.gitignore | 1 +
netpbm.spec | 7 +++++--
sources | 2 +-
3 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/.gitignore b/.gitignore
index f9fd4bb..01a621a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -27,3 +27,4 @@
/netpbm-11.01.00.tar.xz
/netpbm-11.02.00.tar.xz
/netpbm-11.09.00.tar.xz
+/netpbm-11.10.00.tar.xz
diff --git a/netpbm.spec b/netpbm.spec
index 5601188..00b6ca1 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 11.09.00
-Release: 2%{?dist}
+Version: 11.10.00
+Release: 1%{?dist}
# See copyright_summary for details
License: BSD-3-Clause AND GPL-2.0-only AND LGPL-2.1-or-later AND GPL-3.0-or-later AND IJG AND MIT AND NTP AND PostgreSQL AND LicenseRef-MIT-CRL-Xim AND LicenseRef-Fedora-Public-Domain
URL: http://netpbm.sourceforge.net/
@@ -229,6 +229,9 @@ popd
%doc userguide/*
%changelog
+* Tue Apr 08 2025 Josef Ridky - 11.10.00-1
+- New upstream release 11.10.00 (#2355869)
+
* Thu Feb 06 2025 Josef Ridky - 11.09.00-2
- add LDFLAGS patch (RHEL-70899)
diff --git a/sources b/sources
index 9a51e4e..4f13535 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-11.09.00.tar.xz) = 46c34dc7155345a3689c64bd1131c5376494b8b116e32059b0c15cc323af61974873817e23b038b57281fcde1cd34e899d11a91e68f8f656d94e01f872ad189d
+SHA512 (netpbm-11.10.00.tar.xz) = b59f35eb69bc81c1cb13269476dedd34a4020cc946615d7c958250297ee50d38ce71a44a65daf9fdab4f016521cb95d4c2c9a9893dac3d2183a13b6c1a603044
From 0ffda149d6c141d593b0ccf95a08392cadc79ff7 Mon Sep 17 00:00:00 2001
From: Fedora Release Engineering
Date: Thu, 24 Jul 2025 22:45:40 +0000
Subject: [PATCH 40/42] Rebuilt for
https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
---
netpbm.spec | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/netpbm.spec b/netpbm.spec
index 00b6ca1..6e04c4a 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
Version: 11.10.00
-Release: 1%{?dist}
+Release: 2%{?dist}
# See copyright_summary for details
License: BSD-3-Clause AND GPL-2.0-only AND LGPL-2.1-or-later AND GPL-3.0-or-later AND IJG AND MIT AND NTP AND PostgreSQL AND LicenseRef-MIT-CRL-Xim AND LicenseRef-Fedora-Public-Domain
URL: http://netpbm.sourceforge.net/
@@ -229,6 +229,9 @@ popd
%doc userguide/*
%changelog
+* Thu Jul 24 2025 Fedora Release Engineering - 11.10.00-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
+
* Tue Apr 08 2025 Josef Ridky - 11.10.00-1
- New upstream release 11.10.00 (#2355869)
From 4a456f6428305b6a0b83a0aba420a61c27eb404a Mon Sep 17 00:00:00 2001
From: Josef Ridky
Date: Tue, 14 Oct 2025 10:27:02 +0200
Subject: [PATCH 41/42] Resolves: #2375395 - New upstream release 11.12.00
Signed-off-by: Josef Ridky
---
.gitignore | 1 +
netpbm.spec | 7 +++++--
sources | 2 +-
3 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/.gitignore b/.gitignore
index 01a621a..bbaa12d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,4 @@
/netpbm-11.02.00.tar.xz
/netpbm-11.09.00.tar.xz
/netpbm-11.10.00.tar.xz
+/netpbm-11.12.00.tar.xz
diff --git a/netpbm.spec b/netpbm.spec
index 6e04c4a..9330a84 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,7 +1,7 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 11.10.00
-Release: 2%{?dist}
+Version: 11.12.00
+Release: 1%{?dist}
# See copyright_summary for details
License: BSD-3-Clause AND GPL-2.0-only AND LGPL-2.1-or-later AND GPL-3.0-or-later AND IJG AND MIT AND NTP AND PostgreSQL AND LicenseRef-MIT-CRL-Xim AND LicenseRef-Fedora-Public-Domain
URL: http://netpbm.sourceforge.net/
@@ -229,6 +229,9 @@ popd
%doc userguide/*
%changelog
+* Tue Oct 14 2025 Josef Ridky - 11.12.00-1
+- New upstream release 11.12.00
+
* Thu Jul 24 2025 Fedora Release Engineering - 11.10.00-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
diff --git a/sources b/sources
index 4f13535..f7d97f3 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-11.10.00.tar.xz) = b59f35eb69bc81c1cb13269476dedd34a4020cc946615d7c958250297ee50d38ce71a44a65daf9fdab4f016521cb95d4c2c9a9893dac3d2183a13b6c1a603044
+SHA512 (netpbm-11.12.00.tar.xz) = c7cfd76bd49649980868a57297cb58f1c208c19e3514ccd4bbb2ebf034305b1a90f2a76d45b479987d2e0d048d9066f6f71fa916833f05745aef59de5865b7f6
From 3aba1ce9e67cfc2a6ebcbe5a8832783d0ef5240a Mon Sep 17 00:00:00 2001
From: Josef Ridky
Date: Thu, 8 Jan 2026 12:45:33 +0100
Subject: [PATCH 42/42] Resolves: FC-2889 - new upstream release 11.13.00
Signed-off-by: Josef Ridky
---
.gitignore | 1 +
netpbm.spec | 5 ++++-
sources | 2 +-
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/.gitignore b/.gitignore
index bbaa12d..f4510f8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,3 +29,4 @@
/netpbm-11.09.00.tar.xz
/netpbm-11.10.00.tar.xz
/netpbm-11.12.00.tar.xz
+/netpbm-11.13.00.tar.xz
diff --git a/netpbm.spec b/netpbm.spec
index 9330a84..110e827 100644
--- a/netpbm.spec
+++ b/netpbm.spec
@@ -1,6 +1,6 @@
Summary: A library for handling different graphics file formats
Name: netpbm
-Version: 11.12.00
+Version: 11.13.00
Release: 1%{?dist}
# See copyright_summary for details
License: BSD-3-Clause AND GPL-2.0-only AND LGPL-2.1-or-later AND GPL-3.0-or-later AND IJG AND MIT AND NTP AND PostgreSQL AND LicenseRef-MIT-CRL-Xim AND LicenseRef-Fedora-Public-Domain
@@ -229,6 +229,9 @@ popd
%doc userguide/*
%changelog
+* Thu Jan 08 2026 Josef Ridky - 11.13.00-1
+- New upstream release 11.13.00
+
* Tue Oct 14 2025 Josef Ridky - 11.12.00-1
- New upstream release 11.12.00
diff --git a/sources b/sources
index f7d97f3..4e39977 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (netpbm-11.12.00.tar.xz) = c7cfd76bd49649980868a57297cb58f1c208c19e3514ccd4bbb2ebf034305b1a90f2a76d45b479987d2e0d048d9066f6f71fa916833f05745aef59de5865b7f6
+SHA512 (netpbm-11.13.00.tar.xz) = 0914061c7c8d638147afb76cbf23609b3ae43aca4120e4297fd5db6887d5381469d6944cdbdc1c66d26f54ec68d62355693c08b830dde823061e37c51480b678