diff --git a/graphics/xv/Makefile b/graphics/xv/Makefile index eacddcdec1cb..ead1b403f35f 100644 --- a/graphics/xv/Makefile +++ b/graphics/xv/Makefile @@ -1,72 +1,48 @@ 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 OPTIONS_DEFINE= M17N DOCS M17N_DESC= build with Multilingualization support .include -.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 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,89 +1,40 @@ ---- 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. */ -#undef MACBINARY +#define MACBINARY /*************************************************************************** -@@ -175,8 +175,8 @@ +@@ -207,8 +207,8 @@ * is read-only), change 'undef' to 'define' the VIRTUAL_TD line. */ -#undef AUTO_EXPAND -#undef VIRTUAL_TD +#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. */ -#undef HAVE_MGCSFX +#define HAVE_MGCSFX #ifdef HAVE_MGCSFX /* -@@ -285,14 +285,14 @@ - * WARNING : If you decide to use preprocessor, you must not write - * '# ' 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. */ -#undef TV_MULTILINGUAL +/* #undef TV_MULTILINGUAL */ #define TV_DEFAULT_CODESET TV_EUC_JAPAN 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 -# 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,11 +1,11 @@ ---- 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; } -#if 0 +#if 1 /* FIXME: if we want to do this, we first have to wait for a configure * notify to avoid a race condition because the location might be in- * correct if the window manager does placement after managing the window. 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,15 +1,15 @@ ---- 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 if (!gif89) return(gifError(pinfo,"corrupt GIF file (screen descriptor)")); else normaspect = (float) (aspect + 15) / 64.0; /* gif89 aspect ratio */ +#else + 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 , Hewlett-Packard Laboratories, - * January 2005. -+ * -+ * Michael Aadams , 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 --/* 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 -+ uses, then to quote Capt. Kirk: "Make it so!" -+ */ -+ if (!(profile = jas_cmprof_createfromclrspc(JAS_CLRSPC_SRGB))) { -+ SetISTR(ISTR_WARNING, "%s: can't create RGB profile", -+ fbasename); -+ ret = 0; -+ goto done; -+ } -+ img = -+ jas_image_chclrspc(oimg = img, profile, JAS_CMXFORM_INTENT_PER); -+ jas_cmprof_destroy(profile); -+ if (!img) /* Oops! We failed, so restore original image */ -+ { -+ img = oimg; -+ SetISTR(ISTR_WARNING, "%s: can't convert to RGB", fbasename); -+ ret = 0; -+ goto done; -+ } -+ jas_image_destroy(oimg); -+ } - -- if ((b = jas_stream_getc(c)) < 0) -- { -- SetISTR(ISTR_WARNING, -- (c->flags_ & JAS_STREAM_EOF) ? truncated : read_err, -- fbasename,jpc_kind); -- goto L1; -- } -- *p = b; -- } -- while ((p += 3),--npix > 0); -- } -- while (++i <= 2); -- } -- ok = 1; /* Success! */ --L1: jas_image_destroy(img); --L2: (void)jas_stream_close(str); -- free(iobuf); --L3: return ok; --} -+ /* 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); -+ ret = 0; -+ goto done; -+ } -+ s = "Color"; -+ pinfo->type = PIC24; -+ pinfo->colType = F_FULLCOLOR; - --int LoadJP2(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; -+ /* 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. -+ */ -+ } - -- /* Load a JPEG 2000 JP2 image file into a pixel buffer for XV, doing any -- necessary color-space conversion to end up with 8-bit gray scale or 24-bit -- RGB. 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; -- } -+ /* image buffer for XV */ -+ if (!(pinfo->pic = (byte *)malloc(bufsize))) -+ { -+ SetISTR(ISTR_WARNING, no_mem, fbasename, jp2_kind); -+ ret = 0; -+ goto done; -+ } -+ pinfo->frmType = F_JP2; -+ sprintf(pinfo->fullInfo, full_msg, s, jp2_kind, filesize); -+ sprintf(pinfo->shrtInfo, shrt_msg, pinfo->w, pinfo->h, s, jp2_kind); -+ SetISTR(ISTR_INFO, load_msg, pinfo->normw, pinfo->normh, s, jp2_kind, -+ filesize); - -- /* 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); -+ /* Copy the sample data from the JasPer image to the xv image. */ -+ { -+ int num_comps = vstride; -+ int width = w; -+ int height = h; -+ int comp_ind; -+ data = jas_matrix_create(height, width); -+ assert(data); -+ for (comp_ind = 0; comp_ind < num_comps; ++comp_ind) { -+ if (jas_image_readcmpt(img, comp_ind, 0, 0, width, height, data)) { -+ ret = 0; -+ goto done; -+ } -+ unsigned char *buffer; -+ jas_seqent_t *src; -+ unsigned char *dst; -+ int xx, yy; -+ dst = pinfo->pic + comp_ind; -+ for (yy = 0; yy < height; ++yy) { -+ src = jas_matrix_getvref(data, yy); -+ for (xx = 0; xx < width; ++xx) { -+ *dst = *src; -+ ++src; -+ dst += num_comps; -+ } -+ } -+ } -+ } - -- /* "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))) -- { -- (void)fclose(fp); -- goto L3; -- } -+ /* Success! */ -+ ret = 1; - -- /* 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 = jp2_decode(str,0))) goto L2; -- if ((vstride = jas_image_numcmpts(img))) /* num. color planes */ -- { -+done: -+ if (data) { -+ jas_matrix_destroy(data); -+ } -+ if (img) { -+ jas_image_destroy(img); -+ } -+ if (str) { -+ jas_stream_close(str); -+ } -+#if (JAS_VERSION_MAJOR >= 3) -+ jas_cleanup_thread(); -+ jas_cleanup_library(); -+#else -+ jas_cleanup(); -+#endif -+ return ret; -+} - -- /* 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,jp2_kind); -- goto L1; -- } -- } -- w = jas_image_width(img); -- h = jas_image_height(img); -+int LoadJP2(char *fname, register PICINFO *pinfo, int quick) { -+ return LoadJP2K(fname, pinfo, quick, false); -+} - -- /* 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; -- -- /* 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!"}; -- -- default: -- SetISTR(ISTR_WARNING,bad_samp,fbasename,vstride,jp2_kind); -- goto L1; -- 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); -- goto L1; -- } -- 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: -- if (jas_clrspc_isunknown(i = jas_image_clrspc(img))) -- { -- SetISTR(ISTR_WARNING,color_space,fbasename); -- goto L1; -- } -- if (jas_clrspc_fam(i) != JAS_CLRSPC_FAM_RGB) -- { jas_image_t *oimg; -- jas_cmprof_t *profile; -- -- /* 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 -- uses, then to quote Capt. Kirk: "Make it so!" -- */ -- if (!(profile = jas_cmprof_createfromclrspc(JAS_CLRSPC_SRGB))) -- { -- SetISTR(ISTR_WARNING,"%s: can't create RGB profile", -- fbasename); -- goto L1; -- } -- img = jas_image_chclrspc( oimg = img -- , profile -- , JAS_CMXFORM_INTENT_PER -- ); -- jas_cmprof_destroy(profile); -- if (!img) /* Oops! We failed, so restore original image */ -- { -- img = oimg; -- SetISTR(ISTR_WARNING,"%s: can't convert to RGB",fbasename); -- goto L1; -- } -- jas_image_destroy(oimg); -- } -- -- /* 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; -- -- /* 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,jp2_kind); -- goto L1; -- } -- pinfo->frmType = F_JP2; -- sprintf(pinfo->fullInfo,full_msg,s,jp2_kind,filesize); -- sprintf(pinfo->shrtInfo,shrt_msg,pinfo->w,pinfo->h,s,jp2_kind); -- SetISTR(ISTR_INFO,load_msg,pinfo->normw,pinfo->normh,s,jp2_kind,filesize); -- if (vstride == 1) /* gray-scale image */ -- { register jas_stream_t *c = img->cmpts_[0]->stream_; -- register byte *p = pinfo->pic; -- -- /* 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, -- jp2_kind); -- goto L1; -- } -- while ((p += i),(bufsize -= i) > 0); -- } -- else /* RGB color image */ -- { -- -- /* 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; -- -- do /* each pixel */ -- { register int b; -- -- if ((b = jas_stream_getc(c)) < 0) -- { -- SetISTR(ISTR_WARNING, -- (c->flags_ & JAS_STREAM_EOF) ? truncated : read_err, -- fbasename,jp2_kind); -- goto L1; -- } -- *p = b; -- } -- while ((p += 3),--npix > 0); -- } -- while (++i <= 2); -- } -- ok = 1; /* Success! */ --L1: jas_image_destroy(img); --L2: (void)jas_stream_close(str); -- free(iobuf); --L3: return ok; -+int LoadJPC(char *fname, register PICINFO *pinfo, int quick) { -+ return LoadJP2K(fname, pinfo, quick, true); - } - - /* The following variables and subroutines are used when writing a JPEG 2000 - file, which is done mainly using call-backs from "X Windows" widgets. The - most complicated part of this interface is: managing interactions with a -- window to request the boat-loads of options that the JasPer Library supports. -- Start by defining subwindow sizes, plus indices into several arrays of -- corresponding widget-state variables. -+ window to request the boat-loads of options that the JasPer Library -+ supports. Start by defining subwindow sizes, plus indices into several -+ arrays of corresponding widget-state variables. - - IMPLEMENTATION NOTES: The following dimensions create a tall, thin window -- which appears to have considerable empty space at the -+ which appears to have considerable empty space at the - bottom. Before you complain, click the Precinct Height menu button in order -- to the tall pop-up subwindow that it generates. If the parent window is made -- shorter, then this pop-up will be clipped, which is an ugly nuisance. I -+ to the tall pop-up subwindow that it generates. If the parent window is -+ made shorter, then this pop-up will be clipped, which is an ugly nuisance. I - don't know how to make the pop-up visible outside its parent's borders; do -- you? If there's some way to make "X Windows" do this, then we might consider -- making the parent shorter. -+ you? If there's some way to make "X Windows" do this, then we might -+ consider making the parent shorter. - - Note that there is currently no mechanism to program the no. of intermediate - layers used by the encoder, or their rates. This is potentially a large and - complicated data-entry problem, and perhaps someday we can invent a clever - solution using the rest of the parent window's space. - */ --# define JP2KW 275 /* Window width, in pixels */ --# define JP2KH 400 /* Window height, in pixels */ --# define BUTTW 51 /* Button width, in pixels (odd for half-toning) */ --# define BUTTH 20 /* Button height, in pixels */ --# define MENUW 75 /* Menu-button width, in pixels (odd for half-toning) */ --# define MENUH 24 /* Menu-button height, in pixels */ --# define RBUTH 20 /* Radio button height, in pixels */ --# define RBUTW 51 /* Radio button width, in pixels (odd for half-toning) */ --# define TEXTH (LINEHIGH+5) /* Text subwindow height, in pixels */ --# define TEXTW 75 /* Text subwindow width, in pixels */ -+#define JP2KW 275 /* Window width, in pixels */ -+#define JP2KH 400 /* Window height, in pixels */ -+#define BUTTW 51 /* Button width, in pixels (odd for half-toning) */ -+#define BUTTH 20 /* Button height, in pixels */ -+#define MENUW 75 /* Menu-button width, in pixels (odd for half-toning) */ -+#define MENUH 24 /* Menu-button height, in pixels */ -+#define RBUTH 20 /* Radio button height, in pixels */ -+#define RBUTW 51 /* Radio button width, in pixels (odd for half-toning) */ -+#define TEXTH (LINEHIGH + 5) /* Text subwindow height, in pixels */ -+#define TEXTW 75 /* Text subwindow width, in pixels */ - --# define J_BOK 0 /* Boolean "Ok" button */ --# define J_BCANC 1 /* Boolean "Cancel" button */ --# define J_NBUTT 2 /* No. of regular button widgets */ -+#define J_BOK 0 /* Boolean "Ok" button */ -+#define J_BCANC 1 /* Boolean "Cancel" button */ -+#define J_NBUTT 2 /* No. of regular button widgets */ - --# define J_CSOP 0 /* Boolean encoding-style option buttons */ --# define J_CEPH 1 --# define J_CLAZY 2 --# define J_CTERM 3 --# define J_CSEGS 4 --# define J_CVCAU 5 --# define J_CPTRM 6 --# define J_CRSTP 7 --# define J_NCHKB 8 /* No. of check-box button widgets */ -+#define J_CSOP 0 /* Boolean encoding-style option buttons */ -+#define J_CEPH 1 -+#define J_CLAZY 2 -+#define J_CTERM 3 -+#define J_CSEGS 4 -+#define J_CVCAU 5 -+#define J_CPTRM 6 -+#define J_CRSTP 7 -+#define J_NCHKB 8 /* No. of check-box button widgets */ - --# define J_MCBXW 0 /* 1-of-N menu-selection buttons */ --# define J_MCBXH 1 --# define J_MPREW 2 --# define J_MPREH 3 --# define J_MPROG 4 --# define J_NMENU 5 /* No. of menu-button widgets */ -+#define J_MCBXW 0 /* 1-of-N menu-selection buttons */ -+#define J_MCBXH 1 -+#define J_MPREW 2 -+#define J_MPREH 3 -+#define J_MPROG 4 -+#define J_NMENU 5 /* No. of menu-button widgets */ - --# define J_TGBIT 0 /* (Unsigned numeric) string subwindows */ --# define J_TRES 1 --# define J_TRATE 2 --# define J_NTEXT 3 /* No. of text subwindows */ -+#define J_TGBIT 0 /* (Unsigned numeric) string subwindows */ -+#define J_TRES 1 -+#define J_TRATE 2 -+#define J_NTEXT 3 /* No. of text subwindows */ - - static BUTT button[J_NBUTT]; - static CBUTT chkbut[J_NCHKB]; -@@ -642,685 +462,757 @@ - static RBUTT *radio; - static Window text[J_NTEXT]; - static int colorType, format, textval[J_NTEXT]; --static const char *ProgList[]={"lrcp","rlcp","rpcl","pcrl","cprl"}; -+static const char *ProgList[] = {"lrcp", "rlcp", "rpcl", "pcrl", "cprl"}; - --void CreateJP2KW(void) --{ -- static const char EXP2_0[] ={ "1"}, /* Successive powers of 2 */ -- EXP2_1[] ={ "2"}, -- EXP2_2[] ={ "4"}, -- EXP2_3[] ={ "8"}, -- EXP2_4[] ={ "16"}, -- EXP2_5[] ={ "32"}, -- EXP2_6[] ={ "64"}, -- EXP2_7[] ={ "128"}, -- EXP2_8[] ={ "256"}, -- EXP2_9[] ={ "512"}, -- EXP2_10[]={ "1024"}, -- EXP2_11[]={ "2048"}, -- EXP2_12[]={ "4096"}, -- EXP2_13[]={ "8192"}, -- EXP2_14[]={"16384"}, -- EXP2_15[]={"32768"}; -- static const char *CBoxList[]= -- { -- EXP2_1 ,EXP2_2 ,EXP2_3 ,EXP2_4 ,EXP2_5,EXP2_6 ,EXP2_7 ,EXP2_8 ,EXP2_9, -- EXP2_10,EXP2_11 -- }; -- static const char *PrecList[]= -- { -- EXP2_0,EXP2_1,EXP2_2 ,EXP2_3 ,EXP2_4 ,EXP2_5 ,EXP2_6 ,EXP2_7 , -- EXP2_8,EXP2_9,EXP2_10,EXP2_11,EXP2_12,EXP2_13,EXP2_14,EXP2_15 -- }; -- static const char hstr[]={"Height"}, wstr[]={"Width"}; -+void CreateJP2KW(void) { -+ static const char EXP2_0[] = {"1"}, /* Successive powers of 2 */ -+ EXP2_1[] = {"2"}, EXP2_2[] = {"4"}, EXP2_3[] = {"8"}, EXP2_4[] = {"16"}, -+ EXP2_5[] = {"32"}, EXP2_6[] = {"64"}, EXP2_7[] = {"128"}, -+ EXP2_8[] = {"256"}, EXP2_9[] = {"512"}, -+ EXP2_10[] = {"1024"}, EXP2_11[] = {"2048"}, -+ EXP2_12[] = {"4096"}, EXP2_13[] = {"8192"}, -+ EXP2_14[] = {"16384"}, EXP2_15[] = {"32768"}; -+ static const char *CBoxList[] = {EXP2_1, EXP2_2, EXP2_3, EXP2_4, -+ EXP2_5, EXP2_6, EXP2_7, EXP2_8, -+ EXP2_9, EXP2_10, EXP2_11}; -+ static const char *PrecList[] = { -+ EXP2_0, EXP2_1, EXP2_2, EXP2_3, EXP2_4, EXP2_5, EXP2_6, EXP2_7, -+ EXP2_8, EXP2_9, EXP2_10, EXP2_11, EXP2_12, EXP2_13, EXP2_14, EXP2_15}; -+ static const char hstr[] = {"Height"}, wstr[] = {"Width"}; - -- if (!(jp2kW = CreateWindow( "xvjp2k" -- , "XVjp2k" -- , 0 -- , JP2KW -- , JP2KH -- , infofg -- , infobg -- , 0 -- ) -- ) -- ) FatalError("can't create JPEG 2000 window!"); -- XSelectInput(theDisp,jp2kW,ExposureMask|ButtonPressMask|KeyPressMask); -+ if (!(jp2kW = CreateWindow("xvjp2k", "XVjp2k", 0, JP2KW, JP2KH, infofg, -+ infobg, 0))) -+ FatalError("can't create JPEG 2000 window!"); -+ XSelectInput(theDisp, jp2kW, ExposureMask | ButtonPressMask | KeyPressMask); - -- /* Create a row of 2 boolean-valued, regular buttons ("Ok" and "Cancel") in the -- window's bottom right corner. -- */ -- BTCreate(&button[J_BOK ],jp2kW, -- JP2KW-2*BUTTW-20,JP2KH-10-BUTTH-1,BUTTW,BUTTH, -- "Ok" ,infofg,infobg,hicol,locol); -- BTCreate(&button[J_BCANC],jp2kW, -- JP2KW- BUTTW-10,JP2KH-10-BUTTH-1,BUTTW,BUTTH, -- "Cancel",infofg,infobg,hicol,locol); -+ /* Create a row of 2 boolean-valued, regular buttons ("Ok" and "Cancel") in -+ the window's bottom right corner. -+ */ -+ BTCreate(&button[J_BOK], jp2kW, JP2KW - 2 * BUTTW - 20, -+ JP2KH - 10 - BUTTH - 1, BUTTW, BUTTH, "Ok", infofg, infobg, hicol, -+ locol); -+ BTCreate(&button[J_BCANC], jp2kW, JP2KW - BUTTW - 10, -+ JP2KH - 10 - BUTTH - 1, BUTTW, BUTTH, "Cancel", infofg, infobg, -+ hicol, locol); - -- /* Create a vertical column of 8 boolean-valued, check-box buttons (for -- encoding-style options) down the window's left side. -- */ -- CBCreate(&chkbut[J_CSOP] ,jp2kW, -- 10,10+ASCENT+SPACING+2*LINEHIGH+0*BUTTH, -- "sop" ,infofg,infobg,hicol,locol); -- CBCreate(&chkbut[J_CEPH] ,jp2kW, -- 10,10+ASCENT+SPACING+2*LINEHIGH+1*BUTTH, -- "eph" ,infofg,infobg,hicol,locol); -- CBCreate(&chkbut[J_CLAZY],jp2kW, -- 10,10+ASCENT+SPACING+2*LINEHIGH+2*BUTTH, -- "lazy" ,infofg,infobg,hicol,locol); -- CBCreate(&chkbut[J_CTERM],jp2kW, -- 10,10+ASCENT+SPACING+2*LINEHIGH+3*BUTTH, -- "termall" ,infofg,infobg,hicol,locol); -- CBCreate(&chkbut[J_CSEGS],jp2kW, -- 10,10+ASCENT+SPACING+2*LINEHIGH+4*BUTTH, -- "segsym" ,infofg,infobg,hicol,locol); -- CBCreate(&chkbut[J_CVCAU],jp2kW, -- 10,10+ASCENT+SPACING+2*LINEHIGH+5*BUTTH, -- "vcausal" ,infofg,infobg,hicol,locol); -- CBCreate(&chkbut[J_CPTRM],jp2kW, -- 10,10+ASCENT+SPACING+2*LINEHIGH+6*BUTTH, -- "pterm" ,infofg,infobg,hicol,locol); -- CBCreate(&chkbut[J_CRSTP],jp2kW, -- 10,10+ASCENT+SPACING+2*LINEHIGH+7*BUTTH, -- "resetprob",infofg,infobg,hicol,locol); -- /* Create text subwindows for unsigned decimal integer values. */ -+ /* Create a vertical column of 8 boolean-valued, check-box buttons (for -+ encoding-style options) down the window's left side. -+ */ -+ CBCreate(&chkbut[J_CSOP], jp2kW, 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 0 * BUTTH, "sop", infofg, -+ infobg, hicol, locol); -+ CBCreate(&chkbut[J_CEPH], jp2kW, 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 1 * BUTTH, "eph", infofg, -+ infobg, hicol, locol); -+ CBCreate(&chkbut[J_CLAZY], jp2kW, 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 2 * BUTTH, "lazy", infofg, -+ infobg, hicol, locol); -+ CBCreate(&chkbut[J_CTERM], jp2kW, 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 3 * BUTTH, "termall", -+ infofg, infobg, hicol, locol); -+ CBCreate(&chkbut[J_CSEGS], jp2kW, 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 4 * BUTTH, "segsym", infofg, -+ infobg, hicol, locol); -+ CBCreate(&chkbut[J_CVCAU], jp2kW, 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 5 * BUTTH, "vcausal", -+ infofg, infobg, hicol, locol); -+ CBCreate(&chkbut[J_CPTRM], jp2kW, 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 6 * BUTTH, "pterm", infofg, -+ infobg, hicol, locol); -+ CBCreate(&chkbut[J_CRSTP], jp2kW, 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 7 * BUTTH, "resetprob", -+ infofg, infobg, hicol, locol); -+ /* Create text subwindows for unsigned decimal integer values. */ - -- text[J_TGBIT] = XCreateSimpleWindow(theDisp,jp2kW, -- JP2KW-TEXTW-10,10+ASCENT+SPACING+2*LINEHIGH+3*MENUH+0*TEXTH,TEXTW,TEXTH, -- 1,infofg,infobg); -- XSelectInput(theDisp,text[J_TGBIT],ExposureMask|KeyPressMask); -- text[J_TRES ] = XCreateSimpleWindow(theDisp,jp2kW, -- JP2KW-TEXTW-10,10+ASCENT+SPACING+2*LINEHIGH+3*MENUH+1*TEXTH,TEXTW,TEXTH, -- 1,infofg,infobg); -- XSelectInput(theDisp,text[J_TRES ],ExposureMask|KeyPressMask); -- text[J_TRATE] = XCreateSimpleWindow(theDisp,jp2kW, -- JP2KW-TEXTW-10,10+ASCENT+SPACING+2*LINEHIGH+3*MENUH+2*TEXTH,TEXTW,TEXTH, -- 1,infofg,infobg); -- XSelectInput(theDisp,text[J_TRATE],ExposureMask|KeyPressMask); -+ text[J_TGBIT] = XCreateSimpleWindow(theDisp, jp2kW, JP2KW - TEXTW - 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + -+ 3 * MENUH + 0 * TEXTH, -+ TEXTW, TEXTH, 1, infofg, infobg); -+ XSelectInput(theDisp, text[J_TGBIT], ExposureMask | KeyPressMask); -+ text[J_TRES] = XCreateSimpleWindow(theDisp, jp2kW, JP2KW - TEXTW - 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + -+ 3 * MENUH + 1 * TEXTH, -+ TEXTW, TEXTH, 1, infofg, infobg); -+ XSelectInput(theDisp, text[J_TRES], ExposureMask | KeyPressMask); -+ text[J_TRATE] = XCreateSimpleWindow(theDisp, jp2kW, JP2KW - TEXTW - 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + -+ 3 * MENUH + 2 * TEXTH, -+ TEXTW, TEXTH, 1, infofg, infobg); -+ XSelectInput(theDisp, text[J_TRATE], ExposureMask | KeyPressMask); - -- /* Create a row of 2 boolean-valued radio buttons (for the "Rate" subwindow -- value's unit of measure). The 1st button is "selected" by default. -- */ -- radio = RBCreate(0,jp2kW, -- JP2KW-19*RBUTW/8-10,10+ASCENT+SPACING+2*LINEHIGH+3*MENUH+3*TEXTH+4, -- "Percent",infofg,infobg,hicol,locol); -- (void)RBCreate(radio,jp2kW, -- JP2KW-1*RBUTW-10 ,10+ASCENT+SPACING+2*LINEHIGH+3*MENUH+3*TEXTH+4, -- "Bytes",infofg,infobg,hicol,locol); -+ /* Create a row of 2 boolean-valued radio buttons (for the "Rate" subwindow -+ value's unit of measure). The 1st button is "selected" by default. -+ */ -+ radio = RBCreate(0, jp2kW, JP2KW - 19 * RBUTW / 8 - 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 3 * MENUH + -+ 3 * TEXTH + 4, -+ "Percent", infofg, infobg, hicol, locol); -+ (void)RBCreate(radio, jp2kW, JP2KW - 1 * RBUTW - 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 3 * MENUH + -+ 3 * TEXTH + 4, -+ "Bytes", infofg, infobg, hicol, locol); - -- /* Create pop-up menu-selection buttons after mapping the above subwindows, -- since we don't want the pop-up menus mapped unless the corresponding button -- is selected. -- */ -- XMapSubwindows(theDisp,jp2kW); -- MBCreate(&menu[J_MCBXW],jp2kW, -- JP2KW-2*MENUW-10,10+ASCENT+SPACING+2*LINEHIGH+0*MENUH,MENUW,MENUH, -- wstr ,CBoxList,sizeof CBoxList/sizeof *CBoxList,infofg,infobg, -- hicol,locol); -- MBCreate(&menu[J_MCBXH],jp2kW, -- JP2KW-2*MENUW-10,10+ASCENT+SPACING+2*LINEHIGH+1*MENUH,MENUW,MENUH, -- hstr ,CBoxList,sizeof CBoxList/sizeof *CBoxList,infofg,infobg, -- hicol,locol); -- MBCreate(&menu[J_MPREW],jp2kW, -- JP2KW-1*MENUW-10,10+ASCENT+SPACING+2*LINEHIGH+0*MENUH,MENUW,MENUH, -- wstr ,PrecList,sizeof PrecList/sizeof *PrecList,infofg,infobg, -- hicol,locol); -- MBCreate(&menu[J_MPREH],jp2kW, -- JP2KW-1*MENUW-10,10+ASCENT+SPACING+2*LINEHIGH+1*MENUH,MENUW,MENUH, -- hstr ,PrecList,sizeof PrecList/sizeof *PrecList,infofg,infobg, -- hicol,locol); -- MBCreate(&menu[J_MPROG],jp2kW, -- JP2KW-1*MENUW-10,10+ASCENT+SPACING+2*LINEHIGH+2*MENUH,MENUW,MENUH, -- "Order",ProgList,sizeof ProgList/sizeof *ProgList,infofg,infobg, -- hicol,locol); -+ /* Create pop-up menu-selection buttons after mapping the above subwindows, -+ since we don't want the pop-up menus mapped unless the corresponding -+ button is selected. -+ */ -+ XMapSubwindows(theDisp, jp2kW); -+ MBCreate(&menu[J_MCBXW], jp2kW, JP2KW - 2 * MENUW - 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 0 * MENUH, MENUW, MENUH, -+ wstr, CBoxList, sizeof CBoxList / sizeof *CBoxList, infofg, infobg, -+ hicol, locol); -+ MBCreate(&menu[J_MCBXH], jp2kW, JP2KW - 2 * MENUW - 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 1 * MENUH, MENUW, MENUH, -+ hstr, CBoxList, sizeof CBoxList / sizeof *CBoxList, infofg, infobg, -+ hicol, locol); -+ MBCreate(&menu[J_MPREW], jp2kW, JP2KW - 1 * MENUW - 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 0 * MENUH, MENUW, MENUH, -+ wstr, PrecList, sizeof PrecList / sizeof *PrecList, infofg, infobg, -+ hicol, locol); -+ MBCreate(&menu[J_MPREH], jp2kW, JP2KW - 1 * MENUW - 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 1 * MENUH, MENUW, MENUH, -+ hstr, PrecList, sizeof PrecList / sizeof *PrecList, infofg, infobg, -+ hicol, locol); -+ MBCreate(&menu[J_MPROG], jp2kW, JP2KW - 1 * MENUW - 10, -+ 10 + ASCENT + SPACING + 2 * LINEHIGH + 2 * MENUH, MENUW, MENUH, -+ "Order", ProgList, sizeof ProgList / sizeof *ProgList, infofg, -+ infobg, hicol, locol); - -- /* Initialize values represented by widgets, which should correspond to default -- compiled into the JasPer Library. Unfortunately, as of Version 1.701 there -- is no easy way for an application to extract these from the library, so the -- following code might get out of sync over time: -- */ -- menu[J_MCBXW].hascheck = 1; menu[J_MCBXW].flags[ 5] = 1; -- menu[J_MCBXH].hascheck = 1; menu[J_MCBXH].flags[ 5] = 1; -- menu[J_MPREW].hascheck = 1; menu[J_MPREW].flags[15] = 1; -- menu[J_MPREH].hascheck = 1; menu[J_MPREH].flags[15] = 1; -- menu[J_MPROG].hascheck = 1; menu[J_MPROG].flags[ 0] = 1; -- textval[J_TGBIT] = 2; /* No. of guard bits */ -- textval[J_TRES ] = 6; /* Max. no. of resolution levels */ -- textval[J_TRATE] = 100; /* Rate = 100% */ -+ /* Initialize values represented by widgets, which should correspond to -+ default compiled into the JasPer Library. Unfortunately, as of -+ Version 1.701 there is no easy way for an application to extract these -+ from the library, so the following code might get out of sync over time: -+ */ -+ menu[J_MCBXW].hascheck = 1; -+ menu[J_MCBXW].flags[5] = 1; -+ menu[J_MCBXH].hascheck = 1; -+ menu[J_MCBXH].flags[5] = 1; -+ menu[J_MPREW].hascheck = 1; -+ menu[J_MPREW].flags[15] = 1; -+ menu[J_MPREH].hascheck = 1; -+ menu[J_MPREH].flags[15] = 1; -+ menu[J_MPROG].hascheck = 1; -+ menu[J_MPROG].flags[0] = 1; -+ textval[J_TGBIT] = 2; /* No. of guard bits */ -+ textval[J_TRES] = 6; /* Max. no. of resolution levels */ -+ textval[J_TRATE] = 100; /* Rate = 100% */ - } - --void JP2KSaveParams(int fmt,char *fname,int col) /* Save output-file parms */ -+void JP2KSaveParams(int fmt, char *fname, int col) /* Save output-file parms */ - { -- format = fmt; /* Desired file format: F_JPC|F_JP2 */ -- fbasename = fname; /* ->Output file path */ -- colorType = col; /* Desired color space: F_GREYSCALE|... */ -+ format = fmt; /* Desired file format: F_JPC|F_JP2 */ -+ fbasename = fname; /* ->Output file path */ -+ colorType = col; /* Desired color space: F_GREYSCALE|... */ - } - --static void StoreJP2K(char *options) --{ -- static jas_image_cmptparm_t parm[3]= /* Image parameters */ -- {{0,0,1,1,0,0,8,0},{0,0,1,1,0,0,8,0},{0,0,1,1,0,0,8,0}}; -- static char nomem[]={"StoreJP2K: out of memory\n"}, -- write[]={"w"}; -- jas_image_t *img; -- jas_stream_t *str; -- FILE *fp, *fp2; -- byte *pic, *r, *g, *b; -- const char *filename; -- char *iobuf = 0; -- unsigned long imagesize; -- jas_clrspc_t color_space; -- int nc, w, h, pfree, ptype, error = 1; -- register int i; -+static void StoreJP2K(char *options) { -+ static jas_image_cmptparm_t parm[3] = /* Image parameters */ -+ {{0, 0, 1, 1, 0, 0, 8, 0}, -+ {0, 0, 1, 1, 0, 0, 8, 0}, -+ {0, 0, 1, 1, 0, 0, 8, 0}}; -+ static char nomem[] = {"StoreJP2K: out of memory\n"}, write[] = {"w"}; -+ jas_image_t *img = 0; -+ jas_stream_t *str = 0; -+ FILE *fp = 0; -+ FILE *fp2 = 0; -+ byte *pic, *r, *g, *b; -+ const char *filename; -+ unsigned long imagesize; -+ jas_clrspc_t color_space; -+ int nc, w, h; -+ int pfree, ptype; -+ int error = 1; -+ register int i; -+ jas_matrix_t *data = 0; -+ int debug_level = get_debug_level(); - -- /* This is a generic subroutine for writing JPEG 2000 image files using the -- JasPer Library. Our argument is an ASCII string, containing a Space (" ")- -- separated sequence of encoder options that currently aren't well documented. -- Most of the work is identical for both ".jpc" and ".jp2" files. Start by -- verifying that the output file can be opened, then get an image buffer from -- XV and begin crunching it into a suitable form for the JasPer Library. -- */ -- if (!(fp = OpenOutFile(filename = fbasename))) return; /* Oops! */ -- setbuf(fp,0); /* We don't really use this file pointer for I/O; see below */ -- fbasename = BaseName(filename); -- WaitCursor(); -- pic = GenSavePic(&ptype,&w,&h,&pfree,&nc,&r,&g,&b); -- imagesize = w*h; -- if (ptype == PIC24) imagesize *= 3; -+#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); -+ jas_set_debug_level(debug_level); -+#else -+ jas_init(); -+ jas_setdbglevel(debug_level); -+#endif - -- /* As an optimization to save file space, even if our user didn't ask to store -- a gray-scale image, check whether we could and, if so, do it anyway. -- */ -- if (colorType != F_GREYSCALE) /* can we force a gray-scale image? */ -- { -- if (ptype == PIC8) -- { -- i = nc; -- while (--i >= 0 && r[i] == g[i] && r[i] == b[i]); -- } -- else /* PIC24 */ -- { register byte *p = pic + imagesize; -+ /* This is a generic subroutine for writing JPEG 2000 image files using the -+ JasPer Library. Our argument is an ASCII string, containing a Space (" -+ ")- separated sequence of encoder options that currently aren't well -+ documented. Most of the work is identical for both ".jpc" and ".jp2" -+ files. Start by verifying that the output file can be opened, then get an -+ image buffer from XV and begin crunching it into a suitable form for the -+ JasPer Library. -+ */ -+ if (!(fp = OpenOutFile(filename = fbasename))) -+ return; /* Oops! */ -+ setbuf(fp, -+ 0); /* We don't really use this file pointer for I/O; see below */ -+ fbasename = BaseName(filename); -+ WaitCursor(); -+ pic = GenSavePic(&ptype, &w, &h, &pfree, &nc, &r, &g, &b); -+ assert(ptype == PIC8 || ptype == PIC24); -+ imagesize = w * h; -+ if (ptype == PIC24) -+ imagesize *= 3; - -- while ((p -= 3) >= pic && p[0] == p[1] && p[0] == p[2]); -- i = p-pic; -- }; -- if (i < 0) colorType = F_GREYSCALE; /* We made it all the way through */ -- }; -+ assert(colorType == F_GREYSCALE || colorType == F_FULLCOLOR); -+#if 1 -+ /* As an optimization to save file space, even if our user didn't ask to -+ store a gray-scale image, check whether we could and, if so, do it -+ anyway. -+ */ -+ if (colorType != F_GREYSCALE) /* can we force a gray-scale image? */ -+ { -+ if (ptype == PIC8) { -+ i = nc; -+ while (--i >= 0 && r[i] == g[i] && r[i] == b[i]) {} -+ } else { -+ assert(ptype == PIC24); -+ /* PIC24 */ -+ byte *p = pic + imagesize; -+ while ((p -= 3) >= pic && p[0] == p[1] && p[0] == p[2]) {} -+ i = p - pic; -+ }; -+ if (i < 0) { -+ colorType = F_GREYSCALE; /* We made it all the way through */ -+ } -+ }; -+#endif - -- /* If XV is currently color-mapping the image, make a color-mapped copy so that -- the map needn't be transmitted in the output file. -- */ -- if ((i = (colorType != F_GREYSCALE) << 1 | (ptype != PIC8)) != 3) -- { byte *tmp = pic, *last = pic + imagesize; -- register byte *from = tmp, *to = pic; -+ /* Now comes a egregious hack: The JasPer Library will eventually want to -+ close the output file that it writes, but since XV opened the file, XV -+ also thinks it has the right to close the file! In order to pacify them -+ both, we duplicate the file pointer and let the JasPer Library have it, -+ while we retain the original for XV. - -- if (!(pic = (byte *)malloc(imagesize))) FatalError(nomem); -- switch (i) -- { -+ XXX This code is very UNIX-specific; what's an equivalent hack for -+ Windows? -+ */ -+ { -+ int fd = dup(fileno(fp)); -+ if (fd < 0) { -+ FatalError("StoreJP2K: can't duplicate output file pointer\n"); -+ } -+ if (!(fp2 = fdopen(fd, write))) { -+ FatalError("StoreJP2K: can't duplicate output file pointer\n"); -+ } -+ } - -- /* Color-map 8->8 bit image. */ -+ /* Hand our output file to the JasPer Library and create an image object. -+ "jas_stream_close()" will eventually close our output file, so only do it -+ explicitly if no stream can be created. If everything looks copacetic, -+ then write our buffer contents to the image components' streams. -+ */ -+ if (!(str = jas_stream_freopen(filename, write, fp2))) { -+ (void)fclose(fp2); -+ FatalError("StoreJP2K: can't open output stream\n"); -+ }; -+ fp2 = 0; - -- case 0: do -- { -- i = *from; -- *to++ = MONO(r[i],g[i],b[i]); -- } -- while (++from < last); -- break; -+ int num_comps = (colorType == F_GREYSCALE) ? 1 : 3; -+ int comp_ind; -+ if (num_comps == 3) { -+ color_space = JAS_CLRSPC_SRGB; -+ } else { -+ color_space = JAS_CLRSPC_SGRAY; -+ } -+ for (comp_ind = 0; comp_ind < num_comps; ++comp_ind) { -+ parm[comp_ind].tlx = 0; -+ parm[comp_ind].tly = 0; -+ parm[comp_ind].hstep = 1; -+ parm[comp_ind].vstep = 1; -+ parm[comp_ind].width = w; -+ parm[comp_ind].height = h; -+ parm[comp_ind].prec = 8; -+ parm[comp_ind].sgnd = 0; -+ } -+ if (!(img = jas_image_create(num_comps, parm, color_space))) { -+ goto L2; -+ } -+ if (get_debug_level() >= 1) { -+ fprintf(stderr, "num_comps %d width %d height %d\n", num_comps, w, h); -+ fprintf(stderr, "colorType %d\n", colorType); -+ fprintf(stderr, "ptype %d\n", ptype); -+ } - -- /* Color-map 24->8 bit image. */ -+ { -+ int comp_ind; -+ if (!(data = jas_matrix_create(h, w))) { -+ goto done; -+ } -+ if (num_comps == 3) { -+ for (comp_ind = 0; comp_ind < num_comps; ++comp_ind) { -+ int comp_type; -+ switch (comp_ind) { -+ case 0: -+ comp_type = JAS_IMAGE_CT_RGB_R; -+ break; -+ case 1: -+ comp_type = JAS_IMAGE_CT_RGB_G; -+ break; -+ case 2: -+ comp_type = JAS_IMAGE_CT_RGB_B; -+ break; -+ } -+ jas_image_setcmpttype(img, comp_ind, comp_type); -+ unsigned char *buffer; -+ unsigned char *src; -+ jas_seqent_t *dst; -+ int x, y; -+ src = pic + comp_ind; -+ for (y = 0; y < h; ++y) { -+ dst = jas_matrix_getvref(data, y); -+ for (x = 0; x < w; ++x) { -+ *dst = *src; -+ ++dst; -+ src += num_comps; -+ } -+ } -+ if (jas_image_writecmpt(img, comp_ind, 0, 0, w, h, data)) { -+ goto L1; -+ } -+ } -+ } else { -+ int mode = (ptype == PIC8) ? 0 : 1; -+ assert(num_comps == 1); -+ jas_image_setcmpttype(img, 0, JAS_IMAGE_CT_GRAY_Y); -+ unsigned char *buffer; -+ unsigned char *src; -+ jas_seqent_t *dst; -+ int x, y; -+ src = pic; -+ for (y = 0; y < h; ++y) { -+ dst = jas_matrix_getvref(data, y); -+ for (x = 0; x < w; ++x) { -+ int v; -+ if (mode == 0) { -+ v = *src; -+ v = MONO(r[v], g[v], b[v]); -+ } else if (mode == 1) { -+ v = MONO(src[0], src[1], src[2]); -+ } -+ *dst = v; -+ ++dst; -+ ++src; -+ } -+ } -+ if (jas_image_writecmpt(img, 0, 0, 0, w, h, data)) { -+ goto L1; -+ } -+ } -+ } - -- case 1: do *to++ = MONO(from[0],from[1],from[2]); -- while ((from += 3) < last); -- break; -+ const jas_image_fmtinfo_t *fmtinfo = -+ jas_image_lookupfmtbyname(((format == F_JPC) ? "jpc" : "jp2")); -+ if (!jas_image_encode(img, str, fmtinfo->id, options) && -+ jas_stream_flush(str) >= 0) { -+ error = 0; /* Success! */ -+ } - -- /* Color-map 8->24 bit image. */ -+done: -+ if (data) { -+ jas_matrix_destroy(data); -+ } -+L1: -+ if (img) { -+ jas_image_destroy(img); -+ } -+L2: -+ if (str) { -+ jas_stream_close(str); -+ } -+ if (pfree) { -+ free(pic); -+ } -+ if (!CloseOutFile(fp, filename, error)) { -+ DirBox(0); -+ } -+ SetCursors(-1); - -- case 2: do -- { -- i = *from; -- *to++ = r[i]; *to++ = g[i]; *to++ = b[i]; -- } -- while (++from < last); -- break; -- }; -- if (pfree) free(tmp); /* Release the original image buffer if we can */ -- pfree = 1; /* Let the modified buffer be released later */ -- }; -- -- /* Initialize various image-file parameter variables. */ -- -- parm[0].width = w; -- parm[0].height = h; -- if (colorType == F_GREYSCALE) /* gray-scale image */ -- { -- ptype = 1; /* No. of color planes */ -- color_space = JAS_CLRSPC_SGRAY; -- } -- else /* RGB color image */ -- { -- ptype = 3; /* No. of color planes */ -- color_space = JAS_CLRSPC_SRGB; -- parm[2].width = parm[1].width = parm[0].width; -- parm[2].height = parm[1].height = parm[0].height; -- }; -- -- /* Now comes a egregious hack: The JasPer Library will eventually want to -- close the output file that it writes, but since XV opened the file, XV also -- thinks it has the right to close the file! In order to pacify them both, -- we duplicate the file pointer and let the JasPer Library have it, while we -- retain the original for XV. -- -- XXX This code is very UNIX-specific; what's an equivalent hack for Windows? -- */ -- if (!(fp2 = (i = dup(fileno(fp))) >= 0 ? fdopen(i,write) : 0)) -- FatalError("StoreJP2K: can't duplicate output file pointer\n"); -- if (!(iobuf = SetBuf(fp2))) -- { -- (void)fclose(fp2); -- FatalError(nomem); -- }; -- -- /* Hand our output file to the JasPer Library and create an image object. -- "jas_stream_close()" will eventually close our output file, so only do it -- explicitly if no stream can be created. If everything looks copacetic, -- then write our buffer contents to the image components' streams. -- */ -- if (!(str = jas_stream_freopen(filename,write,fp2))) -- { -- (void)fclose(fp2); -- FatalError("StoreJP2K: can't open output stream\n"); -- }; -- if (!(img = jas_image_create(ptype,parm,color_space))) goto L2; -- if (ptype == 1) -- { register jas_stream_t *c = img->cmpts_[0]->stream_; -- register byte *p = pic; -- -- /* Since this is a 1-plane image, avoid a lot of errant nonsense in the -- JasPer Library by sequentially writing all of the data directly from our -- buffer. -- */ -- jas_image_setcmpttype(img,0,JAS_IMAGE_CT_GRAY_Y); -- img->cmpts_[0]->type_ = JAS_IMAGE_CT_GRAY_Y; -- do if ((i = (*c->ops_->write_)(c->obj_,(char *)p,imagesize)) <= 0) -- goto L1; -- while ((p += i),(imagesize -= i) > 0); -- if (jas_stream_flush(c) < 0) goto L1; -- } -- else /* RGB color image */ -- { -- -- /* Writing 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, -- from which we extract the bytes of each component. -- */ -- i = 0; -- do /* each color component */ -- { long npix = imagesize/3; -- register jas_stream_t *c = img->cmpts_[i]->stream_; -- register byte *p = pic + i; -- -- jas_image_setcmpttype(img,i,i+JAS_IMAGE_CT_RGB_R); -- do if (jas_stream_putc(c,*p) < 0) goto L1; -- while ((p += 3),--npix > 0); -- if (jas_stream_flush(c) < 0) goto L1; -- } -- while (++i <= 2); -- }; -- if ( (*(format == F_JPC ? jpc_encode : jp2_encode))(img,str,options) >= 0 -- && jas_stream_flush(str) >= 0 -- ) error = 0; /* Success! */ --L1: jas_image_destroy(img); --L2: (void)jas_stream_close(str); -- if (iobuf) free(iobuf); -- if (pfree) free(pic); -- if (!CloseOutFile(fp,filename,error)) DirBox(0); -- SetCursors(-1); -+#if (JAS_VERSION_MAJOR >= 3) -+ jas_cleanup_thread(); -+ jas_cleanup_library(); -+#else -+ jas_cleanup(); -+#endif - } - --void JP2KDialog(int vis) --{ -- if ((jp2kUp = vis)) CenterMapWindow(jp2kW,0,0,JP2KW,JP2KH); -- else XUnmapWindow(theDisp,jp2kW); -+void JP2KDialog(int vis) { -+ if ((jp2kUp = vis)) -+ CenterMapWindow(jp2kW, 0, 0, JP2KW, JP2KH); -+ else -+ XUnmapWindow(theDisp, jp2kW); - } - --static void TWRedraw(Window w,unsigned int val) --{ -- char buf[11]; -- register int i; -+static void TWRedraw(Window w, unsigned int val) { -+ char buf[11]; -+ register int i; - -- /* Draw a 1-line numeric text string in the specified window, representing the -- argument value as a left-justified unsigned decimal integer, followed by a -- "cursor" icon. -- */ -- sprintf(buf,"%u",val); -- if (ctrlColor) XClearArea(theDisp,w,2,2,TEXTW-4,TEXTH-4,False); -- else XClearWindow(theDisp,w); -- Draw3dRect(w,0,0,TEXTW-1,TEXTH-1,R3D_IN,2,hicol,locol,infobg); -- XSetForeground(theDisp,theGC,infofg); -- XDrawString(theDisp,w,theGC,3,ASCENT+3,buf,i = strlen(buf)); -+ /* Draw a 1-line numeric text string in the specified window, representing -+ the argument value as a left-justified unsigned decimal integer, followed -+ by a "cursor" icon. -+ */ -+ sprintf(buf, "%u", val); -+ if (ctrlColor) -+ XClearArea(theDisp, w, 2, 2, TEXTW - 4, TEXTH - 4, False); -+ else -+ XClearWindow(theDisp, w); -+ Draw3dRect(w, 0, 0, TEXTW - 1, TEXTH - 1, R3D_IN, 2, hicol, locol, infobg); -+ XSetForeground(theDisp, theGC, infofg); -+ XDrawString(theDisp, w, theGC, 3, ASCENT + 3, buf, i = strlen(buf)); - -- /* Draw a "cursor" icon after the numeric string. */ -+ /* Draw a "cursor" icon after the numeric string. */ - -- i = XTextWidth(mfinfo,buf,i); -- XDrawLine(theDisp,w,theGC,i+3,2 ,i+3,2+CHIGH+1); -- XDrawLine(theDisp,w,theGC,i+3,2+CHIGH+1,i+5,2+CHIGH+3); -- XDrawLine(theDisp,w,theGC,i+3,2+CHIGH+1,i+1,2+CHIGH+3); -+ i = XTextWidth(mfinfo, buf, i); -+ XDrawLine(theDisp, w, theGC, i + 3, 2, i + 3, 2 + CHIGH + 1); -+ XDrawLine(theDisp, w, theGC, i + 3, 2 + CHIGH + 1, i + 5, 2 + CHIGH + 3); -+ XDrawLine(theDisp, w, theGC, i + 3, 2 + CHIGH + 1, i + 1, 2 + CHIGH + 3); - } - --int JP2KCheckEvent(register XEvent *xev) --{ -- int ok = 0; -+int JP2KCheckEvent(register XEvent *xev) { -+ int ok = 0; - -- /* Check whether the argument "X Windows" event is for one of our subwindows. -- If it is, handle the event and return 1; otherwise, return 0. -- */ -- if (!jp2kUp) return 0; -- switch (xev->type) -- { KeySym ks; -- int len; -- char buf[128]; -- register int i; -+ /* Check whether the argument "X Windows" event is for one of our -+ subwindows. If it is, handle the event and return 1; otherwise, return 0. -+ */ -+ if (!jp2kUp) -+ return 0; -+ switch (xev->type) { -+ KeySym ks; -+ int len; -+ char buf[128]; -+ register int i; - -- /* Throw away excess "expose" events for "dumb" windows. */ -+ /* Throw away excess "expose" events for "dumb" windows. */ - -- case Expose : --# define E ((XExposeEvent *)xev) -- if (E->window == jp2kW) -- { XRectangle rect; -+ case Expose: -+#define E ((XExposeEvent *)xev) -+ if (E->window == jp2kW) { -+ XRectangle rect; - -- rect.x = E->x ; rect.y = E->y ; -- rect.width = E->width; rect.height = E->height; -- XSetClipRectangles(theDisp,theGC,0,0,&rect,1,Unsorted); -- XSetForeground(theDisp,theGC,infofg); -- XSetBackground(theDisp,theGC,infobg); -- i = sizeof button/sizeof *button; -- while (--i >= 0) BTRedraw(&button[i]); -- i = sizeof chkbut/sizeof *chkbut; -- while (--i >= 0) CBRedraw(&chkbut[i]); -- i = sizeof menu/sizeof *menu; -- while (--i >= 0) MBRedraw(&menu[i]); -- RBRedraw(radio,-1); -- DrawString(jp2kW,10,10+ASCENT,"Save JPEG 2000 File..."); -- DrawString(jp2kW,10,10+ASCENT+2*LINEHIGH,"Style options:"); -- DrawString(jp2kW,JP2KW-2*MENUW-10,10+ASCENT+2*LINEHIGH, -- "Coding Blk"); -- DrawString(jp2kW,JP2KW-1*MENUW-10,10+ASCENT+2*LINEHIGH, -- " Precinct"); -- DrawString(jp2kW, -- JP2KW-2*MENUW-10,10+ASCENT+SPACING+3*LINEHIGH+2*MENUH, -- "Progression:"); -- DrawString(jp2kW, -- JP2KW-2*TEXTW-10,10+ASCENT+SPACING+3*LINEHIGH+3*MENUH+0*TEXTH, -- "Guard bits:"); -- DrawString(jp2kW, -- JP2KW-2*TEXTW-10,10+ASCENT+SPACING+3*LINEHIGH+3*MENUH+1*TEXTH, -- "Res levels:"); -- DrawString(jp2kW, -- JP2KW-2*TEXTW-10,10+ASCENT+SPACING+3*LINEHIGH+3*MENUH+2*TEXTH, -- "Rate:"); -- XSetClipMask(theDisp,theGC,None); -- ok = 1; -- break; -- }; -- i = sizeof text/sizeof *text; -- while (--i >= 0 && E->window != text[i]); -- if (i >= 0) -- { -- TWRedraw(E->window,textval[i]); -- ok = 1; -- }; -- break; --# undef E -+ rect.x = E->x; -+ rect.y = E->y; -+ rect.width = E->width; -+ rect.height = E->height; -+ XSetClipRectangles(theDisp, theGC, 0, 0, &rect, 1, Unsorted); -+ XSetForeground(theDisp, theGC, infofg); -+ XSetBackground(theDisp, theGC, infobg); -+ i = sizeof button / sizeof *button; -+ while (--i >= 0) -+ BTRedraw(&button[i]); -+ i = sizeof chkbut / sizeof *chkbut; -+ while (--i >= 0) -+ CBRedraw(&chkbut[i]); -+ i = sizeof menu / sizeof *menu; -+ while (--i >= 0) -+ MBRedraw(&menu[i]); -+ RBRedraw(radio, -1); -+ DrawString(jp2kW, 10, 10 + ASCENT, "Save JPEG 2000 File..."); -+ DrawString(jp2kW, 10, 10 + ASCENT + 2 * LINEHIGH, "Style options:"); -+ DrawString(jp2kW, JP2KW - 2 * MENUW - 10, -+ 10 + ASCENT + 2 * LINEHIGH, "Coding Blk"); -+ DrawString(jp2kW, JP2KW - 1 * MENUW - 10, -+ 10 + ASCENT + 2 * LINEHIGH, " Precinct"); -+ DrawString(jp2kW, JP2KW - 2 * MENUW - 10, -+ 10 + ASCENT + SPACING + 3 * LINEHIGH + 2 * MENUH, -+ "Progression:"); -+ DrawString(jp2kW, JP2KW - 2 * TEXTW - 10, -+ 10 + ASCENT + SPACING + 3 * LINEHIGH + 3 * MENUH + -+ 0 * TEXTH, -+ "Guard bits:"); -+ DrawString(jp2kW, JP2KW - 2 * TEXTW - 10, -+ 10 + ASCENT + SPACING + 3 * LINEHIGH + 3 * MENUH + -+ 1 * TEXTH, -+ "Res levels:"); -+ DrawString(jp2kW, JP2KW - 2 * TEXTW - 10, -+ 10 + ASCENT + SPACING + 3 * LINEHIGH + 3 * MENUH + -+ 2 * TEXTH, -+ "Rate:"); -+ XSetClipMask(theDisp, theGC, None); -+ ok = 1; -+ break; -+ }; -+ i = sizeof text / sizeof *text; -+ while (--i >= 0 && E->window != text[i]) -+ ; -+ if (i >= 0) { -+ TWRedraw(E->window, textval[i]); -+ ok = 1; -+ }; -+ break; -+#undef E - -- /* Check whether the user pressed one of our buttons. */ -+ /* Check whether the user pressed one of our buttons. */ - -- case ButtonPress: --# define E ((XButtonEvent *)xev) -- if (E->button == Button1 && E->window == jp2kW) -- { register int j; -+ case ButtonPress: -+#define E ((XButtonEvent *)xev) -+ if (E->button == Button1 && E->window == jp2kW) { -+ register int j; - -- ok = 1; /* Check whether a regular button was pressed */ -- i = sizeof button/sizeof *button; -- while ( --i >= 0 -- && !PTINRECT(E->x,E->y,button[i].x,button[i].y,button[i].w,button[i].h) -- ); -- if (i >= 0) /* our button was pressed */ -- { char options[1024]; -- register char *p; -- register const char *q; -+ ok = 1; /* Check whether a regular button was pressed */ -+ i = sizeof button / sizeof *button; -+ while (--i >= 0 && !PTINRECT(E->x, E->y, button[i].x, button[i].y, -+ button[i].w, button[i].h)) -+ ; -+ if (i >= 0) /* our button was pressed */ -+ { -+ char options[1024]; -+ register char *p; -+ register const char *q; - -- if (!BTTrack(&button[i])) break; /* Ignore it */ -- if (i != J_BOK) /* must be "Cancel" button */ -- { -- JP2KDialog(0); -- break; -- }; -+ if (!BTTrack(&button[i])) -+ break; /* Ignore it */ -+ if (i != J_BOK) /* must be "Cancel" button */ -+ { -+ JP2KDialog(0); -+ break; -+ }; - -- /* Our user hit the "Ok" button. At this point, we have an ugly -- job to do: JasPer Library encoder options must be specified -- as an ASCII string of Space (" ")-separated [=] -- entries, so we must collect the values of all of our widgets -- and subwindows, determine whether our user has requested any -- non-default values, then build the string only for the JasPer -- Library to immediately tear it apart again. Yechh! -- */ -- if ((unsigned)textval[J_TGBIT]-1 > 7) -- { -- OpenAlert("No. of guard bits must be 1-8"); -- sleep(3); -- CloseAlert(); -- break; -- }; -- if ((unsigned)textval[J_TRES ] <= 0) -- { -- OpenAlert("Maximum resolution levels must be >= 1"); -- sleep(3); -- CloseAlert(); -- break; -- }; -+ /* Our user hit the "Ok" button. At this point, we have an ugly -+ job to do: JasPer Library encoder options must be specified -+ as an ASCII string of Space (" ")-separated [=] -+ entries, so we must collect the values of all of our widgets -+ and subwindows, determine whether our user has requested any -+ non-default values, then build the string only for the JasPer -+ Library to immediately tear it apart again. Yechh! -+ */ -+ if ((unsigned)textval[J_TGBIT] - 1 > 7) { -+ OpenAlert("No. of guard bits must be 1-8"); -+ sleep(3); -+ CloseAlert(); -+ break; -+ }; -+ if ((unsigned)textval[J_TRES] <= 0) { -+ OpenAlert("Maximum resolution levels must be >= 1"); -+ sleep(3); -+ CloseAlert(); -+ break; -+ }; - -- /* XXX Should we check and complain if the rate is zero? -- JasPer Library Version 1.701 apparently accepts that -- value, even though it seems kinda weird. -- */ -- p = options; -- i = 0; -- do if ((j = MBWhich(&menu[i])) != 5) -- { static const char *parm[2] = -- {"cblkwidth=%u", "cblkheight=%u"}; -+ /* XXX Should we check and complain if the rate is zero? -+ JasPer Library Version 1.701 apparently accepts that -+ value, even though it seems kinda weird. -+ */ -+ p = options; -+ i = 0; -+ do -+ if ((j = MBWhich(&menu[i])) != 5) { -+ static const char *parm[2] = {"cblkwidth=%u", -+ "cblkheight=%u"}; - -- if (p > options) *p++ = ' '; -- sprintf(p,parm[i-J_MCBXW],++j); -- while (*++p); -- } -- while (++i <= J_MCBXH); -- do if ((j = MBWhich(&menu[i])) < 15) -- { static const char *parm[2] = -- {"prcwidth=%u", "prcheight=%u"}; -+ if (p > options) -+ *p++ = ' '; -+ sprintf(p, parm[i - J_MCBXW], ++j); -+ while (*++p) -+ ; -+ } -+ while (++i <= J_MCBXH); -+ do -+ if ((j = MBWhich(&menu[i])) < 15) { -+ static const char *parm[2] = {"prcwidth=%u", -+ "prcheight=%u"}; - -- if (p > options) *p++ = ' '; -- sprintf(p,parm[i-J_MPREW],j); -- while (*++p); -- } -- while (++i <= J_MPREH); -- if ((j = MBWhich(&menu[i]))) -- { -- if (p > options) *p++ = ' '; -- *p++ = 'p'; *p++ = 'r'; *p++ = 'g'; *p = '='; -- q = ProgList[j]; -- while ((*++p = *q++)); -- }; -- if ((i = textval[J_TRES ]) != 6) -- { -- if (p > options) *p++ = ' '; -- sprintf(p,"numrlvls=%u",i); -- while (*++p); -- }; -- i = 0; -- do if (chkbut[i].val) /* append this encoding option */ -- { -- if (p > options) *p++ = ' '; -- q = chkbut[i].str; -- while ((*p++ = *q++)); -- *--p = '\000'; -- } -- while (++i < sizeof chkbut/sizeof *chkbut); -- if ((i = textval[J_TGBIT]) != 2) -- { -- if (p > options) *p++ = ' '; -- sprintf(p,"numgbits=%u",i); -- while (*++p); -- }; -- if ((i = textval[J_TRATE]) != 100) -- { -- if (p > options) *p++ = ' '; -- *p++ = 'r'; *p++ = 'a'; *p++ = 't'; *p++ = 'e'; -- *p++ = '='; -- if (i) /* non-zero rate */ -- { -- if (RBWhich(radio)) sprintf(p,"%uB",i); /* # Bytes */ -- else /* the value is a percentage */ -- { -- if (i > 100) i = 200; /* => Raw size + 1 */ -- sprintf(p,"%u.%.2u",i/100,i%100); -- } -- while (*++p); -- } -- else /* rate = 0 */ -- { -+ if (p > options) -+ *p++ = ' '; -+ sprintf(p, parm[i - J_MPREW], j); -+ while (*++p) -+ ; -+ } -+ while (++i <= J_MPREH); -+ if ((j = MBWhich(&menu[i]))) { -+ if (p > options) -+ *p++ = ' '; -+ *p++ = 'p'; -+ *p++ = 'r'; -+ *p++ = 'g'; -+ *p = '='; -+ q = ProgList[j]; -+ while ((*++p = *q++)) -+ ; -+ }; -+ if ((i = textval[J_TRES]) != 6) { -+ if (p > options) -+ *p++ = ' '; -+ sprintf(p, "numrlvls=%u", i); -+ while (*++p) -+ ; -+ }; -+ i = 0; -+ do -+ if (chkbut[i].val) /* append this encoding option */ -+ { -+ if (p > options) -+ *p++ = ' '; -+ q = chkbut[i].str; -+ while ((*p++ = *q++)) -+ ; -+ *--p = '\000'; -+ } -+ while (++i < sizeof chkbut / sizeof *chkbut); -+ if ((i = textval[J_TGBIT]) != 2) { -+ if (p > options) -+ *p++ = ' '; -+ sprintf(p, "numgbits=%u", i); -+ while (*++p) -+ ; -+ }; -+ if ((i = textval[J_TRATE]) != 100) { -+ if (p > options) -+ *p++ = ' '; -+ *p++ = 'r'; -+ *p++ = 'a'; -+ *p++ = 't'; -+ *p++ = 'e'; -+ *p++ = '='; -+ if (i) /* non-zero rate */ -+ { -+ if (RBWhich(radio)) -+ sprintf(p, "%uB", i); /* # Bytes */ -+ else /* the value is a percentage */ -+ { -+ if (i > 100) -+ i = 200; /* => Raw size + 1 */ -+ sprintf(p, "%u.%.2u", i / 100, i % 100); -+ } -+ while (*++p) -+ ; -+ } else /* rate = 0 */ -+ { - -- /* XXX This is apparently valid, since JasPer Library -- Version 1.701 doesn't complain about it. -- */ -- *p++ = '0'; -- *p = '\000'; -- } -- }; -- StoreJP2K(options); /* Finally, do the *real* work! */ -- JP2KDialog(0); -- p = GetDirFullName(); -- if (!ISPIPE(*p)) -- { -- XVCreatedFile(p); -- StickInCtrlList(0); -- }; -- break; -- }; -+ /* XXX This is apparently valid, since JasPer Library -+ Version 1.701 doesn't complain about it. -+ */ -+ *p++ = '0'; -+ *p = '\000'; -+ } -+ }; -+ StoreJP2K(options); /* Finally, do the *real* work! */ -+ JP2KDialog(0); -+ p = GetDirFullName(); -+ if (!ISPIPE(*p)) { -+ XVCreatedFile(p); -+ StickInCtrlList(0); -+ }; -+ break; -+ }; - -- /* See whether a check-box button was pressed. */ -+ /* See whether a check-box button was pressed. */ - -- i = sizeof chkbut/sizeof *chkbut; -- while (--i >= 0 && !CBClick(&chkbut[i],E->x,E->y)); -- if (i >= 0) /* our button was pressed */ -- { -- (void)CBTrack(&chkbut[i]); -- break; -- }; -+ i = sizeof chkbut / sizeof *chkbut; -+ while (--i >= 0 && !CBClick(&chkbut[i], E->x, E->y)) -+ ; -+ if (i >= 0) /* our button was pressed */ -+ { -+ (void)CBTrack(&chkbut[i]); -+ break; -+ }; - -- /* See whether a menu button was pressed. */ -+ /* See whether a menu button was pressed. */ - -- i = sizeof menu/sizeof *menu; -- while (--i >= 0 && !MBClick(&menu[i],E->x,E->y)); -- if (i >= 0) /* our button was pressed */ -- { register int j; -+ i = sizeof menu / sizeof *menu; -+ while (--i >= 0 && !MBClick(&menu[i], E->x, E->y)) -+ ; -+ if (i >= 0) /* our button was pressed */ -+ { -+ register int j; - -- if ((j = MBTrack(&menu[i])) >= 0) -- { -- switch (i) -- { -+ if ((j = MBTrack(&menu[i])) >= 0) { -+ switch (i) { - -- /* The JasPer Library constrains a coding box's area -- (width x height) to be <= 4096 pixels, so if this -- button-press would violate that condition, then -- quietly limit the box's orthogonal dimension by just -- enough to compensate. -- */ -- case J_MCBXH: -- case J_MCBXW: if (MBWhich(&menu[!i]) + j >= 10) -- MBSelect(&menu[!i],10 - j); -- }; -- MBSelect(&menu[i],j); -- MBSetActive(&menu[i],1); -- }; -- break; -- }; -+ /* The JasPer Library constrains a coding box's area -+ (width x height) to be <= 4096 pixels, so if this -+ button-press would violate that condition, then -+ quietly limit the box's orthogonal dimension by just -+ enough to compensate. -+ */ -+ case J_MCBXH: -+ case J_MCBXW: -+ if (MBWhich(&menu[!i]) + j >= 10) -+ MBSelect(&menu[!i], 10 - j); -+ }; -+ MBSelect(&menu[i], j); -+ MBSetActive(&menu[i], 1); -+ }; -+ break; -+ }; - -- /* See whether a radio button was pressed. */ -+ /* See whether a radio button was pressed. */ - -- if ( (i = RBClick(radio,E->x,E->y)) >= 0 /* button pressed */ -- && RBTrack(radio,i) -- ) -- { -- RBSelect(radio,i); -- RBSetActive(radio,i,1); -- }; -- break; -- }; -- XBell(theDisp,50); -- break; --# undef E -+ if ((i = RBClick(radio, E->x, E->y)) >= 0 /* button pressed */ -+ && RBTrack(radio, i)) { -+ RBSelect(radio, i); -+ RBSetActive(radio, i, 1); -+ }; -+ break; -+ }; -+ XBell(theDisp, 50); -+ break; -+#undef E - -- /* Translate a few key-press events into simulated button events. */ -+ /* Translate a few key-press events into simulated button events. */ - -- case KeyPress : --# define E ((XKeyEvent *)xev) -- buf[len = XLookupString(E,buf,sizeof buf,&ks,0)] = '\000'; -- RemapKeyCheck(ks,buf,&len); -- if (E->window == jp2kW) -- { -- ok = 1; -- if (len > 0) -- switch (buf[0]) -- { -- case '\r' : -- case '\n' : FakeButtonPress(&button[J_BOK ]); -- break; -- case '\033': FakeButtonPress(&button[J_BCANC]); -- }; -- break; -- }; -- i = sizeof text/sizeof *text; -- while (--i >= 0 && E->window != text[i]); -- if (i >= 0) /* a key was pressed in our text window */ -- { int oldval = textval[i]; /* Save this subwindow's old value */ -- register int c, j = 0; -+ case KeyPress: -+#define E ((XKeyEvent *)xev) -+ buf[len = XLookupString(E, buf, sizeof buf, &ks, 0)] = '\000'; -+ RemapKeyCheck(ks, buf, &len); -+ if (E->window == jp2kW) { -+ ok = 1; -+ if (len > 0) -+ switch (buf[0]) { -+ case '\r': -+ case '\n': -+ FakeButtonPress(&button[J_BOK]); -+ break; -+ case '\033': -+ FakeButtonPress(&button[J_BCANC]); -+ }; -+ break; -+ }; -+ i = sizeof text / sizeof *text; -+ while (--i >= 0 && E->window != text[i]) -+ ; -+ if (i >= 0) /* a key was pressed in our text window */ -+ { -+ int oldval = textval[i]; /* Save this subwindow's old value */ -+ register int c, j = 0; - -- /* This is a *very* simple text-input editing loop that assembles an -- an unsigned integer from successive ASCII decimal digits, typed -- into one of our 1-line subwindows. For convenience, the only -- character recognized is Backspace. -- */ -- ok = 1; -- L: if (j >= len) break; -- if ((unsigned)(c = buf[j++] - '0') <= 9) -- { -- TWRedraw(text[i],textval[i] = textval[i]*10 + c); -- goto L; -- }; -- if ((c += '0') == '\b') -- { -- TWRedraw(text[i],textval[i] = textval[i]/10); -- goto L; -- }; -- textval[i] = oldval; -- }; -- XBell(theDisp,50); --# undef E -- }; -- return ok; -+ /* This is a *very* simple text-input editing loop that assembles an -+ an unsigned integer from successive ASCII decimal digits, typed -+ into one of our 1-line subwindows. For convenience, the only -+ character recognized is Backspace. -+ */ -+ ok = 1; -+ L: -+ if (j >= len) -+ break; -+ if ((unsigned)(c = buf[j++] - '0') <= 9) { -+ TWRedraw(text[i], textval[i] = textval[i] * 10 + c); -+ goto L; -+ }; -+ if ((c += '0') == '\b') { -+ TWRedraw(text[i], textval[i] = textval[i] / 10); -+ goto L; -+ }; -+ textval[i] = oldval; -+ }; -+ XBell(theDisp, 50); -+#undef E -+ }; -+ return ok; - } - -- - /*******************************************/ --void --VersionInfoJP2K() /* GRR 20070304 */ -+void VersionInfoJP2K() /* GRR 20070304 */ - { -- fprintf(stderr, " Compiled with libjasper %s; using libjasper %s.\n", -- JAS_VERSION, jas_getversion()); -+ fprintf(stderr, " Compiled with libjasper %s; using libjasper %s.\n", -+ JAS_VERSION, jas_getversion()); - } - - #endif /* HAVE_JP2K */ diff --git a/graphics/xv/files/patch-xvjpeg.c b/graphics/xv/files/patch-xvjpeg.c index ebbf966d0863..44fcd6566080 100644 --- a/graphics/xv/files/patch-xvjpeg.c +++ b/graphics/xv/files/patch-xvjpeg.c @@ -1,21 +1,20 @@ -$OpenBSD$ ---- xvjpeg.c.orig Fri Aug 28 13:41:30 2009 -+++ xvjpeg.c Fri Aug 28 18:58:46 2009 -@@ -696,7 +696,7 @@ L2: +--- src/xvjpeg.c.orig 2023-07-17 01:25:42 UTC ++++ src/xvjpeg.c +@@ -699,7 +699,7 @@ L2: if ((cmy = *q++ - k) < 0) cmy = 0; *p++ = cmy; /* R */ if ((cmy = *q++ - k) < 0) cmy = 0; *p++ = cmy; /* G */ if ((cmy = *q++ - k) < 0) cmy = 0; *p++ = cmy; /* B */ - } while (++q <= pic_end); + } while (++q < pic_end); } else { /* assume normal data */ register byte *q = pic; -@@ -707,7 +707,7 @@ L2: +@@ -710,7 +710,7 @@ L2: if ((cmy = k - *q++) < 0) cmy = 0; *p++ = cmy; /* R */ if ((cmy = k - *q++) < 0) cmy = 0; *p++ = cmy; /* G */ if ((cmy = k - *q++) < 0) cmy = 0; *p++ = cmy; /* B */ - } while (++q <= pic_end); + } while (++q < pic_end); } pic = realloc(pic,p-pic); /* Release extra storage */ } diff --git a/graphics/xv/files/patch-xvmisc.c b/graphics/xv/files/patch-xvmisc.c index 38cf152e6c68..08b2abd0cb14 100644 --- a/graphics/xv/files/patch-xvmisc.c +++ b/graphics/xv/files/patch-xvmisc.c @@ -1,19 +1,18 @@ ---- xvmisc.c.orig 2010-02-11 14:29:41.000000000 +0100 -+++ xvmisc.c 2010-02-11 15:25:03.000000000 +0100 -@@ -504,6 +504,7 @@ +--- src/xvmisc.c.orig 2023-07-17 01:25:42 UTC ++++ src/xvmisc.c +@@ -504,6 +504,7 @@ void FatalError (identifier) } +extern int InSignal; /***********************************/ void Quit(i) int i; -@@ -601,7 +619,8 @@ +@@ -597,6 +598,7 @@ void Quit(i) } } + if (InSignal == 0) XSync(theDisp, False); exit(i); } - diff --git a/graphics/xv/files/patch-xvpng.c b/graphics/xv/files/patch-xvpng.c deleted file mode 100644 index 82076f94ced5..000000000000 --- a/graphics/xv/files/patch-xvpng.c +++ /dev/null @@ -1,509 +0,0 @@ ---- xvpng.c.orig 2007-05-14 00:53:28 UTC -+++ xvpng.c -@@ -31,6 +31,7 @@ - - #ifdef HAVE_PNG - -+#include "zlib.h" - #include "png.h" - - /*** Stuff for PNG Dialog box ***/ -@@ -41,7 +42,9 @@ - #define COMPRESSION 6 /* default zlib compression level, not max - (Z_BEST_COMPRESSION) */ - --#define HAVE_tRNS (info_ptr->valid & PNG_INFO_tRNS) -+/* old -+#define HAVE_tRNS (info_ptr->valid & PNG_INFO_tRNS) */ -+#define HAVE_tRNS png_get_valid(png_ptr,info_ptr,PNG_INFO_tRNS) - - #define DWIDE 86 - #define DHIGH 104 -@@ -444,6 +447,10 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - byte *p, *png_line; - char software[256]; - char *savecmnt; -+ /* for storing values until all are accumulated, so that the image header can be set in full */ -+ int _bit_depth,_color_type,_interlace_type,_compression_type,_filter_type; -+ png_uint_32 _width,_height; -+ png_time _mod_time; - - if ((png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, - png_xv_error, png_xv_warning)) == NULL) { -@@ -458,7 +465,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - FatalError(software); - } - -- if (setjmp(png_ptr->jmpbuf)) { -+ if (setjmp(png_jmpbuf(png_ptr))) { - png_destroy_write_struct(&png_ptr, &info_ptr); - return -1; - } -@@ -489,8 +496,8 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - png_set_filter(png_ptr, 0, filter); - } - -- info_ptr->width = w; -- info_ptr->height = h; -+ _width = w; -+ _height = h; - if (w <= 0 || h <= 0) { - SetISTR(ISTR_WARNING, "%s: image dimensions out of range (%dx%d)", - fbasename, w, h); -@@ -498,7 +505,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - return -1; - } - -- info_ptr->interlace_type = interCB.val ? 1 : 0; -+ _interlace_type = interCB.val ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE; - - linesize = 0; /* quiet a compiler warning */ - -@@ -542,40 +549,44 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - png_destroy_write_struct(&png_ptr, &info_ptr); - return -1; - } -- info_ptr->color_type = PNG_COLOR_TYPE_RGB; -- info_ptr->bit_depth = 8; -+ _color_type = PNG_COLOR_TYPE_RGB; -+ _bit_depth = 8; - } else /* ptype == PIC8 */ { - linesize = w; -- info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; -+ _color_type = PNG_COLOR_TYPE_PALETTE; - if (numuniqcols <= 2) -- info_ptr->bit_depth = 1; -+ _bit_depth = 1; - else - if (numuniqcols <= 4) -- info_ptr->bit_depth = 2; -+ _bit_depth = 2; - else - if (numuniqcols <= 16) -- info_ptr->bit_depth = 4; -+ _bit_depth = 4; - else -- info_ptr->bit_depth = 8; -+ _bit_depth = 8; - - for (i = 0; i < numuniqcols; i++) { - palette[i].red = r1[i]; - palette[i].green = g1[i]; - palette[i].blue = b1[i]; - } -- info_ptr->num_palette = numuniqcols; -- info_ptr->palette = palette; -+/* cannot find a setter for this, unsure if it is necessary anymore... - info_ptr->valid |= PNG_INFO_PLTE; -+*/ -+ /* set the header just in case it's needed */ -+ png_set_IHDR(png_ptr,info_ptr,_width,_height,_bit_depth,_color_type, -+ _interlace_type,PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT); -+ png_set_PLTE(png_ptr,info_ptr,palette,numuniqcols); - } - } - - else if (colorType == F_GREYSCALE || colorType == F_BWDITHER) { -- info_ptr->color_type = PNG_COLOR_TYPE_GRAY; -+ _color_type = PNG_COLOR_TYPE_GRAY; - if (colorType == F_BWDITHER) { - /* shouldn't happen */ - if (ptype == PIC24) FatalError("PIC24 and B/W Stipple in WritePNG()"); - -- info_ptr->bit_depth = 1; -+ _bit_depth = 1; - if (MONO(r1[0], g1[0], b1[0]) > MONO(r1[1], g1[1], b1[1])) { - remap[0] = 1; - remap[1] = 0; -@@ -595,7 +606,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - png_destroy_write_struct(&png_ptr, &info_ptr); - return -1; - } -- info_ptr->bit_depth = 8; -+ _bit_depth = 8; - } - else /* ptype == PIC8 */ { - int low_precision; -@@ -617,7 +628,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - for (; i < 256; i++) - remap[i]=0; /* shouldn't be necessary, but... */ - -- info_ptr->bit_depth = 8; -+ _bit_depth = 8; - - /* Note that this fails most of the time because of gamma */ - /* (and that would be a bug: GRR FIXME) */ -@@ -636,7 +647,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - for (i = 0; i < numuniqcols; i++) { - remap[i] &= 0xf; - } -- info_ptr->bit_depth = 4; -+ _bit_depth = 4; - - /* try to adjust to 2-bit precision grayscale */ - -@@ -652,7 +663,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - for (i = 0; i < numuniqcols; i++) { - remap[i] &= 3; - } -- info_ptr->bit_depth = 2; -+ _bit_depth = 2; - - /* try to adjust to 1-bit precision grayscale */ - -@@ -668,7 +679,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - for (i = 0; i < numuniqcols; i++) { - remap[i] &= 1; - } -- info_ptr->bit_depth = 1; -+ _bit_depth = 1; - } - } - } -@@ -677,6 +688,9 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - else - png_error(png_ptr, "Unknown colorstyle in WritePNG"); - -+ png_set_IHDR(png_ptr,info_ptr,_width,_height,_bit_depth,_color_type, -+ _interlace_type,PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT); -+ - if ((text = (png_textp)malloc(sizeof(png_text)))) { - sprintf(software, "XV %s", REVDATE); - -@@ -685,20 +699,22 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - text->text = software; - text->text_length = strlen(text->text); - -- info_ptr->max_text = 1; -- info_ptr->num_text = 1; -- info_ptr->text = text; -+/* max_text seems to be internal only now, do not set -+ info_ptr->max_text = 1; */ -+ png_set_text(png_ptr,info_ptr,text,1); - } - - Display_Gamma = gDial.val; /* Save the current gamma for loading */ - - // GRR FIXME: add .Xdefaults option to omit writing gamma (size, cumulative errors when editing)--alternatively, modify save box to include "omit" checkbox -- info_ptr->gamma = 1.0/gDial.val; -- info_ptr->valid |= PNG_INFO_gAMA; -+ png_set_gAMA(png_ptr,info_ptr,1.0/gDial.val); -+/* doesn't seem to be a way to set valid directly anymore, unnecessary maybe.. -+ info_ptr->valid |= PNG_INFO_gAMA; */ - -+/* might need to be png_write_info_before_PLTE() ... */ - png_write_info(png_ptr, info_ptr); - -- if (info_ptr->bit_depth < 8) -+ if (_bit_depth < 8) - png_set_packing(png_ptr); - - pass=png_set_interlace_handling(png_ptr); -@@ -711,13 +727,13 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - int j; - p = pic; - for (j = 0; j < h; ++j) { -- if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY) { -+ if (_color_type == PNG_COLOR_TYPE_GRAY) { - int k; - for (k = 0; k < w; ++k) - png_line[k] = ptype==PIC24 ? MONO(p[k*3], p[k*3+1], p[k*3+2]) : - remap[pc2nc[p[k]]]; - png_write_row(png_ptr, png_line); -- } else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { -+ } else if (_color_type == PNG_COLOR_TYPE_PALETTE) { - int k; - for (k = 0; k < w; ++k) - png_line[k] = pc2nc[p[k]]; -@@ -739,28 +755,31 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - (savecmnt = (char *)malloc((strlen(picComments) + 1)*sizeof(char)))) { - png_textp tp; - char *comment, *key; -+ int nt; -+ int mt; - - strcpy(savecmnt, picComments); - key = savecmnt; -+ png_get_text(png_ptr,info_ptr,&tp,&mt); /* to get 'max_text' */ - tp = text; -- info_ptr->num_text = 0; -+ nt = 0; - - comment = strchr(key, ':'); - - do { - /* Allocate a larger structure for comments if necessary */ -- if (info_ptr->num_text >= info_ptr->max_text) -+ if (nt >= mt) - { - if ((tp = -- realloc(text, (info_ptr->num_text + 2)*sizeof(png_text))) == NULL) -+ realloc(text, (nt + 2)*sizeof(png_text))) == NULL) - { - break; - } - else - { - text = tp; -- tp = &text[info_ptr->num_text]; -- info_ptr->max_text += 2; -+ tp = &text[nt]; -+ mt += 2; - } - } - -@@ -810,7 +829,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - } - - tp->compression = tp->text_length > 640 ? 0 : -1; -- info_ptr->num_text++; -+ nt++; - tp++; - } - } -@@ -834,27 +853,29 @@ int WritePNG(fp, pic, ptype, w, h, rmap, - tp->text = key; - tp->text_length = q - key; - tp->compression = tp->text_length > 750 ? 0 : -1; -- info_ptr->num_text++; -+ nt++; - key = NULL; - } - } while (key && *key); -+ png_set_text(png_ptr,info_ptr,text,nt); - } - else { -- info_ptr->num_text = 0; -+ png_set_text(png_ptr,info_ptr,text,0); - } - } -- info_ptr->text = text; - -- png_convert_from_time_t(&(info_ptr->mod_time), time(NULL)); -- info_ptr->valid |= PNG_INFO_tIME; -+ png_convert_from_time_t(&_mod_time, time(NULL)); -+ png_set_tIME(png_ptr,info_ptr,&_mod_time); -+/* dunno how to set validity -+ info_ptr->valid |= PNG_INFO_tIME; */ - - png_write_end(png_ptr, info_ptr); - fflush(fp); /* just in case we core-dump before finishing... */ - - if (text) { - free(text); -- /* must do this or png_destroy_write_struct() 0.97+ will free text again: */ -- info_ptr->text = (png_textp)NULL; -+ /* must do this or png_destroy_write_struct() 0.97+ will free text again: -+ info_ptr->text = (png_textp)NULL; */ - if (savecmnt) - { - free(savecmnt); -@@ -886,6 +907,14 @@ int LoadPNG(fname, pinfo) - int pass; - int gray_to_rgb; - size_t commentsize; -+ /* temp storage vars for libpng15 migration */ -+ int _bit_depth,_color_type,_interlace_type,_compression_type,_filter_type,_num_text,_num_palette; -+ png_uint_32 _width,_height; -+ png_timep _mod_time; -+ double _gamma; -+ png_textp _text; -+ png_colorp _palette; -+ png_color_16p _background; - - fbasename = BaseName(fname); - -@@ -921,7 +950,7 @@ int LoadPNG(fname, pinfo) - FatalError("malloc failure in LoadPNG"); - } - -- if (setjmp(png_ptr->jmpbuf)) { -+ if (setjmp(png_jmpbuf(png_ptr))) { - fclose(fp); - png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); - if (!read_anything) { -@@ -945,8 +974,10 @@ int LoadPNG(fname, pinfo) - #endif - png_read_info(png_ptr, info_ptr); - -- pinfo->w = pinfo->normw = info_ptr->width; -- pinfo->h = pinfo->normh = info_ptr->height; -+ png_get_IHDR(png_ptr,info_ptr,&_width,&_height,&_bit_depth,&_color_type,&_interlace_type,NULL,NULL); -+ -+ pinfo->w = pinfo->normw = _width; -+ pinfo->h = pinfo->normh = _height; - if (pinfo->w <= 0 || pinfo->h <= 0) { - SetISTR(ISTR_WARNING, "%s: image dimensions out of range (%dx%d)", - fbasename, pinfo->w, pinfo->h); -@@ -957,9 +988,9 @@ int LoadPNG(fname, pinfo) - pinfo->frmType = F_PNG; - - sprintf(pinfo->fullInfo, "PNG, %d bit ", -- info_ptr->bit_depth * info_ptr->channels); -+ _bit_depth * png_get_channels(png_ptr,info_ptr)); - -- switch(info_ptr->color_type) { -+ switch(_color_type) { - case PNG_COLOR_TYPE_PALETTE: - strcat(pinfo->fullInfo, "palette color"); - break; -@@ -983,15 +1014,17 @@ int LoadPNG(fname, pinfo) - - sprintf(pinfo->fullInfo + strlen(pinfo->fullInfo), - ", %sinterlaced. (%d bytes)", -- info_ptr->interlace_type ? "" : "non-", filesize); -+ _interlace_type ? "" : "non-", filesize); - -- sprintf(pinfo->shrtInfo, "%lux%lu PNG", info_ptr->width, info_ptr->height); -+ sprintf(pinfo->shrtInfo, "%lux%lu PNG", _width, _height); - -- if (info_ptr->bit_depth < 8) -+ if (_bit_depth < 8) - png_set_packing(png_ptr); - -- if (info_ptr->valid & PNG_INFO_gAMA) -- png_set_gamma(png_ptr, Display_Gamma, info_ptr->gamma); -+ if (png_get_valid(png_ptr,info_ptr,PNG_INFO_gAMA)) { -+ png_get_gAMA(png_ptr,info_ptr,&_gamma); -+ png_set_gamma(png_ptr, Display_Gamma, _gamma); -+ } - /* - *else - * png_set_gamma(png_ptr, Display_Gamma, 0.45); -@@ -1000,7 +1033,7 @@ int LoadPNG(fname, pinfo) - gray_to_rgb = 0; /* quiet a compiler warning */ - - if (have_imagebg) { -- if (info_ptr->bit_depth == 16) { -+ if (_bit_depth == 16) { - my_background.red = imagebgR; - my_background.green = imagebgG; - my_background.blue = imagebgB; -@@ -1013,8 +1046,8 @@ int LoadPNG(fname, pinfo) - } - png_set_background(png_ptr, &my_background, PNG_BACKGROUND_GAMMA_SCREEN, - 0, Display_Gamma); -- if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA || -- (info_ptr->color_type == PNG_COLOR_TYPE_GRAY && HAVE_tRNS)) && -+ if ((_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || -+ (_color_type == PNG_COLOR_TYPE_GRAY && HAVE_tRNS)) && - (imagebgR != imagebgG || imagebgR != imagebgB)) /* i.e., colored bg */ - { - png_set_gray_to_rgb(png_ptr); -@@ -1022,8 +1055,9 @@ int LoadPNG(fname, pinfo) - gray_to_rgb = 1; - } - } else { -- if (info_ptr->valid & PNG_INFO_bKGD) { -- png_set_background(png_ptr, &info_ptr->background, -+ if (png_get_valid(png_ptr,info_ptr,PNG_INFO_bKGD)) { -+ png_get_bKGD(png_ptr,info_ptr,&_background); -+ png_set_background(png_ptr, _background, - PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); - } else { - my_background.red = my_background.green = my_background.blue = -@@ -1033,13 +1067,13 @@ int LoadPNG(fname, pinfo) - } - } - -- if (info_ptr->bit_depth == 16) -+ if (_bit_depth == 16) - png_set_strip_16(png_ptr); - -- if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY || -- info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) -+ if (_color_type == PNG_COLOR_TYPE_GRAY || -+ _color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { -- if (info_ptr->bit_depth == 1) -+ if (_bit_depth == 1) - pinfo->colType = F_BWDITHER; - else - pinfo->colType = F_GREYSCALE; -@@ -1049,9 +1083,11 @@ int LoadPNG(fname, pinfo) - pass=png_set_interlace_handling(png_ptr); - - png_read_update_info(png_ptr, info_ptr); -+ /* get HIDR again just in case the info_ptr changed */ -+ png_get_IHDR(png_ptr,info_ptr,&_width,&_height,&_bit_depth,&_color_type,&_interlace_type,NULL,NULL); - -- if (info_ptr->color_type == PNG_COLOR_TYPE_RGB || -- info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || gray_to_rgb) -+ if (_color_type == PNG_COLOR_TYPE_RGB || -+ _color_type == PNG_COLOR_TYPE_RGB_ALPHA || gray_to_rgb) - { - linesize = 3 * pinfo->w; - if (linesize/3 < pinfo->w) { /* know pinfo->w > 0 (see above) */ -@@ -1065,16 +1101,17 @@ int LoadPNG(fname, pinfo) - } else { - linesize = pinfo->w; - pinfo->type = PIC8; -- if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY || -- info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { -+ if (_color_type == PNG_COLOR_TYPE_GRAY || -+ _color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { - for (i = 0; i < 256; i++) - pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i; - } else { - pinfo->colType = F_FULLCOLOR; -- for (i = 0; i < info_ptr->num_palette; i++) { -- pinfo->r[i] = info_ptr->palette[i].red; -- pinfo->g[i] = info_ptr->palette[i].green; -- pinfo->b[i] = info_ptr->palette[i].blue; -+ png_get_PLTE(png_ptr,info_ptr,&_palette,&_num_palette); -+ for (i = 0; i < _num_palette; i++) { -+ pinfo->r[i] = _palette[i].red; -+ pinfo->g[i] = _palette[i].green; -+ pinfo->b[i] = _palette[i].blue; - } - } - } -@@ -1092,7 +1129,7 @@ int LoadPNG(fname, pinfo) - png_error(png_ptr, "can't allocate space for PNG image"); - } - -- png_start_read_image(png_ptr); -+ /*png_start_read_image(png_ptr); -- causes a warning and seems to be unnecessary */ - - for (i = 0; i < pass; i++) { - byte *p = pinfo->pic; -@@ -1106,22 +1143,23 @@ int LoadPNG(fname, pinfo) - - png_read_end(png_ptr, info_ptr); - -- if (info_ptr->num_text > 0) { -+ png_get_text(png_ptr,info_ptr,&_text,&_num_text); -+ if (_num_text > 0) { - commentsize = 1; - -- for (i = 0; i < info_ptr->num_text; i++) -- commentsize += strlen(info_ptr->text[i].key) + 1 + -- info_ptr->text[i].text_length + 2; -+ for (i = 0; i < _num_text; i++) -+ commentsize += strlen(_text[i].key) + 2 + -+ _text[i].text_length + _text[i].itxt_length + 1; - - if ((pinfo->comment = malloc(commentsize)) == NULL) { - png_warning(png_ptr,"can't allocate comment string"); - } - else { - pinfo->comment[0] = '\0'; -- for (i = 0; i < info_ptr->num_text; i++) { -- strcat(pinfo->comment, info_ptr->text[i].key); -+ for (i = 0; i < _num_text; i++) { -+ strcat(pinfo->comment, _text[i].key); - strcat(pinfo->comment, "::"); -- strcat(pinfo->comment, info_ptr->text[i].text); -+ strcat(pinfo->comment, _text[i].text); - strcat(pinfo->comment, "\n"); - } - } -@@ -1143,7 +1181,7 @@ png_xv_error(png_ptr, message) - { - SetISTR(ISTR_WARNING,"%s: libpng error: %s", fbasename, message); - -- longjmp(png_ptr->jmpbuf, 1); -+ longjmp(png_jmpbuf(png_ptr), 1); - } - - diff --git a/graphics/xv/files/patch-xvtext.c b/graphics/xv/files/patch-xvtext.c index a0218d2791a0..ce8254f3aa29 100644 --- a/graphics/xv/files/patch-xvtext.c +++ b/graphics/xv/files/patch-xvtext.c @@ -1,11 +1,11 @@ ---- xvtext.c.orig 2009-05-20 13:18:36.000000000 +0200 -+++ xvtext.c 2009-05-20 13:22:45.000000000 +0200 -@@ -181,7 +181,7 @@ +--- src/xvtext.c.orig 2023-07-17 01:25:42 UTC ++++ src/xvtext.c +@@ -181,7 +181,7 @@ static int selectCodeset PARM((TVINFO *)); #endif #ifdef TV_MULTILINGUAL static void setCodingSpec PARM((TVINFO *, struct coding_spec *)); -static void createCsWins PARM((char *)); +static void createCsWins PARM((const char *)); static void openCsWin PARM((TVINFO *)); static void closeCsWin PARM((TVINFO *)); #endif diff --git a/graphics/xv/files/patch-xvvd.c b/graphics/xv/files/patch-xvvd.c index a3ec3b0d0b40..d0343720adf8 100644 --- a/graphics/xv/files/patch-xvvd.c +++ b/graphics/xv/files/patch-xvvd.c @@ -1,20 +1,20 @@ ---- xvvd.c.orig 2007-04-16 06:30:19.000000000 +0200 -+++ xvvd.c 2010-02-11 15:23:41.000000000 +0100 -@@ -1060,6 +1060,8 @@ +--- src/xvvd.c.orig 2023-07-17 01:25:42 UTC ++++ src/xvvd.c +@@ -1072,6 +1072,8 @@ static void HUPhandler(XtPointer dummy, XtSignalId* Id #endif } +int InSignal = 0; + - void vd_handler(sig) - int sig; + static void vd_handler(int sig) { -@@ -1068,7 +1070,7 @@ + UsedSignal = sig; +@@ -1085,7 +1087,7 @@ static void INThandler(XtPointer dummy, XtSignalId* Id #else - sigblock(sigmask(sig)); + sigblock(sigmask(UsedSignal)); #endif - + InSignal = 1; Quit(1); /*exit(1);*/ } diff --git a/graphics/xv/pkg-descr b/graphics/xv/pkg-descr index f97231a5b2d7..0d55c40f5166 100644 --- a/graphics/xv/pkg-descr +++ b/graphics/xv/pkg-descr @@ -1,20 +1,18 @@ Xv is an X11 program that displays images in the GIF, JPEG, TIFF, PBM, PGM, PPM, X11 bitmap, Utah Raster Toolkit RLE, PDS/VICAR, Sun Rasterfile, BMP, XPM, PCX, IRIS RGB, possibly PostScript, Portable Networking Format(PNG) and PM formats on workstations and terminals running the X Window System, Version 11. And more xv japanese extensions patch supports images in the MAKI, MAG, PIC, Pi PIC2, PhotoCD. And this patch also supports archived image files. Supported archivers are arc, arj, lzh, tar, tar+compress, tar+gzip, tar+bzip2, zip, and zoo. Note that this program is shareware except for personal use only. Please read the documentation in the directory /usr/local/share/doc/xv for proper usage. LICENSE: shareware, free for personal use - -See also: http://www.gregroelofs.com/greg_xv.html diff --git a/graphics/xv/pkg-plist b/graphics/xv/pkg-plist index ad420820d0b2..36cb487ba513 100644 --- a/graphics/xv/pkg-plist +++ b/graphics/xv/pkg-plist @@ -1,24 +1,284 @@ bin/xv bin/bggen bin/vdcomp bin/xcmap bin/xvpictoppm -lib/X11/xv_mgcsfx.sample -man/man1/bggen.1.gz -man/man1/vdcomp.1.gz -man/man1/xcmap.1.gz -man/man1/xv.1.gz -man/man1/xvp2p.1.gz +etc/xv_mgcsfx +%%PORTDOCS%%%%DOCSDIR%%/BUGS +%%PORTDOCS%%%%DOCSDIR%%/CHANGELOG +%%PORTDOCS%%%%DOCSDIR%%/CPMASK +%%PORTDOCS%%%%DOCSDIR%%/IDEAS %%PORTDOCS%%%%DOCSDIR%%/README %%PORTDOCS%%%%DOCSDIR%%/README.jumbo +%%PORTDOCS%%%%DOCSDIR%%/README.FLmask +%%PORTDOCS%%%%DOCSDIR%%/README.docs +%%PORTDOCS%%%%DOCSDIR%%/README.md %%PORTDOCS%%%%DOCSDIR%%/README.pcd -%%PORTDOCS%%%%DOCSDIR%%/epsf.ps -%%PORTDOCS%%%%DOCSDIR%%/xpm.ps -%%PORTDOCS%%%%DOCSDIR%%/xvdocs.ps -%%PORTDOCS%%%%DOCSDIR%%/xvtitle.ps +%%PORTDOCS%%%%DOCSDIR%%/bigxv.jpg +%%PORTDOCS%%%%DOCSDIR%%/copyright.h +%%PORTDOCS%%%%DOCSDIR%%/formats/bmp.doc +%%PORTDOCS%%%%DOCSDIR%%/formats/epsf.ps +%%PORTDOCS%%%%DOCSDIR%%/formats/gif.ack +%%PORTDOCS%%%%DOCSDIR%%/formats/gif.aspect +%%PORTDOCS%%%%DOCSDIR%%/formats/gif87.doc +%%PORTDOCS%%%%DOCSDIR%%/formats/gif89.doc +%%PORTDOCS%%%%DOCSDIR%%/formats/pbm.5 +%%PORTDOCS%%%%DOCSDIR%%/formats/pgm.5 +%%PORTDOCS%%%%DOCSDIR%%/formats/ppm.5 +%%PORTDOCS%%%%DOCSDIR%%/formats/xpm.ps %%PORTDOCS%%%%DOCSDIR%%/help -%%PORTDOCS%%%%DOCSDIR%%/bmp.doc -%%PORTDOCS%%%%DOCSDIR%%/gif.ack -%%PORTDOCS%%%%DOCSDIR%%/gif.aspect -%%PORTDOCS%%%%DOCSDIR%%/gif87.doc -%%PORTDOCS%%%%DOCSDIR%%/gif89.doc +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/adding-algorithms.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/adding-formats-1.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/adding-formats-2.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/availability.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/color-allocation.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/color-editor-1.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/color-editor-2.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/color-editor-3.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/command-line-options.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/control-window-1.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/control-window-2.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/control-window-3.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/control-window-4.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/control-window-5.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/control-window-6.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/credits.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/diversity-algorithm.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/external-programs.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/image-window.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/blutxtr2.jpg +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-001.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-002.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-003.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-004.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-005.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-006.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-007.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-008.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-009.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-010.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-011.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-012.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-013.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-014.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-015.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-016.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-017.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-018.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-019.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-020.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-021.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-022.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-023.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-024.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-025.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-026.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-027.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-028.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-029.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-030.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-031.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-032.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-033.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-034.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-035.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-036.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-037.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-038.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-039.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-040.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-041.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-042.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-043.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-044.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-045.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-046.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-047.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-048.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-049.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-050.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-051.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-052.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-053.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-054.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-055.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-056.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-057.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-058.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-059.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-060.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-061.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-062.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-063.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-064.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-065.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-066.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-067.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-068.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-069.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-070.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-071.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-072.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-073.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-074.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-075.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-076.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-077.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-078.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-079.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-080.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-081.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-082.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-083.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-084.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-085.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-086.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-087.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-088.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-089.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-090.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-091.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-092.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-093.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-094.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-095.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-096.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-097.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-098.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-099.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-100.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-101.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-102.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-103.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-104.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-105.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-106.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-107.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-108.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-109.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-110.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-111.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-112.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-113.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-114.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-115.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-116.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-117.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-118.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-119.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-120.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-121.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-122.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-123.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-124.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-125.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-126.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-127.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-128.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-129.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-130.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-131.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-132.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-133.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-134.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-135.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-136.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-137.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-138.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-139.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-140.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-141.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-142.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-143.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-144.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-145.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-146.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-147.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-148.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-149.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-150.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-151.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-152.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-153.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-154.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-155.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-156.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-157.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-158.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-159.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-160.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-161.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-162.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-163.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-164.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-165.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-166.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-167.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-168.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-169.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-170.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-171.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-172.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-173.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-174.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-175.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-176.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-177.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-178.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-179.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-180.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-181.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-182.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-183.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-184.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-185.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-186.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-187.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-188.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-189.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-190.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-191.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-192.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-193.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-194.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-195.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-196.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-197.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-198.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-199.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-200.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-201.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-202.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/fig-203.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/navbar.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/small_banner.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/images/xvlogo.gif +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/index.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/info-window.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/load-window.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/manindex.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/modifying-behavior-1.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/modifying-behavior-2.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/modifying-behavior-3.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/modifying-behavior-4.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/mouse-keyboard-usage.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/overview.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/postscript-window.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/release-notes.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/rgb-hsv-colorspaces.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/save-window-1.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/save-window-2.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/textview-window.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/visual-schnauzer-1.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/visual-schnauzer-2.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/html/x-resources.html +%%PORTDOCS%%%%DOCSDIR%%/manuals/xvdocs.pdf +%%PORTDOCS%%%%DOCSDIR%%/manuals/xvdocs.ps +%%PORTDOCS%%%%DOCSDIR%%/manuals/xvtitle.ps +share/man/fi/man1/xv.1.gz +share/man/man1/bggen.1.gz +share/man/man1/vdcomp.1.gz +share/man/man1/xcmap.1.gz +share/man/man1/xv.1.gz +share/man/man1/xvpictoppm.1.gz +share/man/pl/man1/xvpictoppm.1.gz