From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <gentoo-commits+bounces-1288210-garchives=archives.gentoo.org@lists.gentoo.org>
Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by finch.gentoo.org (Postfix) with ESMTPS id 2179F1382C5
	for <garchives@archives.gentoo.org>; Mon, 31 May 2021 08:20:13 +0000 (UTC)
Received: from pigeon.gentoo.org (localhost [127.0.0.1])
	by pigeon.gentoo.org (Postfix) with SMTP id 391A1E086C;
	Mon, 31 May 2021 08:20:12 +0000 (UTC)
Received: from smtp.gentoo.org (mail.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4])
	(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
	(No client certificate requested)
	by pigeon.gentoo.org (Postfix) with ESMTPS id 138E8E086C
	for <gentoo-commits@lists.gentoo.org>; Mon, 31 May 2021 08:20:12 +0000 (UTC)
Received: from oystercatcher.gentoo.org (unknown [IPv6:2a01:4f8:202:4333:225:90ff:fed9:fc84])
	(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
	(No client certificate requested)
	by smtp.gentoo.org (Postfix) with ESMTPS id A7B4F340CE7
	for <gentoo-commits@lists.gentoo.org>; Mon, 31 May 2021 08:20:10 +0000 (UTC)
Received: from localhost.localdomain (localhost [IPv6:::1])
	by oystercatcher.gentoo.org (Postfix) with ESMTP id 061237A4
	for <gentoo-commits@lists.gentoo.org>; Mon, 31 May 2021 08:20:07 +0000 (UTC)
From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Content-Transfer-Encoding: 8bit
Content-type: text/plain; charset=UTF-8
Reply-To: gentoo-dev@lists.gentoo.org, "Sam James" <sam@gentoo.org>
Message-ID: <1622449040.5ddd362b77fa5ba98bb4e09db554afc653558206.sam@gentoo>
Subject: [gentoo-commits] repo/gentoo:master commit in: media-libs/netpbm/, media-libs/netpbm/files/
X-VCS-Repository: repo/gentoo
X-VCS-Files: media-libs/netpbm/Manifest media-libs/netpbm/files/netpbm-10.86.22-fix-ps-test.patch media-libs/netpbm/netpbm-10.86.22.ebuild
X-VCS-Directories: media-libs/netpbm/files/ media-libs/netpbm/
X-VCS-Committer: sam
X-VCS-Committer-Name: Sam James
X-VCS-Revision: 5ddd362b77fa5ba98bb4e09db554afc653558206
X-VCS-Branch: master
Date: Mon, 31 May 2021 08:20:07 +0000 (UTC)
Precedence: bulk
List-Post: <mailto:gentoo-commits@lists.gentoo.org>
List-Help: <mailto:gentoo-commits+help@lists.gentoo.org>
List-Unsubscribe: <mailto:gentoo-commits+unsubscribe@lists.gentoo.org>
List-Subscribe: <mailto:gentoo-commits+subscribe@lists.gentoo.org>
List-Id: Gentoo Linux mail <gentoo-commits.gentoo.org>
X-BeenThere: gentoo-commits@lists.gentoo.org
X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply
X-Archives-Salt: 0f967e53-2fdf-4a59-9861-246ebec9a0f8
X-Archives-Hash: 5bb5187feb3318657a31a936ca5e87bc

commit:     5ddd362b77fa5ba98bb4e09db554afc653558206
Author:     Viorel Munteanu <ceamac.paragon <AT> gmail <DOT> com>
AuthorDate: Thu May 27 18:15:26 2021 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Mon May 31 08:17:20 2021 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=5ddd362b

media-libs/netpbm: new version 10.86.22

Also backported a fix from 10.94.3 for tests failing with USE=postfix
Closes: https://bugs.gentoo.org/670362
Package-Manager: Portage-3.0.18, Repoman-3.0.2
Signed-off-by: Viorel Munteanu <ceamac.paragon <AT> gmail.com>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 media-libs/netpbm/Manifest                         |   1 +
 .../netpbm/files/netpbm-10.86.22-fix-ps-test.patch | 506 +++++++++++++++++++++
 media-libs/netpbm/netpbm-10.86.22.ebuild           | 211 +++++++++
 3 files changed, 718 insertions(+)

diff --git a/media-libs/netpbm/Manifest b/media-libs/netpbm/Manifest
index be3d0a3dff3..ddc99b62a12 100644
--- a/media-libs/netpbm/Manifest
+++ b/media-libs/netpbm/Manifest
@@ -1,3 +1,4 @@
 DIST netpbm-10.70.00.tar.xz 2621612 BLAKE2B 2b07d130de0afeb3c1df32c6d267bc6bd13d4f556988cb7784b51941d81de1ad4f3381a0788eec6309bc6c024a21eb273a5f00726f6bb9a8ecb87f547678fc77 SHA512 f70d6dd79ce813f9fc4935d382b50bd3cecdf02c324b0f012056e56e33f24b621e8c1b3d054c6f470d437d0d793593de95eaa9724055d59c342228398a40f0b4
 DIST netpbm-10.76.00.tar.xz 2657184 BLAKE2B b8d82268ba50881fab10bca00ea408afa39096f4f9c079b523d8e28ce62301797ee50f55c84f85a6d832b723da7449531e725bf60a4a89975c51382b2cbc4a94 SHA512 234a5616a7631a8eb70817bb88ed509ddddfce93f71739654ef78a2735245b268c391adb49b514ed883569c9fc6ea9c3eeed10aa7898c02b797fee5249b11cf3
 DIST netpbm-10.86.21.tar.xz 3768736 BLAKE2B 19d641f3519f55d737aa6cd22f60847b2b241f71134bc7f9fa558e681cbffb1bff53f16e4d89e7a85b20b86e0bf0f4d9c341dde656ca07a7bc20adc94e811e36 SHA512 caa6c18039be72c47419b3ef60b64e0a04123752beb27bab178adcbb48e5311da05b422205f52c784149bb0636be1e3155e6bbf7703ec5c5775cb9981de1008e
+DIST netpbm-10.86.22.tar.xz 3696588 BLAKE2B eabc11b4928681f2d96c8b6da1e23284868d7ba2f610f496d1ddf5b6ceb34c991160780f79c69b2c905e5210b024a1a5868656b89e23d6b63e587ce0cd70a950 SHA512 5840d0e88158ac77be7dfc5430e696701a740d56c98efdaf02b3c4e92bdf10268572ef0087b3bf263937073e0fbda3183aa7ed56bfe12dba30b3a3ff382bd4ff

diff --git a/media-libs/netpbm/files/netpbm-10.86.22-fix-ps-test.patch b/media-libs/netpbm/files/netpbm-10.86.22-fix-ps-test.patch
new file mode 100644
index 00000000000..e8876120a18
--- /dev/null
+++ b/media-libs/netpbm/files/netpbm-10.86.22-fix-ps-test.patch
@@ -0,0 +1,506 @@
+postscript tests fail because of pbmtolps
+backport pbmtolps from netpbm-10.94.3, including tests
+see also bug #670362
+
+--- a/converter/pbm/pbmtolps.c
++++ b/converter/pbm/pbmtolps.c
+@@ -1,181 +1,253 @@
+-/*
+- * pbmtolps -- convert a Portable BitMap into Postscript.  The
+- * output Postscript uses lines instead of the image operator to
+- * generate a (device dependent) picture which will be imaged
+- * much faster.
+- *
+- * The Postscript path length is constrained to be less that 1000
+- * points so that no limits are overrun on the Apple Laserwriter
+- * and (presumably) no other printers.
+- *
+- * To do:
+- *      make sure encapsulated format is correct
+- *      repitition of black-white strips
+- *      make it more device independent (is this possible?)
+- *
+- * Author:
+- *      George Phillips <phillips@cs.ubc.ca>
+- *      Department of Computer Science
+- *      University of British Columbia
+- */
+-
+-#include <string.h>
+-#include <stdio.h>
++/*=============================================================================
++                             pbmtolps
++===============================================================================
++
++  Convert a PBM image to Postscript.  The output Postscript uses lines instead
++  of the image operator to generate a (device dependent) picture which will be
++  imaged much faster.
++
++  The Postscript path length is constrained to be at most 1000 vertices so that
++  no limits are overrun on the Apple Laserwriter and (presumably) no other
++  printers.  The typical limit is 1500.  See "4.4 Path Construction" and
++  "Appendix B: Implementation Limits" in: PostScript Language Reference Manual
++  https://www.adobe.com/content/dam/acom/en/devnet/actionscript/
++  articles/psrefman.pdf
++
++  To do:
++       make sure encapsulated format is correct
++       repetition of black-white strips
++       make it more device independent (is this possible?)
++
++  Author:
++       George Phillips <phillips@cs.ubc.ca>
++       Department of Computer Science
++       University of British Columbia
++=============================================================================*/
++#include <stdbool.h>
+ 
++#include "pm_c_util.h"
++#include "mallocvar.h"
+ #include "nstring.h"
++#include "shhopt.h"
+ #include "pbm.h"
+ 
+ 
+-static int prev_white = -1;
+-static int prev_black = -1;
+-static char cmd = '\0';
+-static int pointcount = 2;
+-
+-#ifdef RUN
+-static int run = 1;
+-#endif
+-
+-static char 
+-morepoints(char cmd, int howmany_pbmtolps) {
+-    pointcount += 2;
+-    if (pointcount > 1000) {
+-        pointcount = 2;
+-        cmd += 'm' - 'a';
+-    }
+-    return(cmd);
++static float        const MAX_DPI           = 5000;
++static float        const MIN_DPI           = 10;
++static unsigned int const MAX_PATH_VERTICES = 1000;
++
++
++struct CmdlineInfo {
++    /* All the information the user supplied in the command line, in a form
++       easy for the program to use.
++    */
++    const char * inputFileName;  /* File name of input file */
++    unsigned int inputFileSpec;  /* Input file name specified */
++    float        lineWidth;      /* Line width, if specified */
++    unsigned int lineWidthSpec;  /* Line width specified */
++    float        dpi;            /* Resolution in DPI, if specified */
++    unsigned int dpiSpec;        /* Resolution specified */
++};
++
++
++
++static void
++validateDpi(float const dpi) {
++
++    if (dpi > MAX_DPI || dpi < MIN_DPI)
++        pm_error("Specified DPI value out of range (%f)", dpi);
+ }
+ 
+ 
+ 
+-static void 
+-addstrip(int const white, 
+-         int const black) {
+-
+-    if (cmd) {
+-#ifdef RUN
+-        if (white == prev_white && black == prev_black)
+-            run++;
+-        else {
+-            if (run == 1)
+-#endif
+-                printf("%d %d %c ", 
+-                       prev_black, prev_white, morepoints(cmd, 2));
+-#ifdef RUN
+-            else
+-                                /* of course, we need to give a new command */
+-                printf("%d %d %d %c ",
+-                       prev_white, prev_black, run,
+-                       morepoints(cmd + 'f' - 'a', 2 * run));
+-            run = 1;
+-        }
+-#endif
++static void
++parseCommandLine(int                        argc,
++                 const char **        const 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.
++-----------------------------------------------------------------------------*/
++    optEntry * option_def;  /* malloc'ed */
++        /* Instructions to OptParseOptions3 on how to parse our options.  */
++    optStruct3 opt;
++
++    unsigned int option_def_index;
++
++    MALLOCARRAY_NOFAIL(option_def, 100);
++
++    option_def_index = 0;   /* incremented by OPTENTRY */
++    OPTENT3(0, "linewidth", OPT_FLOAT, &cmdlineP->lineWidth,
++                            &cmdlineP->lineWidthSpec,    0);
++    OPTENT3(0, "dpi",       OPT_FLOAT,  &cmdlineP->dpi,
++                            &cmdlineP->dpiSpec,          0);
++
++    opt.opt_table = option_def;
++    opt.short_allowed = FALSE;  /* We have no short (old-fashioned) options */
++    opt.allowNegNum = FALSE;  /* We have no parms that are negative numbers */
++
++    pm_optParseOptions3(&argc, (char **)argv, opt, sizeof(opt), 0);
++        /* Uses and sets argc, argv, and some of *cmdlineP and others. */
++
++    if (cmdlineP->dpiSpec)
++        validateDpi(cmdlineP->dpi);
++    else
++        cmdlineP->dpi = 300;
++
++    if (argc-1 < 1)
++        cmdlineP->inputFileName = "-";
++    else {
++        if (argc-1 > 1)
++            pm_error("Program takes zero or one argument (filename).  You "
++                     "specified %u", argc-1);
++        else
++            cmdlineP->inputFileName = argv[1];
+     }
+ 
+-    prev_white = white;
+-    prev_black = black;
+-    cmd = 'a';
++    if (cmdlineP->inputFileName[0] == '-' &&
++        cmdlineP->inputFileName[1] == '\0')
++        cmdlineP->inputFileSpec = false;
++    else
++        cmdlineP->inputFileSpec = true;
++
++    free(option_def);
+ }
+ 
+ 
+ 
+-static void 
+-nextline(void) {
+-    /* need to check run, should have an outcommand */
+-    if (cmd)
+-        printf("%d %d %c\n", prev_black, prev_white, morepoints('c', 3));
+-    else
+-        printf("%c\n", morepoints('b', 1));
+-    cmd = '\0';
++static void
++validateLineWidth(float const scCols,
++                  float const scRows,
++                  float const lineWidth) {
++
++    if (lineWidth >= scCols || lineWidth >= scRows)
++        pm_error("Absurdly large -linewidth value (%f)", lineWidth);
+ }
+ 
+ 
+ 
+-int
+-main(int argc, char ** argv) {
+-    FILE*   fp;
+-    bit*    bits;
+-    int             row;
+-    int             col;
+-    int         rows;
+-    int             cols;
+-    int             format;
+-    int             white;
+-    int             black;
+-    const char*   name;
+-    float   dpi = 300.0;
+-    float   sc_rows;
+-    float   sc_cols;
+-    int             i;
+-    const char*   const usage = "[ -dpi n ] [ pbmfile ]";
+-
+-
+-	pbm_init(&argc, argv);
+-
+-    i = 1;
+-    if (i < argc && streq(argv[i], "-dpi")) {
+-        if (i == argc - 1)
+-            pm_usage(usage);
+-        sscanf(argv[i + 1], "%f", &dpi);
+-        i += 2;
+-    }
++static void
++doRaster(FILE *       const ifP,
++         unsigned int const cols,
++         unsigned int const rows,
++         int          const format,
++         FILE *       const ofP) {
+ 
+-    if (i < argc - 1)
+-        pm_usage(usage);
++    bit *        bitrow;
++    unsigned int row;
++    unsigned int vertexCt;
++        /* Number of vertices drawn since last stroke command */
+ 
+-    if (i == argc) {
+-        name = "noname";
+-        fp = stdin;
+-    } else {
+-        name = argv[i];
+-        fp = pm_openr(name);
+-    }
+-    pbm_readpbminit(fp, &cols, &rows, &format);
+-    bits = pbm_allocrow(cols);
++    bitrow = pbm_allocrow(cols);
++
++    for (row = 0, vertexCt = 0; row < rows; ++row) {
++        unsigned int col;
++        bool firstRun;
+ 
+-    sc_rows = (float)rows / dpi * 72.0;
+-    sc_cols = (float)cols / dpi * 72.0;
++        firstRun = true;  /* initial value */
++
++        pbm_readpbmrow(ifP, bitrow, cols, format);
++
++        /* output white-strip + black-strip sequences */
+ 
+-    puts("%!PS-Adobe-2.0 EPSF-2.0");
+-    puts("%%Creator: pbmtolps");
+-    printf("%%%%Title: %s\n", name);
+-    printf("%%%%BoundingBox: %d %d %d %d\n",
+-           (int)(305.5 - sc_cols / 2.0),
+-           (int)(395.5 - sc_rows / 2.0),
+-           (int)(306.5 + sc_cols / 2.0),
+-           (int)(396.5 + sc_rows / 2.0));
+-    puts("%%EndComments");
+-    puts("%%EndProlog");
+-    puts("gsave");
+-
+-    printf("%f %f translate\n", 306.0 - sc_cols / 2.0, 396.0 + sc_rows / 2.0);
+-    printf("72 %f div dup neg scale\n", dpi);
+-    puts("/a { 0 rmoveto 0 rlineto } def");
+-    puts("/b { 0 row 1 add dup /row exch def moveto } def");
+-    puts("/c { a b } def");
+-    puts("/m { currentpoint stroke newpath moveto a } def");
+-    puts("/n { currentpoint stroke newpath moveto b } def");
+-    puts("/o { currentpoint stroke newpath moveto c } def");
+-    puts("/row 0 def");
+-    puts("newpath 0 0 moveto");
+-
+-    for (row = 0; row < rows; row++) {
+-        pbm_readpbmrow(fp, bits, cols, format);
+-        /* output white-strip+black-strip sequences */
+         for (col = 0; col < cols; ) {
+-            for (white = 0; col < cols && bits[col] == PBM_WHITE; col++)
+-                white++;
+-            for (black = 0; col < cols && bits[col] == PBM_BLACK; col++)
+-                black++;
++            unsigned int whiteCt;
++            unsigned int blackCt;
++
++            for (whiteCt = 0; col < cols && bitrow[col] == PBM_WHITE; ++col)
++                ++whiteCt;
++            for (blackCt = 0; col < cols && bitrow[col] == PBM_BLACK; ++col)
++                ++blackCt;
++
++            if (blackCt > 0) {
++                if (vertexCt > MAX_PATH_VERTICES) {
++                    printf("m ");
++                    vertexCt = 0;
++                }
++
++                if (firstRun) {
++                    printf("%u %u moveto %u 0 rlineto\n",
++                           whiteCt, row, blackCt);
++                    firstRun = false;
++                } else
++                    printf("%u %u a\n", blackCt, whiteCt);
+ 
+-            if (black != 0)
+-                addstrip(white, black);
++                vertexCt += 2;
++            }
+         }
+-        nextline();
+     }
+-    puts("stroke grestore showpage");
+-    puts("%%Trailer");
++    pbm_freerow(bitrow);
++}
++
++
++
++static void
++pbmtolps(FILE *             const ifP,
++         FILE *             const ofP,
++         struct CmdlineInfo const cmdline) {
++
++    const char * const psName =
++        cmdline.inputFileSpec ? cmdline.inputFileName : "noname";
++
++    int          rows;
++    int          cols;
++    int          format;
++    float        scRows, scCols;
++        /* Dimensions of the printed image in points */
++
++    pbm_readpbminit(ifP, &cols, &rows, &format);
++
++    scRows = (float) rows / (cmdline.dpi / 72.0);
++    scCols = (float) cols / (cmdline.dpi / 72.0);
++
++    if (cmdline.lineWidthSpec)
++        validateLineWidth(scCols, scRows, cmdline.lineWidth);
++
++    fputs("%!PS-Adobe-2.0 EPSF-2.0\n", ofP);
++    fputs("%%Creator: pbmtolps\n", ofP);
++    fprintf(ofP, "%%%%Title: %s\n", psName);
++    fprintf(ofP, "%%%%BoundingBox: %d %d %d %d\n",
++           (int)(305.5 - scCols / 2.0),
++           (int)(395.5 - scRows / 2.0),
++           (int)(306.5 + scCols / 2.0),
++           (int)(396.5 + scRows / 2.0));
++    fputs("%%EndComments\n", ofP);
++    fputs("%%EndProlog\n", ofP);
++    fputs("gsave\n", ofP);
++
++    fprintf(ofP, "%f %f translate\n",
++            306.0 - scCols / 2.0, 396.0 + scRows / 2.0);
++    fprintf(ofP, "72 %f div dup neg scale\n", cmdline.dpi);
++
++    if (cmdline.lineWidthSpec)
++        fprintf(ofP, "%f setlinewidth\n", cmdline.lineWidth);
++
++    fputs("/a { 0 rmoveto 0 rlineto } def\n", ofP);
++    fputs("/m { currentpoint stroke newpath moveto } def\n", ofP);
++    fputs("newpath 0 0 moveto\n", ofP);
++
++    doRaster(ifP, cols, rows, format, ofP);
++
++    fputs("stroke grestore showpage\n", ofP);
++    fputs("%%Trailer\n", ofP);
++}
++
++
++
++int
++main(int argc, const char *argv[]) {
++    FILE *  ifP;
++    struct CmdlineInfo cmdline;
++
++    pm_proginit(&argc, argv);
++
++    parseCommandLine(argc, argv, &cmdline);
++
++    ifP = pm_openr(cmdline.inputFileName);
++
++    pbmtolps(ifP, stdout, cmdline);
+ 
+-    pm_close(fp);
++    pm_close(ifP);
+ 
+-    exit(0);
++    return 0;
+ }
+--- a/test/lps-roundtrip.ok
++++ b/test/lps-roundtrip.ok
+@@ -0,0 +1 @@
++match
+--- a/test/lps-roundtrip.test
++++ b/test/lps-roundtrip.test
+@@ -0,0 +1,22 @@
++#! /bin/bash
++# This script tests: pbmtolps pstopnm
++# Also requires: gs pamdepth pamscale pnmcrop pnmpsnr
++
++# The ordinary round-trip does not work because of the way ghostscript
++# renders: a line is considered wider than a single pixel and all pixels
++# it touches are set to black if the output is PBM.  To work around this,
++# we tell pstopnm to output PGM at a high resolution (=large dpi value).
++
++
++test_pgm=${tmpdir}/testgrid.pgm
++
++pamdepth 255 testgrid.pbm > ${test_pgm}
++
++pbmtolps -dpi 72 testgrid.pbm | \
++    pstopnm -dpi $((72*12)) -stdout -pgm | \
++    pnmcrop -white | pamscale -xsize=14 -ysize=16 | \
++    pnmpsnr -target=30 - ${test_pgm}
++
++# ghostscript version 8.71: pnmpsnr lumina 33.14dB
++
++rm ${test_pgm}
+--- a/test/ps-alt-roundtrip.ok
++++ b/test/ps-alt-roundtrip.ok
+@@ -1,3 +1,2 @@
+ 2425386270 41
+-2425386270 41
+ 2916080186 235
+--- a/test/ps-alt-roundtrip.test
++++ b/test/ps-alt-roundtrip.test
+@@ -1,21 +1,24 @@
+ #! /bin/bash
+-# This script tests: pbmtoepsi pbmtopsg3 pbmtolps psidtopgm pstopnm
++# This script tests: pbmtoepsi pbmtopsg3 psidtopgm pstopnm
+ # Also requires: gs pnmcrop
+ 
+ 
+ # This script is for testing alternative (or minor) utilities that
+ # read/write Postscript and encapsulated Postscript:
+-# pbmtoepsi, pbmtopsg3, pbmtolps and psidtopgm.
++# pbmtoepsi, pbmtopsg3 and psidtopgm.
+ #
+ # We keep these tests separate from those for pnmtops and pstopnm
+ # which are far more popular.
+ #
+-# pbmtopsg3 and pbmtolps produce output that require pstopnm for decoding.
++# pbmtopsg3 produces output that requires pstopnm for decoding.
++#
++# We used to test pbmtolps here, but moved it out when gs changed its
++# rendering formula.
+ #
+ # Failure message
+ ## If ps-roundtrip.test succeeds and this test fails, it is most likely
+ ## a problem with one of the alternate Postscipt utilities:
+-## pbmtoepsi, pbmtopsg3, pbmtolps or psidtopgm.
++## pbmtoepsi, pbmtopsg3, or psidtopgm.
+ ## If both tests fail it indicates a problem with pstopnm or gs.
+ 
+ # pstopnm does not use libnetpbm functions for output.
+@@ -33,18 +36,8 @@
+ rm ${testgrid1_ps}
+ 
+ 
+-# Test 2. Should print: 2425386270 41
+-testgrid2_ps=${tmpdir}/testgrid2.ps
+-
+-pbmtolps -dpi 72 testgrid.pbm \
+-     > ${testgrid2_ps} && \
+-pstopnm -xborder=0 -yborder=0 -dpi=72 -stdout \
+-    -quiet ${testgrid2_ps} -pbm | \
+-  pnmcrop | cksum
+-
+-rm ${testgrid2_ps}
+ 
+-# Test 3. Should print: 2916080186 235
++# Test 2. Should print: 2916080186 235
+ # Output is pgm maxval=1 with black and white inverted.
+ #
+ testgrid_epsi=${tmpdir}/testgrid.epsi
+--- a/test/Test-Order
++++ b/test/Test-Order
+@@ -183,5 +183,6 @@
+ 
+ fiasco-roundtrip.test
+ jpeg-roundtrip.test
++lps-roundtrip.test
+ tiffcmyk-roundtrip.test
+ yuv-roundtrip.test

diff --git a/media-libs/netpbm/netpbm-10.86.22.ebuild b/media-libs/netpbm/netpbm-10.86.22.ebuild
new file mode 100644
index 00000000000..048c6e3162e
--- /dev/null
+++ b/media-libs/netpbm/netpbm-10.86.22.ebuild
@@ -0,0 +1,211 @@
+# Copyright 1999-2021 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit multilib toolchain-funcs
+
+DESCRIPTION="A set of utilities for converting to/from the netpbm (and related) formats"
+HOMEPAGE="http://netpbm.sourceforge.net/"
+SRC_URI="https://github.com/ceamac/netpbm-make-dist/releases/download/v${PV}/${P}.tar.xz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux"
+IUSE="doc jbig jpeg png postscript rle cpu_flags_x86_sse2 static-libs svga tiff X xml zlib"
+
+BDEPEND="
+	app-arch/xz-utils
+	sys-devel/flex
+	virtual/pkgconfig
+"
+RDEPEND="jbig? ( media-libs/jbigkit )
+	jpeg? ( virtual/jpeg:0 )
+	png? ( >=media-libs/libpng-1.4:0 )
+	postscript? ( app-text/ghostscript-gpl )
+	rle? ( media-libs/urt )
+	svga? ( media-libs/svgalib )
+	tiff? ( >=media-libs/tiff-3.5.5:0 )
+	xml? ( dev-libs/libxml2 )
+	zlib? ( sys-libs/zlib )
+	X? ( x11-libs/libX11 )"
+DEPEND="${RDEPEND}"
+
+PATCHES=(
+	"${FILESDIR}"/netpbm-10.86.21-build.patch
+	"${FILESDIR}"/netpbm-10.86.21-test.patch #450530
+	"${FILESDIR}"/netpbm-10.86.21-misc-deps.patch
+	"${FILESDIR}"/netpbm-10.86.21-format-security.patch #517524
+	"${FILESDIR}"/netpbm-10.86.22-fix-ps-test.patch #670362
+)
+
+netpbm_libtype() {
+	case ${CHOST} in
+		*-darwin*) echo dylib;;
+		*)         echo unixshared;;
+	esac
+}
+
+netpbm_libsuffix() {
+	local suffix=$(get_libname)
+	echo ${suffix//\.}
+}
+
+netpbm_ldshlib() {
+	case ${CHOST} in
+		*-darwin*) echo '$(LDFLAGS) -dynamiclib -install_name $(SONAME)';;
+		*)         echo '$(LDFLAGS) -shared -Wl,-soname,$(SONAME)';;
+	esac
+}
+netpbm_config() {
+	if use ${1} ; then
+		[[ ${2} != "!" ]] && echo -l${2:-$1}
+	else
+		echo NONE
+	fi
+}
+
+src_prepare() {
+	default
+
+	# make sure we use system libs
+	sed -i '/SUPPORT_SUBDIRS/s:urt::' GNUmakefile || die
+	rm -r urt converter/other/jbig/libjbig converter/other/jpeg2000/libjasper || die
+
+	# take care of the importinc stuff ourselves by only doing it once
+	# at the top level and having all subdirs use that one set #149843
+	sed -i \
+		-e '/^importinc:/s|^|importinc:\nmanual_|' \
+		-e '/-Iimportinc/s|-Iimp|-I"$(BUILDDIR)"/imp|g'\
+		common.mk || die
+	sed -i \
+		-e '/%.c/s: importinc$::' \
+		common.mk lib/Makefile lib/util/Makefile || die
+	sed -i \
+		-e 's:pkg-config:$(PKG_CONFIG):' \
+		GNUmakefile converter/other/Makefile other/pamx/Makefile || die
+
+	# The postscript knob is currently bound up with a fork test.
+	if ! use postscript ; then
+		sed -i \
+			-e 's:$(DONT_HAVE_PROCESS_MGMT):Y:' \
+			converter/other/Makefile generator/Makefile || die
+		sed -i -r \
+			-e 's:(pbmtextps|pnmtops|pstopnm).*::' \
+			test/all-in-place.{ok,test} || die
+		sed -i -e 's:lps-roundtrip.*::' test/Test-Order || die
+		sed -i -e '/^$/d' test/all-in-place.ok || die
+		sed -i '2iexit 80' test/ps-{alt-,flate-,}roundtrip.test || die
+	fi
+
+	# the new postscript test needs +x
+	chmod +x test/lps-roundtrip.test
+
+	# Do not test png if not built
+	if ! use png ; then
+		sed -i -r \
+			-e 's:(pamtopng|pngtopam|pnmtopng).*::' \
+			test/all-in-place.{ok,test} || die
+		sed -i -e '/^$/d' test/all-in-place.ok || die
+
+		sed -i -r \
+			-e 's:(pamrgbatopng|pngtopnm).*::' \
+			test/legacy-names.{ok,test} || die
+		sed -i -e '/^$/d' test/legacy-names.ok || die
+	fi
+}
+
+src_configure() {
+	# cannot chain the die with the heredoc, please check the comment below
+	cat config.mk.in - >> config.mk <<-EOF
+	# Misc crap
+	BUILD_FIASCO = N
+	SYMLINK = ln -sf
+
+	# These vars let src_test work by default
+	PKGDIR_DEFAULT = ${T}/netpbm
+	RESULTDIR_DEFAULT = ${T}/netpbm-test
+
+	# Toolchain options
+	CC = $(tc-getCC) -Wall
+	LD = \$(CC)
+	CC_FOR_BUILD = $(tc-getBUILD_CC)
+	LD_FOR_BUILD = \$(CC_FOR_BUILD)
+	AR = $(tc-getAR)
+	RANLIB = $(tc-getRANLIB)
+	PKG_CONFIG = $(tc-getPKG_CONFIG)
+
+	STRIPFLAG =
+	CFLAGS_SHLIB = -fPIC
+
+	LDRELOC = \$(LD) -r
+	LDSHLIB = $(netpbm_ldshlib)
+	LINKER_CAN_DO_EXPLICIT_LIBRARY = N # we can, but dont want to
+	LINKERISCOMPILER = Y
+	NETPBMLIBSUFFIX = $(netpbm_libsuffix)
+	NETPBMLIBTYPE = $(netpbm_libtype)
+	STATICLIB_TOO = $(usex static-libs Y N)
+
+	# The var is called SSE, but the code is actually SSE2.
+	WANT_SSE = $(usex cpu_flags_x86_sse2 Y N)
+
+	# Gentoo build options
+	TIFFLIB = $(netpbm_config tiff)
+	# Let tiff worry about its own dependencies #395753
+	TIFFLIB_NEEDS_JPEG = N
+	TIFFLIB_NEEDS_Z = N
+	JPEGLIB = $(netpbm_config jpeg)
+	PNGLIB = $(netpbm_config png)
+	ZLIB = $(netpbm_config zlib z)
+	LINUXSVGALIB = $(netpbm_config svga vga)
+	XML2_LIBS = $(netpbm_config xml xml2)
+	JBIGLIB = $(netpbm_config jbig)
+	JBIGHDR_DIR =
+	JASPERLIB = NONE
+	JASPERHDR_DIR =
+	URTLIB = $(netpbm_config rle)
+	URTHDR_DIR =
+	X11LIB = $(netpbm_config X X11)
+	X11HDR_DIR =
+	EOF
+	# cannot chain the die with the heredoc above as bash-3
+	# has a parser bug in that setup #282902
+	[[ $? -eq 0 ]] || die "writing config.mk failed"
+}
+
+src_compile() {
+	emake -j1 pm_config.h version.h manual_importinc #149843
+	emake
+}
+
+src_test() {
+	# The code wants to install everything first and then test the result.
+	emake install.{bin,lib,data}
+	emake check
+}
+
+src_install() {
+	# Subdir make targets like to use `mkdir` all over the place
+	# without any actual dependencies, thus the -j1.
+	emake -j1 package pkgdir="${ED}"/usr
+
+	if [[ $(get_libdir) != "lib" ]] ; then
+		mv "${ED}"/usr/lib "${ED}"/usr/$(get_libdir) || die
+	fi
+
+	# Remove cruft that we don't need, and move around stuff we want
+	rm "${ED}"/usr/{README,VERSION,{pkgconfig,config}_template,pkginfo} || die
+
+	dodir /usr/share
+	mv "${ED}"/usr/misc "${ED}"/usr/share/netpbm || die
+
+	doman userguide/*.[0-9]
+	dodoc README
+
+	cd doc || die
+	dodoc HISTORY Netpbm.programming USERDOC
+	docinto html
+	dodoc -r *.html
+
+	use doc && dodoc -r ../userguide/*.html
+}