git: c2069505c562 - main - graphics/xv: update to 4.2.0

From: Dirk Meyer <dinoex_at_FreeBSD.org>
Date: Sun, 26 Nov 2023 15:04:30 UTC
The branch main has been updated by dinoex:

URL: https://cgit.FreeBSD.org/ports/commit/?id=c2069505c56276c241be5551055b82d82067c5b7

commit c2069505c56276c241be5551055b82d82067c5b7
Author:     Dirk Meyer <dinoex@FreeBSD.org>
AuthorDate: 2023-11-26 15:04:03 +0000
Commit:     Dirk Meyer <dinoex@FreeBSD.org>
CommitDate: 2023-11-26 15:04:03 +0000

    graphics/xv: update to 4.2.0
---
 graphics/xv/Makefile              |   58 +-
 graphics/xv/distinfo              |    9 +-
 graphics/xv/files/patch-Imakefile |  126 --
 graphics/xv/files/patch-config.h  |   63 +-
 graphics/xv/files/patch-xv.h      |   10 +-
 graphics/xv/files/patch-xvevent.c |    6 +-
 graphics/xv/files/patch-xvgif.c   |   12 +-
 graphics/xv/files/patch-xvinfo.c  |   11 -
 graphics/xv/files/patch-xvjp2k.c  | 2377 -------------------------------------
 graphics/xv/files/patch-xvjpeg.c  |    9 +-
 graphics/xv/files/patch-xvmisc.c  |    9 +-
 graphics/xv/files/patch-xvpng.c   |  509 --------
 graphics/xv/files/patch-xvtext.c  |    6 +-
 graphics/xv/files/patch-xvvd.c    |   14 +-
 graphics/xv/pkg-descr             |    2 -
 graphics/xv/pkg-plist             |  290 ++++-
 16 files changed, 334 insertions(+), 3177 deletions(-)

diff --git a/graphics/xv/Makefile b/graphics/xv/Makefile
index eacddcdec1cb..ead1b403f35f 100644
--- a/graphics/xv/Makefile
+++ b/graphics/xv/Makefile
@@ -1,27 +1,24 @@
 PORTNAME=	xv
-PORTVERSION=	3.10a
-PORTREVISION=	22
+PORTVERSION=	4.2.0
+DISTVERSIONPREFIX=	v
+PORTREVISION=	0
 CATEGORIES+=	graphics
-MASTER_SITES=	ftp://ftp.cis.upenn.edu/pub/xv/:base \
-		SF/png-mng/XV%20jumbo%20patches/20070520
-
-DISTFILES=	${DISTNAME}${EXTRACT_SUFX}:base \
-		${DISTNAME}-jumbo-patches-20070520.tar.gz
 DIST_SUBDIR=	${PORTNAME}
 
-PATCH_SITES=	http://www.gregroelofs.com/code/
-PATCHFILES=	xv-3.10a-enhancements.20070520-20081216.diff
-
 MAINTAINER?=	dinoex@FreeBSD.org
 COMMENT?=	X11 program that displays images of various formats
 WWW=		http://www.trilon.com/xv/
 
 LIB_DEPENDS=	libtiff.so:graphics/tiff \
 		libpng.so:graphics/png \
-		libjasper.so:graphics/jasper
+		libjasper.so:graphics/jasper \
+		libwebp.so:graphics/webp
+
+USES=		cpe localbase cmake jpeg xorg
+USE_XORG=	xext x11 xt ice sm
 
-USES=		cpe imake jpeg xorg
-USE_XORG=	xext x11 xt
+USE_GITHUB=	yes
+GH_ACCOUNT=	jasper-software
 
 CPE_VENDOR=	xv_project
 
@@ -30,43 +27,22 @@ M17N_DESC=	build with Multilingualization support
 
 .include <bsd.port.options.mk>
 
