summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'media-libs/netpbm/files')
-rw-r--r--media-libs/netpbm/files/netpbm-10.86.22-fix-ps-test.patch506
1 files changed, 506 insertions, 0 deletions
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 000000000000..e8876120a181
--- /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