-.if defined(CC) && ${CC:T:Mclang}
-# Optimizer crashes with
-# Assertion failed: (isPtrIV == IndVar->getType()->isPointerTy() && "IndVar type must match IVInit type")
-CFLAGS:= ${CFLAGS:S/-O2//g}
-.endif
-
 .if ${PORT_OPTIONS:MM17N}
-MAKE_ENV=	LOCALE_EXTENSION=-DTV_MULTILINGUAL
+CFLAGS+=	-DTV_MULTILINGUAL
 DESCR=	${FILESDIR}/pkg-descr
 CONFLICTS_INSTALL=	xv
 .else
 CONFLICTS_INSTALL=	xv-m17n
 .endif
 
-pre-patch:
-	${PATCH} -d ${PATCH_WRKSRC} ${PATCH_ARGS} -p1 < ${WRKDIR}/xv-3.10a-jumbo-fix-enh-patch-20070520.txt
+XV_DOCS=	README.md src/docs/help
 
-post-patch:
-	${REINPLACE_CMD} -e "s@%%LOCALBASE%%@${LOCALBASE}@" \
-		${WRKSRC}/config.h
-.for i in bggen.1 vdcomp.1 xcmap.1 xv.1 xvp2p.1
-	${CP} ${WRKSRC}/docs/${i:R}.man ${WRKSRC}
+do-install-DOCS-on:
+.for i in ${XV_DOCS}
+	${INSTALL_DATA} ${WRKSRC}/${i} ${STAGEDIR}${DOCSDIR}/
 .endfor
 
-post-install:
-.if ${PORT_OPTIONS:MDOCS}
-	${MKDIR} ${STAGEDIR}${DOCSDIR}
-	${INSTALL_DATA} ${WRKSRC}/README ${STAGEDIR}${DOCSDIR}/
-	${INSTALL_DATA} ${WRKSRC}/README.jumbo ${STAGEDIR}${DOCSDIR}/
-	${INSTALL_DATA} ${WRKSRC}/README.pcd ${STAGEDIR}${DOCSDIR}/
-	${INSTALL_DATA} ${WRKSRC}/docs/epsf.ps ${STAGEDIR}${DOCSDIR}/
-	${INSTALL_DATA} ${WRKSRC}/docs/xpm.ps ${STAGEDIR}${DOCSDIR}/
-	${INSTALL_DATA} ${WRKSRC}/docs/xvdocs.ps ${STAGEDIR}${DOCSDIR}/
-	${INSTALL_DATA} ${WRKSRC}/docs/xvtitle.ps ${STAGEDIR}${DOCSDIR}/
-	${INSTALL_DATA} ${WRKSRC}/docs/help ${STAGEDIR}${DOCSDIR}/
-	${INSTALL_DATA} ${WRKSRC}/docs/bmp.doc ${STAGEDIR}${DOCSDIR}/
-	${INSTALL_DATA} ${WRKSRC}/docs/gif* ${STAGEDIR}${DOCSDIR}/
-.endif
+do-install-DOCS-off:
+	${RM} -fr ${STAGEDIR}${DOCSDIR}/
 
 .include <bsd.port.mk>
diff --git a/graphics/xv/distinfo b/graphics/xv/distinfo
index b592830be19a..c11f79e98b2d 100644
--- a/graphics/xv/distinfo
+++ b/graphics/xv/distinfo
@@ -1,6 +1,3 @@
-SHA256 (xv/xv-3.10a.tar.gz) = 03eb26b1e8f315c3093f4ae794862ba46637d16c055e8efbe5e3beb5d40fc451
-SIZE (xv/xv-3.10a.tar.gz) = 2259124
-SHA256 (xv/xv-3.10a-jumbo-patches-20070520.tar.gz) = 221ec89fdf0772bd09c845cbb337aecf411a1aee215140b676717f49e9e65c80
-SIZE (xv/xv-3.10a-jumbo-patches-20070520.tar.gz) = 1363802
-SHA256 (xv/xv-3.10a-enhancements.20070520-20081216.diff) = c47aa52b7dbf2e09896d3eba6411d78a56162a4b966197e40115c14d88c2e1eb
-SIZE (xv/xv-3.10a-enhancements.20070520-20081216.diff) = 8847
+TIMESTAMP = 1700942420
+SHA256 (xv/jasper-software-xv-v4.2.0_GH0.tar.gz) = 2871338c517a7444fc9d6a3d146bc2c5c7bd98b50c83369b24d24ad49fa0ab87
+SIZE (xv/jasper-software-xv-v4.2.0_GH0.tar.gz) = 5381969
diff --git a/graphics/xv/files/patch-Imakefile b/graphics/xv/files/patch-Imakefile
deleted file mode 100644
index dfdd490eb661..000000000000
--- a/graphics/xv/files/patch-Imakefile
+++ /dev/null
@@ -1,126 +0,0 @@
---- Imakefile.orig	2009-05-17 15:02:50.000000000 +0200
-+++ Imakefile	2009-05-17 15:05:52.000000000 +0200
-@@ -6,13 +6,15 @@
- /* if, for whatever reason, you're unable to get the JPEG library to compile
-  * on your machine, *COMMENT OUT* the following line
-  */
--#define HaveJpeg
-+/* #define HaveJpeg */
-+#define UseInstalledJpeg
- 
- 
- /* if, for whatever reason, you're unable to get the TIFF library to compile
-  * on your machine, *COMMENT OUT* the following line
-  */
--#define HaveTiff
-+/* #define HaveTiff */
-+#define UseInstalledTiff
- 
- 
- /* if, for whatever reason, you're unable to get the PDS/VICAR support
-@@ -124,20 +126,48 @@
- JPEG = -DDOJPEG
- JPEGDIR = jpeg
- LIBJPEG = $(JPEGDIR)/libjpeg.a
-+DEPLIBJPEG = $(LIBJPEG)
- JPEGINCLUDE = -I$(JPEGDIR)
- #endif
- 
-+#ifdef UseInstalledJpeg
-+JPEG = -DDOJPEG
-+LIBJPEG = -L${LOCALBASE}/lib -ljpeg
-+JPEGINCLUDE = -I${LOCALBASE}/include
-+#endif
-+
- #ifdef HaveTiff
- TIFF = -DDOTIFF
- TIFFDIR = tiff
- LIBTIFF = $(TIFFDIR)/libtiff.a
-+DEPLIBTIFF = $(LIBTIFF)
- TIFFINCLUDE = -I$(TIFFDIR)
- #endif
- 
-+#ifdef UseInstalledTiff
-+TIFF = -DDOTIFF -DUSE_TILED_TIFF_BOTLEFT_FIX -DOG3
-+LIBTIFF = -L${LOCALBASE}/lib -ltiff
-+TIFFINCLUDE = -I${LOCALBASE}/include
-+#endif
-+
- #ifdef HavePDS
- PDS = -DDOPDS
- #endif
- 
-+PNG    = -DDOPNG
-+PNGINC = -I${LOCALBASE}/include
-+PNGLIB = -L${LOCALBASE}/lib -lpng
-+
-+JP2K    = -DDOJP2K
-+JP2KINC = -I${LOCALBASE}/include
-+JP2KLIB = -L${LOCALBASE}/lib -ljasper
-+
-+ZLIBDIR = /usr
-+ZLIBINC = -I$(ZLIBDIR)/include
-+ZLIBLIB = -L$(ZLIBDIR)/lib -lz
-+
-+DOCDIR = -L${PREFIX}/share/doc/xv
-+SYSCONFDIR = ${PREFIX}/etc/
- 
- #if defined(SCOArchitecture)
- SCO= -Dsco -DPOSIX -DNO_RANDOM 
-@@ -149,14 +179,17 @@
- #endif
- 
- 
--DEPLIBS = $(LIBJPEG) $(LIBTIFF)
--LOCAL_LIBRARIES = $(XLIB) $(DEPLIBS)
-+DEPLIBS = $(DEPLIBJPEG) $(DEPLIBTIFF)
-+LOCAL_LIBRARIES = $(XLIB) $(LIBJPEG) $(LIBTIFF) ${PNGLIB} ${JP2KLIB} ${ZLIBLIB}
- 
- DEFINES= $(SCO) $(UNIX) $(NODIRENT) $(VPRINTF) $(TIMERS) \
- 	$(HPUX7) $(JPEG) $(TIFF) $(PDS) $(DXWM) $(RAND) \
--	$(BACKING_STORE) $(BSDTYPES) $(SGI) $(MGCSFX)
-+	${PNG} ${JP2K} $(TVL10N) \
-+	-DDOCDIR=\"$(DOCDIR)\" \
-+	-DSYSCONFDIR=\"$(SYSCONFDIR)\" \
-+	$(BACKING_STORE) $(BSDTYPES) $(SGI) $(MGCSFX) $(LOCALE_EXTENSION)
- 
--INCLUDES = $(JPEGINCLUDE) $(TIFFINCLUDE)
-+INCLUDES = $(JPEGINCLUDE) $(TIFFINCLUDE) ${PNGINC} ${JP2KINC} ${ZLIBINC}
- 
- SRCS1 =	xv.c xvevent.c xvroot.c xvmisc.c xvimage.c xvcolor.c xvsmooth.c \
- 	xv24to8.c xvgif.c xvpm.c xvinfo.c xvctrl.c xvscrl.c xvalg.c \
-@@ -166,7 +199,7 @@
- 	xvbrowse.c xvtext.c xvpcx.c xviff.c xvtarga.c xvxpm.c xvcut.c \
- 	xvxwd.c xvfits.c xvpng.c xvzx.c xvwbmp.c xvpcd.c \
- 	xvmag.c xvpic.c xvmaki.c xvpi.c xvpic2.c xvvd.c xvmgcsfx.c \
--	xvml.c
-+	xvml.c xvjp2k.c xvhips.c
- 
- OBJS1 =	xv.o xvevent.o xvroot.o xvmisc.o xvimage.o xvcolor.o xvsmooth.o \
- 	xv24to8.o xvgif.o xvpm.o xvinfo.o xvctrl.o xvscrl.o xvalg.o \
-@@ -176,7 +209,7 @@
- 	xvbrowse.o xvtext.o xvpcx.o xviff.o xvtarga.o xvxpm.o xvcut.o \
- 	xvxwd.o xvfits.o xvpng.o xvzx.o xvwbmp.o xvpcd.o \
- 	xvmag.o xvpic.o xvmaki.o xvpi.o xvpic2.o xvvd.o xvmgcsfx.o \
--	xvml.o
-+	xvml.o xvjp2k.o xvhips.o
- 
- SRCS2=	bggen.c
- OBJS2=	bggen.o
-@@ -271,11 +304,11 @@
- #endif
- 
-  
--InstallManPageLong(docs/xv,$(MANDIR),xv)
--InstallManPageLong(docs/bggen,$(MANDIR),bggen)
--InstallManPageLong(docs/xcmap,$(MANDIR),xcmap)
--InstallManPageLong(docs/xvp2p,$(MANDIR),xvpictoppm)
--InstallManPageLong(docs/vdcomp,$(MANDIR),vdcomp)
-+InstallManPage(xv,$(MANDIR))
-+InstallManPage(bggen,$(MANDIR))
-+InstallManPage(xcmap,$(MANDIR))
-+InstallManPage(xvp2p,$(MANDIR))
-+InstallManPage(vdcomp,$(MANDIR))
- 
- InstallNonExecFile(xv_mgcsfx.sample,$(MGCSFXDIR))
- 
diff --git a/graphics/xv/files/patch-config.h b/graphics/xv/files/patch-config.h
index 5d36a12b5046..c53959ab6589 100644
--- a/graphics/xv/files/patch-config.h
+++ b/graphics/xv/files/patch-config.h
@@ -1,20 +1,6 @@
---- config.h.orig	Thu Aug 27 04:50:47 1998
-+++ config.h	Thu Aug 27 04:51:05 1998
-@@ -103,10 +103,9 @@
-  * should not need to be changed
-  */
- 
--/* #define GS_PATH "/usr/local/bin/gs" */
--#define GS_PATH "gs"
--/* #define GS_LIB  "."                 */
--/* #define GS_DEV  "ppmraw"            */
-+#define GS_PATH "%%LOCALBASE%%/bin/gs"
-+#define GS_LIB  "%%LOCALBASE%%/lib/ghostscript"
-+#define GS_DEV  "ppmraw"
- 
- 
- /***************************************************************************
-@@ -159,7 +159,7 @@
+--- src/config.h.orig	2023-07-17 01:25:42 UTC
++++ src/config.h
+@@ -191,7 +191,7 @@
   * in the following line.
   */
  
@@ -23,7 +9,7 @@
  
  
  /***************************************************************************
-@@ -175,8 +175,8 @@
+@@ -207,8 +207,8 @@
   * is read-only), change 'undef' to 'define' the VIRTUAL_TD line.
   */
  
@@ -32,27 +18,9 @@
 +#define AUTO_EXPAND
 +#define VIRTUAL_TD
  
- #if !defined(AUTO_EXPAND) && defined(VIRTUAL_TD)
+ #if defined(VIRTUAL_TD) && !defined(AUTO_EXPAND)
  #  undef VIRTUAL_TD
-@@ -190,7 +190,7 @@
-  * Shunauzer, change 'undef' to 'define' in the following line.
-  */
- 
--#undef VS_ADJUST
-+#define VS_ADJUST
- 
- 
- /***************************************************************************
-@@ -216,7 +216,7 @@
-  * 'undef' to 'define' in the following line.
-  */
- 
--#undef TV_L10N
-+/* #undef TV_L10N */
- 
- #ifdef TV_L10N
- /*
-@@ -259,7 +259,7 @@
+@@ -291,7 +291,7 @@
   * magic number or suffix in "~/.xv_mgcsfx" .
   * To enable this feature, change 'undef' to 'define' in the following line.
   */
@@ -61,24 +29,7 @@
  
  #ifdef HAVE_MGCSFX
  /*
-@@ -285,14 +285,14 @@
-  * WARNING : If you decide to use preprocessor, you must not write
-  *           '# <comment>' style comment in startup file. Because,
-  *           preprocessor can't recognize.  */
--#  undef USE_MGCSFX_PREPROCESSOR
-+#  define USE_MGCSFX_PREPROCESSOR
- 
- #  ifdef USE_MGCSFX_PREPROCESSOR
- /*
-  * This is used like "system("MGCSFX_PREPROCESSOR MGCSFX_RC > tmp_name");",
-  * and read tmp_name instead of MGCSFX_RC.
-  */
--#    define MGCSFX_PREPROCESSOR "/usr/lib/cpp"
-+#    define MGCSFX_PREPROCESSOR "/usr/bin/cpp"
- /* #    define MGCSFX_PREPROCESSOR "cc -E" */
- 
- #  endif /* USE_MGCSFX_PREPROCESSOR */
-@@ -325,7 +325,7 @@
+@@ -352,7 +352,7 @@
   * 'undef' to 'define' in the following line.
   */
  
diff --git a/graphics/xv/files/patch-xv.h b/graphics/xv/files/patch-xv.h
index 631f2cc5515e..8795af429413 100644
--- a/graphics/xv/files/patch-xv.h
+++ b/graphics/xv/files/patch-xv.h
@@ -1,11 +1,11 @@
---- xv.h.orig	2009-05-17 12:01:21.000000000 +0200
-+++ xv.h	2009-05-17 12:02:58.000000000 +0200
-@@ -158,7 +159,7 @@
+--- src/xv.h.orig	2023-07-17 01:25:42 UTC
++++ src/xv.h
+@@ -183,7 +183,7 @@
  
  #ifndef VMS
  #  include <errno.h>
 -#  ifndef __NetBSD__
 +#  if !defined(__NetBSD__) && !defined(__FreeBSD__)
- #    if !(defined __GLIBC__ && __GLIBC__ >= 2)
+ #    if !(defined(__GLIBC__) && __GLIBC__ >= 2) && !defined(__OpenBSD__)
         extern int   errno;         /* SHOULD be in errno.h, but often isn't */
-        extern char *sys_errlist[]; /* this too... */
+ #      ifndef XV_HAVE_SYSERRLISTDECL
diff --git a/graphics/xv/files/patch-xvevent.c b/graphics/xv/files/patch-xvevent.c
index 5ce5d4faeec8..8245b11534ba 100644
--- a/graphics/xv/files/patch-xvevent.c
+++ b/graphics/xv/files/patch-xvevent.c
@@ -1,6 +1,6 @@
---- xvevent.c.orig	2009-05-22 07:21:18.000000000 +0200
-+++ xvevent.c	2009-05-22 07:21:48.000000000 +0200
-@@ -814,7 +814,7 @@
+--- src/xvevent.c.orig	2023-07-17 01:25:42 UTC
++++ src/xvevent.c
+@@ -828,7 +828,7 @@ int HandleEvent(event, donep)
  	debkludge_offy = eHIGH-xwa.height+p_offy;
        }
  
diff --git a/graphics/xv/files/patch-xvgif.c b/graphics/xv/files/patch-xvgif.c
index 9c769565196c..e9d6c25122be 100644
--- a/graphics/xv/files/patch-xvgif.c
+++ b/graphics/xv/files/patch-xvgif.c
@@ -1,7 +1,7 @@
---- xvgif.c.orig	2009-05-17 08:25:07.000000000 +0200
-+++ xvgif.c	2009-05-17 09:37:28.000000000 +0200
-@@ -169,8 +169,12 @@
-  
+--- src/xvgif.c.orig	2023-07-17 01:25:42 UTC
++++ src/xvgif.c
+@@ -186,8 +186,12 @@ int LoadGIF(fname, pinfo)
+ 
    aspect = NEXTBYTE;
    if (aspect) {
 +#if 0
@@ -11,5 +11,5 @@
 +    normaspect = (float) (aspect + 15) / 64.0;   /* gif89 aspect ratio */
 +#endif
      if (DEBUG) fprintf(stderr,"GIF89 aspect = %f\n", normaspect);
-   }
- 
+     /* FIXME:  apparently this _should_ apply to all frames in a multi-image
+      *         GIF (i.e., PgUp/PgDn), but it doesn't */
diff --git a/graphics/xv/files/patch-xvinfo.c b/graphics/xv/files/patch-xvinfo.c
deleted file mode 100644
index 05547a174ff0..000000000000
--- a/graphics/xv/files/patch-xvinfo.c
+++ /dev/null
@@ -1,11 +0,0 @@
---- xvinfo.c.orig	1994-12-22 22:34:41 UTC
-+++ xvinfo.c
-@@ -26,7 +26,7 @@
- #define INFOHIGH 270
- 
- /* max length of an Info String */
--#define ISTRLEN 80
-+#define ISTRLEN 256
- 
- /* baseline of top line of text */
- #define TOPBASE (36 + penn_height/2 + 4 + 8 + ASCENT)
diff --git a/graphics/xv/files/patch-xvjp2k.c b/graphics/xv/files/patch-xvjp2k.c
deleted file mode 100644
index 2f84d53a8c16..000000000000
--- a/graphics/xv/files/patch-xvjp2k.c
+++ /dev/null
@@ -1,2377 +0,0 @@
-diff -ur ./xvjp2k.c /home/src/master/GIT/xv/src/xvjp2k.c
---- ./xvjp2k.c	2022-02-20 20:18:25.590840000 +0100
-+++ /home/src/master/GIT/xv/src/xvjp2k.c	2022-02-20 20:39:26.277883000 +0100
-@@ -2,20 +2,20 @@
-  * xvjp2k.c - I/O subroutines for JPEG 2000 format pictures
-  *
-  * This module is a "shim" between XV and a JPEG 2000 CODEC in the open-source
-- * JasPer Library created by Michael D. Adams; for more information, see the URL
-- * "http://www.ece.uvic.ca/~mdadams/jasper".  We don't use most of the other
-- * facilities in this library, so it's better to link XV with a UNIX "archive"
-- * representation of it, not a DLL.
-+ * JasPer Library created by Michael D. Adams; for more information, see the
-+ * URL "http://www.ece.uvic.ca/~mdadams/jasper".  We don't use most of the
-+ * other facilities in this library, so it's better to link XV with a UNIX
-+ * "archive" representation of it, not a DLL.
-  *
-  * JPEG 2000 files can be represented in either of two general ways:  The
-  * simplest representation is a "code stream", which often has a ".jpc" file
-  * name suffix and is organized much like a classical JPEG file, except that
-  * unfortunately, JPEG 2000 code streams indicate the no. of colors in an image
-  * but no longer give any clues about its color space (e.g., RGB or YCbCr).
-- * Instead, there is now a semantically higher-level representation, which often
-- * has a ".jp2" file name suffix and encapsulates a "code stream" with (possibly
-- * a lot of) color-space information, optionally including things like ICC
-- * correction tables.
-+ * Instead, there is now a semantically higher-level representation, which
-+ * often has a ".jp2" file name suffix and encapsulates a "code stream" with
-+ * (possibly a lot of) color-space information, optionally including things
-+ * like ICC correction tables.
-  *
-  * Compared to the IJG JPEG Library used in file "xvjpeg.c", one must solve
-  * several problems for color images when marrying JasPer to XV.
-@@ -25,9 +25,9 @@
-  * normal "X Windows" display, so we must carefully check a decoded image's
-  * parameters in order to reject anything that we can't handle gracefully.
-  *
-- * 2. JasPer prefers to decode/encode images using color-plane "slices", instead
-- *    of interleaved pixels needed by "X Windows", so we must (de)interleave
-- * copies of the image buffer here.
-+ * 2. JasPer prefers to decode/encode images using color-plane "slices",
-+ * instead of interleaved pixels needed by "X Windows", so we must
-+ * (de)interleave copies of the image buffer here.
-  *
-  * XXX  Things to do:
-  *
-@@ -42,599 +42,419 @@
-  *
-  * --Scott Marovich <marovich@hpl.hp.com>, Hewlett-Packard Laboratories,
-  *   January 2005.
-+ *
-+ * Michael Aadams <mdadams@ece.uvic.ca>, University of Victoria, January 2022.
-+ * The original code needed to be almost entirely rewritten due to its
-+ * insistence on bypassing the JasPer library API and violating many
-+ * preconditions in the usage of the API (which, of course, caused
-+ * many problems as the JasPer library evolved over time).
-+ *
-  */
- #include "copyright.h"
- 
--#define  NEEDSARGS
-+#define NEEDSARGS
- #include "xv.h"
- 
- #ifdef HAVE_JP2K
- 
- #include <jasper/jasper.h>
--/* missing prototype in 1.701.0, sigh: */
--jas_stream_t *jas_stream_freopen PARM((const char *, const char *, FILE *));
- 
--static const char *fbasename,  /* File's base name, for error/warning msgs */
--    bad_samp[]   = "%s:  can't read %d-plane %s file!",
--    fmode[]      = "rb",
--    full_msg[]   = "%s %s. (%ld bytes)",
--    jp2_kind[]   = "JP2",
--    jpc_kind[]   = "JPEG 2000",
--    load_msg[]   = "Loading %dx%d %s %s (%ld bytes)...",
--    no_mem[]     = "%s:  can't read %s file - out of memory",
--    pixel_size[] = "%s:  can't display %d-bit pixels!",
--    shrt_msg[]   = "%dx%d %s %s. ",
--    truncated[]  = "%s:  Unexpected end of %s file",
--    read_err[]   = "%s:  I/O error reading %s file",
--    bad_dims[]   = "%s:  error in JPEG-2000 header (bad image size)";
-+#define GIBI (1024ULL * 1024ULL * 1024ULL)
- 
--/* We only want to override the JasPer Library's "jas_eprintf()" subroutine in
--   order to make it a "wrapper" around XV's own error-reporting subroutine, but
--   because of the way the former is currently packaged in JasPer Library Version
--   1.701, we must override everything else packaged in the "jas_debug.o" module
--   with it, otherwise we get "duplicate definition" messages from the linker.
--*/
--int jas_getdbglevel(void) {return 0;}
--int jas_setdbglevel(int n) {return 0;}
--int jas_memdump(FILE *fp,void *data,size_t len) {return 0;}
-+static const char *fbasename, /* File's base name, for error/warning msgs */
-+	bad_samp[] = "%s:  can't read %d-plane %s file!", fmode[] = "rb",
-+	full_msg[] = "%s %s. (%ld bytes)", jp2_kind[] = "JP2",
-+	jpc_kind[] = "JPEG 2000", load_msg[] = "Loading %dx%d %s %s (%ld bytes)...",
-+	no_mem[] = "%s:  can't read %s file - out of memory",
-+	pixel_size[] = "%s:  can't display %d-bit pixels!",
-+	shrt_msg[] = "%dx%d %s %s. ",
-+	truncated[] = "%s:  Unexpected end of %s file",
-+	read_err[] = "%s:  I/O error reading %s file",
-+	bad_dims[] = "%s:  error in JPEG-2000 header (bad image size)";
- 
--int jas_eprintf(const char *fmt,...)         /* Handle JasPer Library message */
-+static int get_debug_level(void)
- {
--    static char error[] = "error: ", warning[]= "warning: ";
--    va_list ap;
--    int kind = ISTR_WARNING;
--    char buffer[512];
--    register char *p;
--
-- /* Unlike the IJG JPEG Library, the JasPer Library current has no graceful way
--    for an application (= us!) to intercept its diagnostic messages and output
--    them using our own subroutines, so this ugly replacement for its output
--    subroutine will have to suffice.  At Version 1.701, lthough the library's
--    own "jas_eprintf()" is a varargs subroutine, all calls currently pass just
--    1 string with a Line Feed at the end and no "printf(3C)" arguments.  Most
--    strings begin with "error: " or "warning: ", although a few have neither.
--    We try to translate these into the format preferred by XV, trimming any
--    trailing Line Feed character (ugh!).
-- */
--    va_start(ap, fmt);
--    vsnprintf(p = buffer,512,fmt,ap);
--    va_end(ap);
--    while (*p++);
--    if (p[-2] == '\n') p[-2] = '\0';
--    p = buffer;
--    if (strncmp(p,error,sizeof error) == 0) /* "error: ... " */
--      {
--        kind = ISTR_WARNING;
--        p += sizeof error;
--      }
--    else /* "warning: ... " */
--      if (strncmp(p,warning,sizeof warning) == 0)
--        {
--          kind = ISTR_INFO;
--          p += sizeof warning;
--        };
--    SetISTR(kind,"%s:  %s",fbasename,p);
--    return strlen(fmt);
-+	int debug_level = 0;
-+	const char *cp;
-+	if ((cp = getenv("XV_JASPER_DEBUG_LEVEL"))) {
-+		debug_level = atoi(cp);
-+	}
-+	return debug_level;
- }
- 
--static char *SetBuf(FILE *f)
--{
--    char *buf;
--    register char *p;
-+#if (JAS_VERSION_MAJOR >= 3)
-+static int print_log(jas_logtype_t type, const char *format, va_list ap) {
-+	const int buffer_size = 512;
-+	char buffer[buffer_size];
-+	int count;
- 
-- /* JPEG 2000 image files are apt to be large, but the buffer size allocated by
--    most implementations of the "C" Standard I/O Library is still ridiculously
--    small, typically 1 KB.  We want to allocate a much larger buffer for higher
--    I/O efficiency, but the details are unfortunately a bit platform-specific.
--    Under UNIX systems with virtual memory, we want to encourage its internal
--    "physio()" subroutine by making the buffer an integral number of pages,
--    aligned on a page-multiple memory address boundary.  Under HP-UX 11.1+ and
--    perhaps other operating-systems, a Standard I/O buffer is preceded by a
--    header whose size must also be taken into account.
-- */
--# ifndef IOBUFSIZ
--#   define IOBUFSIZ 65536
--# endif /* IOBUFSIZ */
--# ifdef __hpux
--#   define OVERHEAD sizeof(mbstate_t)
--# endif /* __hpux */
--# ifndef OVERHEAD
--#   define OVERHEAD 0
--# endif /* OVERHEAD */
-+	int log_class = jas_logtype_getclass(type);
-+	int kind;
-+	switch (log_class) {
-+	case JAS_LOGTYPE_CLASS_INFO:
-+		kind = ISTR_INFO;
-+		break;
-+	case JAS_LOGTYPE_CLASS_WARN:
-+	case JAS_LOGTYPE_CLASS_ERROR:
-+	default:
-+		kind = ISTR_WARNING;
-+		break;
-+	}
- 
--# ifdef NBPG
--    if (!(buf = p = malloc(NBPG+OVERHEAD+IOBUFSIZ))) return 0;
--    p = (char *)((unsigned long)p+NBPG-1 & ~(NBPG-1));
--    p -= OVERHEAD;
--# else /* not NBPG */
--    if (!(buf = p = malloc(OVERHEAD+IOBUFSIZ))) return 0;
--    p += OVERHEAD;
--# endif /* NBPG */
--    setvbuf(f,p,_IOFBF,OVERHEAD+IOBUFSIZ);
--    return buf;
--#   undef OVERHEAD
--#   undef IOBUFSIZ
-+	count = vsnprintf(buffer, buffer_size, format, ap);
-+
-+	if (log_class == JAS_LOGTYPE_CLASS_WARN ||
-+		log_class == JAS_LOGTYPE_CLASS_ERROR) {
-+		if (get_debug_level() >= 1) {
-+			jas_eprintf("%s", buffer);
-+		} else {
-+			int i;
-+			for (i = 0; i < count; ++i) {
-+				if (buffer[i] == '\n') {
-+					buffer[i] = ' ';
-+				}
-+			}
-+			SetISTR(kind, "%s:  %s", fbasename, buffer);
-+		}
-+	} else {
-+		jas_eprintf("%s", buffer);
-+	}
-+	return count;
- }
-+#endif
- 
--int LoadJPC(char *fname,register PICINFO *pinfo,int quick)
--{
--    jas_image_t *img;
--    jas_stream_t *str;
--    FILE *fp;
--    char *iobuf;
--    const char *s;
--    unsigned long filesize;
--    long w, h, npixels, bufsize;
--    int ok = 0, vstride;
--    register int i;
-+static int LoadJP2K(char *fname, register PICINFO *pinfo, int quick,
-+  bool jpc_format) {
-+	jas_image_t *img = 0;
-+	jas_stream_t *str = 0;
-+	FILE *fp;
-+	const char *s;
-+	unsigned long filesize;
-+	long w, h, npixels, bufsize;
-+	int vstride;
-+	register int i;
-+	jas_matrix_t *data = 0;
- 
-- /* Load a JPEG 2000 "code stream" image file into a pixel buffer for XV.
--    Unlike classical JPEG files, they have no clue about the image's color
--    space, so we check for 8-bit data samples but make no effort to check or
--    convert color spaces, and "what you see is what you get".  For now, ignore
--    the "quick" option to return a reduced-resolution or -size image.  Return 1
--    on success, or 0 on failure.
-- */
--    if (!(fp = xv_fopen(fname,fmode))) return 0;
--    fbasename = BaseName(fname); /* Input file's base name, for message(s) */
--    if (!(iobuf = SetBuf(fp)))
--      {
--        (void)fclose(fp);
--        SetISTR(ISTR_WARNING,no_mem,fbasename,jpc_kind);
--        goto L3;
--      }
-+	int ret = 1;
- 
-- /* Before telling the JasPer Library about this file, get its size for display
--    purposes.  Non-UNIX systems don't necessarily simulate "stat(2)", so do it
--    crudely but portably by seeking to the end, then back to the beginning.
-- */
--    fseek(fp,0L,2);
--    filesize = ftell(fp);
--    fseek(fp,0L,0);
-+	int debug_level = get_debug_level();
-+#if (JAS_VERSION_MAJOR >= 3)
-+	size_t max_mem = jas_get_total_mem_size();
-+	if (!max_mem) {
-+		max_mem = GIBI;
-+	}
-+	jas_conf_clear();
-+	jas_conf_set_max_mem_usage(max_mem);
-+	jas_init_library();
-+	jas_init_thread();
-+	jas_set_vlogmsgf(print_log);
-+#else
-+	jas_init();
-+#endif
-+#if (JAS_VERSION_MAJOR >= 3)
-+	jas_set_debug_level(debug_level);
-+#else
-+	jas_setdbglevel(debug_level);
-+#endif
- 
-- /* "jas_stream_close()" will eventually close the input file, so only do it
--    explicitly if no stream can be created:
-- */
--    if (!(str = jas_stream_freopen(fname,fmode,fp))) /* nice if prototype... */
--      {
--        (void)fclose(fp);
--        goto L3;
--      }
-+	if (!(fp = xv_fopen(fname, fmode))) {
-+		return 0;
-+	}
-+	/* Input file's base name, for message(s) */
-+	fbasename = BaseName(fname);
- 
-- /* It's not clear to me whether the following represents a JasPer Library "bug"
--    but it sure looks goofy:  Unless a stream buffer is marked "read only",
--    which only happens when the stream's "fillbuf" method is called, even though
--    our buffers are always "read only", the library will try to flush out buffer
--    contents when the stream is destroyed, which makes it die a horrible death.
--    So, mark the stream buffer proactively:
-- */
--    str->bufmode_ |= JAS_STREAM_RDBUF; /* We will only read the stream buffer */
--    if (!(img = jpc_decode(str,0))) goto L2;
--    if ((vstride = jas_image_numcmpts(img))) /* num. color planes */
--      {
-+	/* Compute file size is portable way. */
-+	fseek(fp, 0L, 2);
-+	filesize = ftell(fp);
-+	fseek(fp, 0L, 0);
- 
--     /* After the image-component streams created, they are left in a "write"
--        state with the streams' cursors positioned at their ends, so "seek" in
--        order to "read" each stream from its beginning.
--     */
--        i = vstride;
--        while (--i >= 0)
--          if (jas_stream_seek(img->cmpts_[i]->stream_,0L,0))
--            {
--              SetISTR(ISTR_WARNING,read_err,fbasename,jpc_kind);
--              goto L1;
--            }
--      }
--    w = jas_image_width(img);
--    h = jas_image_height(img);
-+#if (JAS_VERSION_MAJOR >= 3)
-+	/*
-+	This approach will not work in JasPer prior to 3.0.0 due to a bug in
-+	the stream code.
-+	*/
-+	if (!(str = jas_stream_freopen(fname,fmode,fp))) {
-+		fclose(fp);
-+		ret = 0;
-+		goto done;
-+	}
- 
--    /* avoid buffer overflow */
--    npixels = w * h;
--    bufsize = vstride * npixels;
--    if (w <= 0 || h <= 0 || npixels/w != h || bufsize/vstride != npixels)
--      {
--        (void)fclose(fp);
--        SetISTR(ISTR_WARNING,bad_dims,fbasename);
--        goto L1;
--      }
--    pinfo->normw = pinfo->w = w;
--    pinfo->normh = pinfo->h = h;
-+	/* It's not clear to me whether the following represents a JasPer Library
-+	   "bug" but it sure looks goofy:  Unless a stream buffer is marked "read
-+	   only", which only happens when the stream's "fillbuf" method is called,
-+	   even though our buffers are always "read only", the library will try to
-+	   flush out buffer contents when the stream is destroyed, which makes it
-+	   die a horrible death. So, mark the stream buffer proactively:
-+	*/
-+	str->bufmode_ |= JAS_STREAM_RDBUF; /* We will only read the stream buffer */
-+#else
-+	{
-+		if (!(str = jas_stream_memopen(0, 0))) {
-+			ret = 0;
-+			goto done;
-+		}
-+		const size_t buffer_size = 1024;
-+		char buffer[buffer_size];
-+		for (;;) {
-+			size_t count;
-+			count = fread(buffer, 1, buffer_size, fp);
-+			if (!count) {
-+				if (!feof(fp)) {
-+					ret = 0;
-+					goto done;
-+				}
-+				break;
-+			}
-+			if (jas_stream_write(str, buffer, count) != count) {
-+				ret = 0;
-+				goto done;
-+			}
-+		}
-+		jas_stream_rewind(str);
-+	}
-+#endif
- 
-- /* Sanity-check the image's color space and no. of colors.  For now, accept
--    only "generic" color spaces, not files needing image-specific color
--    correction, but fix that someday...
-- */
--    switch (vstride)
--      {
--        default:
--          SetISTR(ISTR_WARNING,bad_samp,fbasename,vstride,jpc_kind);
--          goto L1;
--        case 1:
--          if ((i = jas_image_cmptprec(img,0)) != 8) /* not 8-bit pixels */
--            {
--              SetISTR(ISTR_WARNING,pixel_size,fbasename,i);
--              goto L1;
--            }
--          s = "Greyscale";
--          pinfo->type = PIC8;
--          pinfo->colType = F_GREYSCALE;
--          i = 256; /* Return fake indexed-color "map" */
--          while (--i >= 0) pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i;
--          break;
--        case 3:
-+	const jas_image_fmtinfo_t *fmtinfo = jas_image_lookupfmtbyname(
-+	  jpc_format ? "jpc" : "jp2");
-+	assert(fmtinfo);
-+	if (!(img = jas_image_decode(str, fmtinfo->id, 0))) {
-+		ret = 0;
-+		goto done;
-+	}
- 
--       /* BEWARE OF KLUDGE:  If the image's color space is RGB, assume that the
--                             data-sample precision for all color planes is the
--          same.  If the color space is YCbCr, assume the luminance (Y = 0th)
--          component has the greatest precision, although the chrominance
--          (Cr = 1st, Cb = 2nd) components are usually sub-sampled.
--       */
--          if ((i = jas_image_cmptprec(img,0)) != 8) /* not 24-bit pixels */
--            {
--              SetISTR(ISTR_WARNING,pixel_size,fbasename,i*3);
--              goto L1;
--            }
--          s = "Color";
--          pinfo->type = PIC24;
--          pinfo->colType = F_FULLCOLOR;
-+	w = jas_image_width(img);
-+	h = jas_image_height(img);
-+	vstride = jas_image_numcmpts(img);
- 
--       /* XXX  Unlike the IJG JPEG Library, the JasPer Library is apparently
--               unable to quantize colors or tell us whether the image's colors
--          were quantized by its creator, so it seems that we can't return a
--          color map for XV to potentially use 8-bit indexed color.  If there
--          *is* an easy way to do it that escapes me, put the code here someday.
--       */
--      }
--    if (!(pinfo->pic = (byte *)malloc(bufsize))) /* image buffer for XV */
--      {
--        SetISTR(ISTR_WARNING,no_mem,fbasename,jpc_kind);
--        goto L1;
--      }
--    pinfo->frmType = F_JPC;
--    sprintf(pinfo->fullInfo,full_msg,s,jpc_kind,filesize);
--    sprintf(pinfo->shrtInfo,shrt_msg,pinfo->w,pinfo->h,s,jpc_kind);
--    SetISTR(ISTR_INFO,load_msg,pinfo->normw,pinfo->normh,s,jpc_kind,filesize);
--    if (vstride == 1) /* gray-scale image */
--      { register jas_stream_t *c = img->cmpts_[0]->stream_;
--        register byte *p = pinfo->pic;
-+	/* avoid buffer overflow */
-+	npixels = w * h;
-+	bufsize = vstride * npixels;
-+	if (w <= 0 || h <= 0 || npixels / w != h || bufsize / vstride != npixels) {
-+		(void)fclose(fp);
-+		SetISTR(ISTR_WARNING, bad_dims, fbasename);
-+		ret = 0;
-+		goto done;
-+	}
-+	pinfo->normw = pinfo->w = w;
-+	pinfo->normh = pinfo->h = h;
- 
--     /* Since this is a 1-plane image, avoid a lot of errant nonsense in the
--        JasPer Library by sequentially reading all of the data into our buffer
--        directly.
--     */
--        do if ((i = (*c->ops_->read_)(c->obj_,(char *)p,bufsize)) <= 0)
--             {
--               SetISTR(ISTR_WARNING,i < 0 ? read_err : truncated,fbasename,
--                 jpc_kind);
--               goto L1;
--             }
--        while ((p += i),(bufsize -= i) > 0);
--      }
--    else /* RGB color image */
--      {
-+	/* Sanity-check the image's color space and no. of colors.  For now, accept
-+	   only "generic" color spaces, not files needing image-specific color
-+	   correction, but fix that someday...
-+	*/
-+	switch (vstride) {
-+		static char color_space[] = {"%s:  invalid color space!"};
- 
--     /* Reading color images is inefficient because JPEG 2000 wants to partition
--        file data into separate image planes (colors), while XV wants data
--        samples from each plane to be interleaved as 3-byte pixels.  Apparently
--        the fastest method consists of 3 passes through the XV image buffer,
--        into which we insert the bytes of each component.
--     */
--        i = 0;
--        do /* each color component */
--          { long npix = npixels;
--            register jas_stream_t *c = img->cmpts_[i]->stream_;
--            register byte *p = pinfo->pic + i;
-+	default:
-+		SetISTR(ISTR_WARNING, bad_samp, fbasename, vstride, jp2_kind);
-+		ret = 0;
-+		goto done;
-+	case 1:
-+		if (!jas_clrspc_isunknown(i = jas_image_clrspc(img)) &&
-+			jas_clrspc_fam(i) != JAS_CLRSPC_FAM_GRAY) {
-+			SetISTR(ISTR_WARNING, color_space, fbasename);
-+			ret = 0;
-+			goto done;
-+		}
-+		if ((i = jas_image_cmptprec(img, 0)) != 8) /* not 8-bit pixels */
-+		{
-+			SetISTR(ISTR_WARNING, pixel_size, fbasename, i);
-+			ret = 0;
-+			goto done;
-+		}
-+		s = "Greyscale";
-+		pinfo->type = PIC8;
-+		pinfo->colType = F_GREYSCALE;
-+		i = 256; /* Return fake indexed-color "map" */
-+		while (--i >= 0)
-+			pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i;
-+		break;
-+	case 3:
-+		if (jas_clrspc_isunknown(i = jas_image_clrspc(img))) {
-+			SetISTR(ISTR_WARNING, color_space, fbasename);
-+			ret = 0;
-+			goto done;
-+		}
-+		if (jas_clrspc_fam(i) != JAS_CLRSPC_FAM_RGB) {
-+			jas_image_t *oimg;
-+			jas_cmprof_t *profile;
- 
--            do /* each pixel */
--              { register int b;
-+			/* Here's where the JasPer Library really shines.  The only color
-+			   space that XV handles is RGB, so if that's not what our image
*** 2756 LINES SKIPPED ***