diff : xv-3.10a-jumbo-fix-enh-patch-20070520.txt
This is a unified diff. It should be applied (using Larry Wall's "patch"
program) to the stock XV 3.10a sources. See the "How to build" section of
README.jumbo, which, along with roughly 40 other new files and 3 new sub-
directories, should have been unpacked along with this jumbo patch:
README.jumbo
README.pcd
bits/br_bzip2
bits/br_jp2
bits/br_jpc
bits/br_mag
bits/br_maki
bits/br_mgcsfx
bits/br_pcd
bits/br_pi
bits/br_pic
bits/br_pic2
bits/br_png
bits/br_zx
contrib/
contrib/fnkey-scripts/
contrib/fnkey-scripts/README
contrib/fnkey-scripts/jpegcrop.sh
contrib/fnkey-scripts/jpegeditcom.sh
contrib/fnkey-scripts/jpeglogrot.sh
contrib/fnkey-scripts/jpegrot.sh
contrib/fnkey-scripts/jpegundocrop.sh
contrib/fedora/
contrib/fedora/README
contrib/fedora/Build-FC5
docs/xvdocs.pdf
tiff/RANLIB.sh
xv_mgcsfx.sample
xvhips.c
xvhips.h
xvjp2k.c
xvmag.c
xvmaki.c
xvmgcsfx.c
xvml.c
xvml.h
xvpcd.c
xvpi.c
xvpic.c
xvpic2.c
xvpng.c
xvvd.c
xvwbmp.c
xvzx.c
diffs below:
Imakefile
Makefile
Makefile.std
bggen.c
bits/br_targa
bits/icon
cleandir
config.h
copyright.h
docs/bggen.man
docs/xcmap.man
docs/xv.man
docs/xvp2p.man
tiff/Makefile
tiff/Makefile.std
vdcomp.c
xcmap.c
xv.c
xv.h
xv24to8.c
xvalg.c
xvbmp.c
xvbrowse.c
xvbutt.c
xvcolor.c
xvctrl.c
xvcut.c
xvdflt.c
xvdflt.h
xvdial.c
xvdir.c
xvevent.c
xvfits.c
xvgam.c
xvgif.c
xvgifwr.c
xvgrab.c
xvgraf.c
xviff.c
xvimage.c
xvinfo.c
xviris.c
xvjpeg.c
xvmisc.c
xvpbm.c
xvpcx.c
xvpds.c
xvpictoppm.c
xvpm.c
xvpopup.c
xvps.c
xvrle.c
xvroot.c
xvscrl.c
xvsmooth.c
xvsunras.c
xvtarga.c
xvtext.c
xvtiff.c
xvtiffwr.c
xvxbm.c
xvxpm.c
xvxwd.c
diff -ru xv-3.10a/Imakefile xv-3.10a-enhancements/Imakefile
--- xv-3.10a/Imakefile 1995-01-13 12:24:01.000000000 -0800
+++ xv-3.10a-enhancements/Imakefile 2005-04-17 14:04:22.000000000 -0700
@@ -104,6 +104,11 @@
SGI = -Dsgi
#endif
+/* install directory of xv_mgcsfx.sample. */
+MGCSFXDIR = $(LIBDIR)
+/* Directory of default configuration file. */
+MGCSFX = -DMGCSFXDIR=\"$(MGCSFXDIR)\"
+
@@ -137,6 +142,8 @@
#if defined(SCOArchitecture)
SCO= -Dsco -DPOSIX -DNO_RANDOM
SYS_LIBRARIES= -lm -lc -lx
+#elif defined(HPArchitecture)
+SYS_LIBRARIES= -lm -lV3
#else
SYS_LIBRARIES= -lm
#endif
@@ -147,7 +154,7 @@
DEFINES= $(SCO) $(UNIX) $(NODIRENT) $(VPRINTF) $(TIMERS) \
$(HPUX7) $(JPEG) $(TIFF) $(PDS) $(DXWM) $(RAND) \
- $(BACKING_STORE) $(BSDTYPES) $(SGI)
+ $(BACKING_STORE) $(BSDTYPES) $(SGI) $(MGCSFX)
INCLUDES = $(JPEGINCLUDE) $(TIFFINCLUDE)
@@ -157,7 +164,9 @@
xvdial.c xvgraf.c xvsunras.c xvjpeg.c xvps.c xvpopup.c xvdflt.c \
xvtiff.c xvtiffwr.c xvpds.c xvrle.c xviris.c xvgrab.c vprintf.c \
xvbrowse.c xvtext.c xvpcx.c xviff.c xvtarga.c xvxpm.c xvcut.c \
- xvxwd.c xvfits.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
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 \
@@ -165,7 +174,9 @@
xvdial.o xvgraf.o xvsunras.o xvjpeg.o xvps.o xvpopup.o xvdflt.o \
xvtiff.o xvtiffwr.o xvpds.o xvrle.o xviris.o xvgrab.o vprintf.o \
xvbrowse.o xvtext.o xvpcx.o xviff.o xvtarga.o xvxpm.o xvcut.o \
- xvxwd.o xvfits.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
SRCS2= bggen.c
OBJS2= bggen.o
@@ -266,6 +277,8 @@
InstallManPageLong(docs/xvp2p,$(MANDIR),xvpictoppm)
InstallManPageLong(docs/vdcomp,$(MANDIR),vdcomp)
+InstallNonExecFile(xv_mgcsfx.sample,$(MGCSFXDIR))
+
tar:
tar cf xv.tar Makefile* Imakefile *.c *.h bits docs \
docs unsupt vms $(JPEGDIR) $(TIFFDIR) $(MISC)
diff -ru xv-3.10a/Makefile xv-3.10a-enhancements/Makefile
--- xv-3.10a/Makefile 1995-01-23 12:20:54.000000000 -0800
+++ xv-3.10a-enhancements/Makefile 2007-05-20 21:17:35.000000000 -0700
@@ -2,7 +2,11 @@
# your C compiler (and options) of choice
CC = cc
-# CC = gcc -ansi
+#CC = gcc -ansi
+# note that -ansi kills __USE_MISC (gcc 2.95.3), which, at least on Linux,
+# determines whether stdlib.h includes prototypes for mktemp(), random(), etc.
+# (i.e., if you use it, you will get unnecessary compiler warnings)
+#CC = gcc
# use this if you're using 'cc' on a DEC Alpha (OSF/1) or MIPS (Ultrix) system:
# CC = cc -std1 -Olimit 750
@@ -14,8 +18,20 @@
# -Wuninitialized -Wparentheses
-CCOPTS = -O
-
+CCOPTS = -O
+#
+# these are the usual optimization and warning options for gcc; all such
+# warnings but one (mktemp() use) have been eliminated (at least on Linux):
+#CCOPTS = -O3 -Wall
+#
+# slightly more warnings... older code often made non-const pointers to
+# static strings (nothing should blow up unless something tries to write
+# to them):
+#CCOPTS = -O3 -Wall -Wpointer-arith -Wcast-align -Wwrite-strings -Wnested-externs
+#
+# for the next step up in gcc noise, try adding -W (but note that it adds a
+# huge number of unused-parameter and signed/unsigned comparison warnings):
+#CCOPTS = -O3 -Wall -W
### NOTE: Sun running OpenWindows:
### if you're using a SUN running OPENWINDOWS, you need to add these two
@@ -27,50 +43,155 @@
### '-I' options on the CCOPTS line to tell the compiler where said files are.
+# older Unixen don't support the -p option, but its lack may mean installation
+# will fail (if more than one directory level is missing)
+MKDIR = mkdir -p
+
+
+# BeOS _may_ need to use a different version (below), but probably not
+CLEANDIR = cleandir
+
+
### Installation locations
-BINDIR = /usr/local/bin
-MANDIR = /usr/local/man/man1
+### NOTE: Users of old K&R compilers (i.e., any version not supporting C89
+### string concatenation, such as "fub" "ar" => "fubar") should update
+### xvtext.c:1831 (or thereabouts) if either PREFIX or DOCDIR changes:
+PREFIX = /usr/local
+BINDIR = $(PREFIX)/bin
+MANDIR = $(PREFIX)/share/man/man1
MANSUF = 1
-LIBDIR = /usr/local/lib
+DOCDIR = $(PREFIX)/share/doc/xv
+LIBDIR = $(PREFIX)/lib/xv
+SYSCONFDIR = /etc
+DESTDIR =
buildit: all
########################### CONFIGURATION OPTIONS ############################
-### NOTE: be sure to check 'config.h', for a few other configuration options
+### NOTE: be sure to check 'config.h', for a few other configuration options
##############################################################################
###
+### if, for whatever reason, you're unable to get the TIFF library to compile
+### on your machine, *COMMENT OUT* the following lines
+###
+### GRR 20050319: USE_TILED_TIFF_BOTLEFT_FIX enables an experimental fix for
+### tiled TIFFs with ORIENTATION_BOTLEFT. It may break other tiled TIFFs,
+### or it may be required for certain other TIFF types (e.g., strips with
+### ORIENTATION_BOTLEFT). I don't have a sufficient variety of TIFF test
+### images at hand.
+###
+#TIFF = -DDOTIFF
+TIFF = -DDOTIFF -DUSE_TILED_TIFF_BOTLEFT_FIX
+###
+#TIFFDIR = tiff
+TIFFDIR = /usr
+#TIFFDIR = /usr/local
+#TIFFDIR = ../../libtiff
+###
+TIFFINC = -I$(TIFFDIR)/include
+#TIFFINC = -I$(TIFFDIR)
+###
+### libtiff 3.5 and up may be compiled with zlib and libjpeg, but the
+### dependency is properly handled in LIBS line ~247 lines below
+###
+TIFFLIB = -L$(TIFFDIR)/lib -ltiff
+#TIFFLIB = $(TIFFDIR)/lib/libtiff.a
+#TIFFLIB = -L$(TIFFDIR) -ltiff
+#TIFFLIB = $(TIFFDIR)/libtiff.a
+###
+### this is intended to build the ancient version (3.3.016 beta) that's
+### included in the "tiff" subdir of XV, not an arbitrary copy of libtiff:
+###
+#$(TIFFLIB):
+# ( cd $(TIFFDIR) ; make CC='$(CC)' COPTS='$(CCOPTS) $(MCHN)' )
+
+
+###
### if, for whatever reason, you're unable to get the JPEG library to compile
### on your machine, *COMMENT OUT* the following lines
###
+### NOTE: /usr/sfw can be used on Solaris with "Sun freeware" installed
+###
JPEG = -DDOJPEG
-JPEGDIR = jpeg
-JPEGINC = -I$(JPEGDIR)
-JPEGLIB = $(JPEGDIR)/libjpeg.a
-$(JPEGDIR)/jconfig.h:
- cd $(JPEGDIR) ; ./configure CC='$(CC)'
-$(JPEGLIB): $(JPEGDIR)/jconfig.h
- cd $(JPEGDIR) ; make
+#JPEGDIR = jpeg
+JPEGDIR = /usr
+#JPEGDIR = /usr/local
+#JPEGDIR = ../../libjpeg
+#JPEGDIR = /usr/sfw
+###
+JPEGINC = -I$(JPEGDIR)/include
+#JPEGINC = -I$(JPEGDIR)
+###
+JPEGLIB = -L$(JPEGDIR)/lib -ljpeg
+#JPEGLIB = -L$(JPEGDIR) -ljpeg
+#JPEGLIB = $(JPEGDIR)/libjpeg.a
+###
+### this is intended to build the ancient version (5a) that's included in the
+### "jpeg" subdir of XV, not an arbitrary copy of libjpeg:
+###
+#$(JPEGDIR)/jconfig.h:
+# cd $(JPEGDIR) ; ./configure CC='$(CC)'
+#$(JPEGLIB): $(JPEGDIR)/jconfig.h
+# cd $(JPEGDIR) ; make
###
-### if, for whatever reason, you're unable to get the TIFF library to compile
+### if, for whatever reason, you're unable to get the PNG library to compile
### on your machine, *COMMENT OUT* the following lines
###
-TIFF = -DDOTIFF
-TIFFDIR = tiff
-TIFFINC = -I$(TIFFDIR)
-TIFFLIB = $(TIFFDIR)/libtiff.a
-$(TIFFLIB):
- ( cd $(TIFFDIR) ; make CC='$(CC)' )
+PNG = -DDOPNG
+PNGDIR = /usr
+#PNGDIR = /usr/local
+#PNGDIR = ../../libpng
+###
+PNGINC = -I$(PNGDIR)/include
+#PNGINC = -I$(PNGDIR)
+###
+PNGLIB = -L$(PNGDIR)/lib -lpng
+#PNGLIB = -L$(PNGDIR) -lpng
+#PNGLIB = $(PNGDIR)/libpng.a
+
+
+###
+### if, for whatever reason, you're unable to get both the PNG library and
+### (newer versions of) the TIFF library to compile on your machine, *COMMENT
+### OUT* the following lines
+###
+ZLIBDIR = /usr
+#ZLIBDIR = /usr/local
+#ZLIBDIR = ../../zlib
+###
+ZLIBINC = -I$(ZLIBDIR)/include
+#ZLIBINC = -I$(ZLIBDIR)
+###
+ZLIBLIB = -L$(ZLIBDIR)/lib -lz
+#ZLIBLIB = -L$(ZLIBDIR) -lz
+#ZLIBLIB = $(ZLIBDIR)/libz.a
+
+
+###
+### if, for whatever reason, you're unable to get the JasPer JPEG-2000 library
+### to compile on your machine, *COMMENT OUT* the following lines
+###
+JP2K = -DDOJP2K
+###
+#JP2KDIR = ../../jasper
+JP2KDIR = /usr/local/lib
+###
+#JP2KINC = -I$(JP2KDIR)
+JP2KINC = -I/usr/local/include
+###
+#JP2KLIB = -L$(JP2KDIR) -ljasper
+JP2KLIB = $(JP2KDIR)/libjasper.a
###
### if, for whatever reason, you're unable to get the PDS/VICAR support
### to compile (xvpds.c, and vdcomp.c), *COMMENT OUT* the following line,
-### and also remove 'vdcomp' from the 'all:' dependancy
+### and also remove 'vdcomp' from the 'all:' dependency
###
PDS = -DDOPDS
@@ -78,46 +199,60 @@
#----------System V----------
# if you are running on a SysV-based machine, such as HP, Silicon Graphics,
-# Solaris, etc., uncomment the following line to get mostly there.
-#UNIX = -DSVR4
+# Solaris, etc.; uncomment one of the following lines to get you *most* of
+# the way there. SYSV means System V R3.
+# UNIX = -DSVR4
+# UNIX = -DSYSV
+
+#----------Machine-Specific Configurations----------
+
+### If you are using a BeOS system, uncomment the following line
+#MCHN = -DUSE_GETCWD -I/usr/X11/include -L/usr/X11/lib
+###
+### The stock version of cleandir now should work for BeOS, too, so try
+### leaving this commented out:
+#CLEANDIR = cleandir.BeOS
-#----------Machine Specific Configurations----------
### If you are using an SGI system, uncomment the following line
#MCHN = -Dsgi
-### For HP-UX, uncomment the following line:
+### For HP-UX, uncomment the following line
#MCHN= -Dhpux -D_HPUX_SOURCE
# To use old HP compilers (HPUX 7.0 or so), you may need
#MCHN= -Dhpux -D_HPUX_SOURCE +Ns4000
#
-# also, if you're using HP's compiler, add '-Aa' to whichever of those
+# Also, if you're using HP's compiler, add '-Aa' to whichever of those
# two lines you're using, to turn on ANSI C mode. Or so I'm told.
#
-# note: You may need to add '-I/usr/include/X11R5' (or R6, or whatever)
+# Note: You may need to add '-I/usr/include/X11R5' (or R6, or whatever)
# to whichever of those lines you used, as HP tends to store their X11
# include files in a non-standard place...
+#
+# And you probably have to add '-lV3' to the end of the LIBS def when
+# using XV's AUTO_EXPAND option.
-### for LINUX, uncomment the following line
-#MCHN = -DLINUX
+### for Linux, uncomment one of the following lines:
+#MCHN = -DLINUX -L/usr/X11R6/lib
+#MCHN = -DLINUX -L/usr/X11R6/lib64
# For SCO 1.1 (UNIX 3.2v2) machines, uncomment the following:
#MCHN = -Dsco -DPOSIX
#
# For ODT 2.0 (UNIX 3.2v4) machines, uncomment the following:
-#MCHN= -Dsco -DPOSIX -DNO_RANDOM
+#MCHN= -Dsco -DPOSIX -DNO_RANDOM
#
# Also, you should add '-lc -lx' to the end of the LIBS def below
# -lx must be after -lc so you get the right directory routines.
# for UMAX V by Encore Computers uncomment the following line for
-# the portable c compiler, system specific definitions and
-# location of local X11 library(if site specific, modify -L option)
+# the portable C compiler, system-specific definitions and
+# location of local X11 library (if site-specific, modify -L option)
# No other switches should be necessary, or so I'm told...
#
#MCHN = -q extensions=pcc_c -D__UMAXV__ -L/usr2/usr/lib/X11 -DSVR4
@@ -147,8 +282,8 @@
#TIMERS = -DUSLEEP
-# if XV locks up whenever you click on *any* of the buttons, the Timer()
-# function in xvmisc.c is going out to lunch. A simple workaround is to
+# if XV locks up whenever you click on *any* of the buttons, the Timer()
+# function in xvmisc.c is going out to lunch. A simple workaround is to
# uncomment the following line:
#TIMERS = -DNOTIMER
@@ -160,7 +295,7 @@
#DXWM = -DDXWM
-# if, during compilation, your system complains about the types
+# if, during compilation, your system complains about the types
# 'u_long', 'u_short', 'u_int', etc. as being undefined, uncomment the
# following line:
#BSDTYPES = -DBSDTYPES
@@ -177,18 +312,38 @@
#VPRINTF = -DNEED_VPRINTF -DLONGINT -DNOSTDHDRS
+# if your machine puts the prototype for 'malloc()' in malloc.h rather than
+# stdlib.h, uncomment the following line:
+#
+#MALLOC = -DNEED_MALLOC_H
-################ END OF CONFIGURATION OPTIONS #################
+# if your X Window System compiled with -DX_LOCALE,
+# uncomment the following line:
+# TVL10N = -DX_LOCALE
+
+# Install directory of xv_mgcsfx.sample.
+MGCSFXDIR = $(LIBDIR)
+# Directory of default configuration file.
+MGCSFX = -DMGCSFXDIR=\"$(MGCSFXDIR)\"
+
+################ END OF CONFIGURATION OPTIONS #################
+
-CFLAGS = $(CCOPTS) $(JPEG) $(JPEGINC) $(TIFF) $(TIFFINC) $(PDS) \
- $(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \
- $(DXWM) $(MCHN)
-LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) -lm
+
+CFLAGS = $(CCOPTS) $(PNG) $(PNGINC) $(ZLIBINC) $(JPEG) $(JPEGINC) \
+ $(TIFF) $(TIFFINC) $(PDS) $(JP2K) $(JP2KINC) $(TVL10N) $(MGCSFX) \
+ $(UNIX) $(BSDTYPES) $(RAND) $(MALLOC) $(DXWM) $(MCHN) $(NODIRENT) \
+ $(VPRINTF) $(TIMERS) -DDOCDIR=\"$(DOCDIR)\" \
+ -DSYSCONFDIR=\"$(SYSCONFDIR)\" -DXVEXECPATH=\"$(LIBDIR)\"
+
+### remove -lm for BeOS:
+LIBS = $(TIFFLIB) $(JPEGLIB) $(PNGLIB) $(ZLIBLIB) $(JP2KLIB) -L/usr/X11R6/lib -lX11 -lm
+#LIBS = $(TIFFLIB) $(JPEGLIB) $(PNGLIB) $(ZLIBLIB) $(JP2KLIB) -lX11
OBJS = 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 \
@@ -196,7 +351,9 @@
xvdial.o xvgraf.o xvsunras.o xvjpeg.o xvps.o xvpopup.o xvdflt.o \
xvtiff.o xvtiffwr.o xvpds.o xvrle.o xviris.o xvgrab.o vprintf.o \
xvbrowse.o xvtext.o xvpcx.o xviff.o xvtarga.o xvxpm.o xvcut.o \
- xvxwd.o xvfits.o
+ xvxwd.o xvfits.o xvpng.o xvzx.o xvwbmp.o xvpcd.o xvhips.o \
+ xvmag.o xvpic.o xvmaki.o xvpi.o xvpic2.o xvvd.o xvmgcsfx.o \
+ xvml.o xvjp2k.o
MISC = README INSTALL CHANGELOG IDEAS
@@ -206,10 +363,12 @@
-all: $(JPEGLIB) $(TIFFLIB) xv bggen vdcomp xcmap xvpictoppm
+#all: $(JPEGLIB) $(TIFFLIB) xv bggen vdcomp xcmap xvpictoppm
+all: xv bggen vdcomp xcmap xvpictoppm
-xv: $(OBJS) $(JPEGLIB) $(TIFFLIB)
+#xv: $(OBJS) $(JPEGLIB) $(TIFFLIB)
+xv: $(OBJS)
$(CC) -o xv $(CFLAGS) $(OBJS) $(LIBS)
bggen: bggen.c
@@ -231,23 +390,47 @@
clean: xvclean
rm -f bggen vdcomp xcmap xvpictoppm
- ./cleandir $(JPEGDIR)
- rm -f $(JPEGDIR)/jconfig.h $(JPEGDIR)/Makefile
- ./cleandir $(TIFFDIR)
+# clean only local jpeg and tiff dirs, not user's or system's copies:
+ ./$(CLEANDIR) jpeg
+ rm -f jpeg/jconfig.h jpeg/Makefile
+ ./$(CLEANDIR) tiff
+# could also do some shell trickery here to attempt mkdir only if dir is
+# missing (e.g., "test -d
|| $(MKDIR) ")
install: all
- cp xv bggen vdcomp xcmap xvpictoppm $(BINDIR)
- cp docs/xv.man $(MANDIR)/xv.$(MANSUF)
- cp docs/bggen.man $(MANDIR)/bggen.$(MANSUF)
- cp docs/xcmap.man $(MANDIR)/xcmap.$(MANSUF)
- cp docs/xvp2p.man $(MANDIR)/xvpictoppm.$(MANSUF)
- cp docs/vdcomp.man $(MANDIR)/vdcomp.$(MANSUF)
- cp docs/xvdocs.ps* $(LIBDIR)
+ $(MKDIR) $(DESTDIR)$(BINDIR)
+ cp xv bggen vdcomp xcmap xvpictoppm $(DESTDIR)$(BINDIR)/.
+ chmod 755 $(DESTDIR)$(BINDIR)/xv $(DESTDIR)$(BINDIR)/bggen \
+ $(DESTDIR)$(BINDIR)/vdcomp $(DESTDIR)$(BINDIR)/xcmap \
+ $(DESTDIR)$(BINDIR)/xvpictoppm
+#
+ $(MKDIR) $(DESTDIR)$(MANDIR)
+ cp docs/xv.man $(DESTDIR)$(MANDIR)/xv.$(MANSUF)
+ cp docs/bggen.man $(DESTDIR)$(MANDIR)/bggen.$(MANSUF)
+ cp docs/xcmap.man $(DESTDIR)$(MANDIR)/xcmap.$(MANSUF)
+ cp docs/xvp2p.man $(DESTDIR)$(MANDIR)/xvpictoppm.$(MANSUF)
+ cp docs/vdcomp.man $(DESTDIR)$(MANDIR)/vdcomp.$(MANSUF)
+ chmod 644 $(DESTDIR)$(MANDIR)/xv.$(MANSUF) \
+ $(DESTDIR)$(MANDIR)/bggen.$(MANSUF) \
+ $(DESTDIR)$(MANDIR)/xcmap.$(MANSUF) \
+ $(DESTDIR)$(MANDIR)/xvpictoppm.$(MANSUF) \
+ $(DESTDIR)$(MANDIR)/vdcomp.$(MANSUF)
+#
+ $(MKDIR) $(DESTDIR)$(DOCDIR) # or $(DESTDIR)$(LIBDIR)
+ cp README.jumbo docs/xvdocs.pdf docs/xvdocs.ps $(DESTDIR)$(DOCDIR)/.
+ chmod 644 $(DESTDIR)$(DOCDIR)/README.jumbo \
+ $(DESTDIR)$(DOCDIR)/xvdocs.pdf $(DESTDIR)$(DOCDIR)/xvdocs.ps
+#
+ #$(MKDIR) $(DESTDIR)$(SYSCONFDIR)
+ #cp xv_mgcsfx.sample $(DESTDIR)$(SYSCONFDIR)/xv_mgcsfx
+ #chmod 644 $(DESTDIR)$(SYSCONFDIR)/xv_mgcsfx
+
tar:
+# tar only local jpeg and tiff dirs, not user's or system's copies:
tar cvf xv.tar Makefile* Imakefile *.c *.h bits \
- docs unsupt vms $(JPEGDIR) $(TIFFDIR) $(MISC)
+ docs unsupt vms jpeg tiff $(MISC)
xvtar:
tar cvf xv.tar Makefile* Imakefile *.c *.h bits
@@ -257,26 +440,28 @@
################# bitmap dependencies ####################
-xv.o: bits/icon bits/iconmask bits/runicon bits/runiconm
-xv.o: bits/cboard50 bits/gray25
+xv.o: bits/icon bits/iconmask bits/runicon bits/runiconm
+xv.o: bits/cboard50 bits/gray25
xvbrowse.o: bits/br_file bits/br_dir bits/br_exe bits/br_chr bits/br_blk
-xvbrowse.o: bits/br_sock bits/br_fifo bits/br_error bits/br_unknown
-xvbrowse.o: bits/br_cmpres bits/br_gif bits/br_pm bits/br_pbm
+xvbrowse.o: bits/br_sock bits/br_fifo bits/br_error # bits/br_unknown
+xvbrowse.o: bits/br_cmpres bits/br_bzip2 bits/br_gif bits/br_pm bits/br_pbm
xvbrowse.o: bits/br_sunras bits/br_bmp bits/br_utah bits/br_iris
-xvbrowse.o: bits/br_pcx bits/br_jfif bits/br_tiff bits/br_pds
-xvbrowse.o: bits/br_ps bits/br_iff bits/br_targa bits/br_xpm
+xvbrowse.o: bits/br_pcx bits/br_jfif bits/br_tiff bits/br_pds bits/br_pcd
+xvbrowse.o: bits/br_ps bits/br_iff bits/br_targa bits/br_xpm bits/br_xwd
+xvbrowse.o: bits/br_fits bits/br_png bits/br_zx bits/br_mag bits/br_maki
+xvbrowse.o: bits/br_pic bits/br_pi bits/br_pic2 bits/br_mgcsfx
+xvbrowse.o: bits/br_jp2 bits/br_jpc
xvbrowse.o: bits/br_trash bits/fcurs bits/fccurs bits/fdcurs bits/fcursm
-xvbrowse.o: bits/br_xwd
xvbutt.o: bits/cboard50 bits/rb_frame bits/rb_frame1 bits/rb_top
xvbutt.o: bits/rb_bot bits/rb_dtop bits/rb_dbot bits/rb_body
xvbutt.o: bits/rb_dot bits/cb_check bits/mb_chk
xvctrl.o: bits/gray25 bits/gray50 bits/i_fifo bits/i_chr bits/i_dir
-xvctrl.o: bits/i_blk bits/i_lnk bits/i_sock bits/i_exe bits/i_reg
+xvctrl.o: bits/i_blk bits/i_lnk bits/i_sock bits/i_exe bits/i_reg
xvctrl.o: bits/h_rotl bits/h_rotr bits/fliph bits/flipv bits/p10
-xvctrl.o: bits/m10 bits/cut bits/copy bits/paste bits/clear
+xvctrl.o: bits/m10 bits/cut bits/copy bits/paste bits/clear
xvctrl.o: bits/uicon bits/oicon1 bits/oicon2 bits/icon
xvctrl.o: bits/padimg bits/annot
@@ -285,13 +470,13 @@
xvdflt.o: bits/logo_top bits/logo_bot bits/logo_out bits/xv_jhb
xvdflt.o: bits/xv_cpyrt bits/xv_rev bits/xv_ver
xvdflt.o: bits/xf_left bits/xf_right bits/font5x9.h
-xvdflt.o: xvdflt.h
+xvdflt.o: xvdflt.h
xvdial.o: bits/dial_cw1 bits/dial_ccw1 bits/dial_cw2 bits/dial_ccw2
xvdir.o: bits/d_load bits/d_save
-xvevent.o: bits/dropper bits/dropperm bits/pen bits/penm
+xvevent.o: bits/dropper bits/dropperm bits/pen bits/penm
xvevent.o: bits/blur bits/blurm
xvgam.o: bits/h_rotl bits/h_rotr bits/h_flip bits/h_sinc bits/h_sdec
diff -ru xv-3.10a/Makefile.std xv-3.10a-enhancements/Makefile.std
--- xv-3.10a/Makefile.std 1995-01-23 17:06:26.000000000 -0800
+++ xv-3.10a-enhancements/Makefile.std 2007-05-20 21:17:35.000000000 -0700
@@ -2,7 +2,11 @@
# your C compiler (and options) of choice
CC = cc
-# CC = gcc -ansi
+#CC = gcc -ansi
+# note that -ansi kills __USE_MISC (gcc 2.95.3), which, at least on Linux,
+# determines whether stdlib.h includes prototypes for mktemp(), random(), etc.
+# (i.e., if you use it, you will get unnecessary compiler warnings)
+#CC = gcc
# use this if you're using 'cc' on a DEC Alpha (OSF/1) or MIPS (Ultrix) system:
# CC = cc -std1 -Olimit 750
@@ -14,8 +18,20 @@
# -Wuninitialized -Wparentheses
-CCOPTS = -O
-
+CCOPTS = -O
+#
+# these are the usual optimization and warning options for gcc; all such
+# warnings but one (mktemp() use) have been eliminated (at least on Linux):
+#CCOPTS = -O3 -Wall
+#
+# slightly more warnings... older code often made non-const pointers to
+# static strings (nothing should blow up unless something tries to write
+# to them):
+#CCOPTS = -O3 -Wall -Wpointer-arith -Wcast-align -Wwrite-strings -Wnested-externs
+#
+# for the next step up in gcc noise, try adding -W (but note that it adds a
+# huge number of unused-parameter and signed/unsigned comparison warnings):
+#CCOPTS = -O3 -Wall -W
### NOTE: Sun running OpenWindows:
### if you're using a SUN running OPENWINDOWS, you need to add these two
@@ -27,50 +43,155 @@
### '-I' options on the CCOPTS line to tell the compiler where said files are.
+# older Unixen don't support the -p option, but its lack may mean installation
+# will fail (if more than one directory level is missing)
+MKDIR = mkdir -p
+
+
+# BeOS _may_ need to use a different version (below), but probably not
+CLEANDIR = cleandir
+
+
### Installation locations
-BINDIR = /usr/local/bin
-MANDIR = /usr/local/man/man1
+### NOTE: Users of old K&R compilers (i.e., any version not supporting C89
+### string concatenation, such as "fub" "ar" => "fubar") should update
+### xvtext.c:1831 (or thereabouts) if either PREFIX or DOCDIR changes:
+PREFIX = /usr/local
+BINDIR = $(PREFIX)/bin
+MANDIR = $(PREFIX)/share/man/man1
MANSUF = 1
-LIBDIR = /usr/local/lib
+DOCDIR = $(PREFIX)/share/doc/xv
+LIBDIR = $(PREFIX)/lib/xv
+SYSCONFDIR = /etc
+DESTDIR =
buildit: all
########################### CONFIGURATION OPTIONS ############################
-### NOTE: be sure to check 'config.h', for a few other configuration options
+### NOTE: be sure to check 'config.h', for a few other configuration options
##############################################################################
###
+### if, for whatever reason, you're unable to get the TIFF library to compile
+### on your machine, *COMMENT OUT* the following lines
+###
+### GRR 20050319: USE_TILED_TIFF_BOTLEFT_FIX enables an experimental fix for
+### tiled TIFFs with ORIENTATION_BOTLEFT. It may break other tiled TIFFs,
+### or it may be required for certain other TIFF types (e.g., strips with
+### ORIENTATION_BOTLEFT). I don't have a sufficient variety of TIFF test
+### images at hand.
+###
+#TIFF = -DDOTIFF
+TIFF = -DDOTIFF -DUSE_TILED_TIFF_BOTLEFT_FIX
+###
+#TIFFDIR = tiff
+TIFFDIR = /usr
+#TIFFDIR = /usr/local
+#TIFFDIR = ../../libtiff
+###
+TIFFINC = -I$(TIFFDIR)/include
+#TIFFINC = -I$(TIFFDIR)
+###
+### libtiff 3.5 and up may be compiled with zlib and libjpeg, but the
+### dependency is properly handled in LIBS line ~247 lines below
+###
+TIFFLIB = -L$(TIFFDIR)/lib -ltiff
+#TIFFLIB = $(TIFFDIR)/lib/libtiff.a
+#TIFFLIB = -L$(TIFFDIR) -ltiff
+#TIFFLIB = $(TIFFDIR)/libtiff.a
+###
+### this is intended to build the ancient version (3.3.016 beta) that's
+### included in the "tiff" subdir of XV, not an arbitrary copy of libtiff:
+###
+#$(TIFFLIB):
+# ( cd $(TIFFDIR) ; make CC='$(CC)' COPTS='$(CCOPTS) $(MCHN)' )
+
+
+###
### if, for whatever reason, you're unable to get the JPEG library to compile
### on your machine, *COMMENT OUT* the following lines
###
+### NOTE: /usr/sfw can be used on Solaris with "Sun freeware" installed
+###
JPEG = -DDOJPEG
-JPEGDIR = jpeg
-JPEGINC = -I$(JPEGDIR)
-JPEGLIB = $(JPEGDIR)/libjpeg.a
-$(JPEGDIR)/jconfig.h:
- cd $(JPEGDIR) ; ./configure CC='$(CC)'
-$(JPEGLIB): $(JPEGDIR)/jconfig.h
- cd $(JPEGDIR) ; make
+#JPEGDIR = jpeg
+JPEGDIR = /usr
+#JPEGDIR = /usr/local
+#JPEGDIR = ../../libjpeg
+#JPEGDIR = /usr/sfw
+###
+JPEGINC = -I$(JPEGDIR)/include
+#JPEGINC = -I$(JPEGDIR)
+###
+JPEGLIB = -L$(JPEGDIR)/lib -ljpeg
+#JPEGLIB = -L$(JPEGDIR) -ljpeg
+#JPEGLIB = $(JPEGDIR)/libjpeg.a
+###
+### this is intended to build the ancient version (5a) that's included in the
+### "jpeg" subdir of XV, not an arbitrary copy of libjpeg:
+###
+#$(JPEGDIR)/jconfig.h:
+# cd $(JPEGDIR) ; ./configure CC='$(CC)'
+#$(JPEGLIB): $(JPEGDIR)/jconfig.h
+# cd $(JPEGDIR) ; make
###
-### if, for whatever reason, you're unable to get the TIFF library to compile
+### if, for whatever reason, you're unable to get the PNG library to compile
### on your machine, *COMMENT OUT* the following lines
###
-TIFF = -DDOTIFF
-TIFFDIR = tiff
-TIFFINC = -I$(TIFFDIR)
-TIFFLIB = $(TIFFDIR)/libtiff.a
-$(TIFFLIB):
- ( cd $(TIFFDIR) ; make CC='$(CC)' )
+PNG = -DDOPNG
+PNGDIR = /usr
+#PNGDIR = /usr/local
+#PNGDIR = ../../libpng
+###
+PNGINC = -I$(PNGDIR)/include
+#PNGINC = -I$(PNGDIR)
+###
+PNGLIB = -L$(PNGDIR)/lib -lpng
+#PNGLIB = -L$(PNGDIR) -lpng
+#PNGLIB = $(PNGDIR)/libpng.a
+
+
+###
+### if, for whatever reason, you're unable to get both the PNG library and
+### (newer versions of) the TIFF library to compile on your machine, *COMMENT
+### OUT* the following lines
+###
+ZLIBDIR = /usr
+#ZLIBDIR = /usr/local
+#ZLIBDIR = ../../zlib
+###
+ZLIBINC = -I$(ZLIBDIR)/include
+#ZLIBINC = -I$(ZLIBDIR)
+###
+ZLIBLIB = -L$(ZLIBDIR)/lib -lz
+#ZLIBLIB = -L$(ZLIBDIR) -lz
+#ZLIBLIB = $(ZLIBDIR)/libz.a
+
+
+###
+### if, for whatever reason, you're unable to get the JasPer JPEG-2000 library
+### to compile on your machine, *COMMENT OUT* the following lines
+###
+JP2K = -DDOJP2K
+###
+#JP2KDIR = ../../jasper
+JP2KDIR = /usr/local/lib
+###
+#JP2KINC = -I$(JP2KDIR)
+JP2KINC = -I/usr/local/include
+###
+#JP2KLIB = -L$(JP2KDIR) -ljasper
+JP2KLIB = $(JP2KDIR)/libjasper.a
###
### if, for whatever reason, you're unable to get the PDS/VICAR support
### to compile (xvpds.c, and vdcomp.c), *COMMENT OUT* the following line,
-### and also remove 'vdcomp' from the 'all:' dependancy
+### and also remove 'vdcomp' from the 'all:' dependency
###
PDS = -DDOPDS
@@ -78,46 +199,60 @@
#----------System V----------
# if you are running on a SysV-based machine, such as HP, Silicon Graphics,
-# Solaris, etc., uncomment the following line to get mostly there.
-#UNIX = -DSVR4
+# Solaris, etc.; uncomment one of the following lines to get you *most* of
+# the way there. SYSV means System V R3.
+# UNIX = -DSVR4
+# UNIX = -DSYSV
+
+#----------Machine-Specific Configurations----------
+
+### If you are using a BeOS system, uncomment the following line
+#MCHN = -DUSE_GETCWD -I/usr/X11/include -L/usr/X11/lib
+###
+### The stock version of cleandir now should work for BeOS, too, so try
+### leaving this commented out:
+#CLEANDIR = cleandir.BeOS
-#----------Machine Specific Configurations----------
### If you are using an SGI system, uncomment the following line
#MCHN = -Dsgi
-### For HP-UX, uncomment the following line:
+### For HP-UX, uncomment the following line
#MCHN= -Dhpux -D_HPUX_SOURCE
# To use old HP compilers (HPUX 7.0 or so), you may need
#MCHN= -Dhpux -D_HPUX_SOURCE +Ns4000
#
-# also, if you're using HP's compiler, add '-Aa' to whichever of those
+# Also, if you're using HP's compiler, add '-Aa' to whichever of those
# two lines you're using, to turn on ANSI C mode. Or so I'm told.
#
-# note: You may need to add '-I/usr/include/X11R5' (or R6, or whatever)
+# Note: You may need to add '-I/usr/include/X11R5' (or R6, or whatever)
# to whichever of those lines you used, as HP tends to store their X11
# include files in a non-standard place...
+#
+# And you probably have to add '-lV3' to the end of the LIBS def when
+# using XV's AUTO_EXPAND option.
-### for LINUX, uncomment the following line
-#MCHN = -DLINUX
+### for Linux, uncomment one of the following lines:
+#MCHN = -DLINUX -L/usr/X11R6/lib
+#MCHN = -DLINUX -L/usr/X11R6/lib64
# For SCO 1.1 (UNIX 3.2v2) machines, uncomment the following:
#MCHN = -Dsco -DPOSIX
#
# For ODT 2.0 (UNIX 3.2v4) machines, uncomment the following:
-#MCHN= -Dsco -DPOSIX -DNO_RANDOM
+#MCHN= -Dsco -DPOSIX -DNO_RANDOM
#
# Also, you should add '-lc -lx' to the end of the LIBS def below
# -lx must be after -lc so you get the right directory routines.
# for UMAX V by Encore Computers uncomment the following line for
-# the portable c compiler, system specific definitions and
-# location of local X11 library(if site specific, modify -L option)
+# the portable C compiler, system-specific definitions and
+# location of local X11 library (if site-specific, modify -L option)
# No other switches should be necessary, or so I'm told...
#
#MCHN = -q extensions=pcc_c -D__UMAXV__ -L/usr2/usr/lib/X11 -DSVR4
@@ -147,8 +282,8 @@
#TIMERS = -DUSLEEP
-# if XV locks up whenever you click on *any* of the buttons, the Timer()
-# function in xvmisc.c is going out to lunch. A simple workaround is to
+# if XV locks up whenever you click on *any* of the buttons, the Timer()
+# function in xvmisc.c is going out to lunch. A simple workaround is to
# uncomment the following line:
#TIMERS = -DNOTIMER
@@ -160,7 +295,7 @@
#DXWM = -DDXWM
-# if, during compilation, your system complains about the types
+# if, during compilation, your system complains about the types
# 'u_long', 'u_short', 'u_int', etc. as being undefined, uncomment the
# following line:
#BSDTYPES = -DBSDTYPES
@@ -177,18 +312,38 @@
#VPRINTF = -DNEED_VPRINTF -DLONGINT -DNOSTDHDRS
+# if your machine puts the prototype for 'malloc()' in malloc.h rather than
+# stdlib.h, uncomment the following line:
+#
+#MALLOC = -DNEED_MALLOC_H
-################ END OF CONFIGURATION OPTIONS #################
+# if your X Window System compiled with -DX_LOCALE,
+# uncomment the following line:
+# TVL10N = -DX_LOCALE
+
+# Install directory of xv_mgcsfx.sample.
+MGCSFXDIR = $(LIBDIR)
+# Directory of default configuration file.
+MGCSFX = -DMGCSFXDIR=\"$(MGCSFXDIR)\"
+
+################ END OF CONFIGURATION OPTIONS #################
+
-CFLAGS = $(CCOPTS) $(JPEG) $(JPEGINC) $(TIFF) $(TIFFINC) $(PDS) \
- $(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \
- $(DXWM) $(MCHN)
-LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) -lm
+
+CFLAGS = $(CCOPTS) $(PNG) $(PNGINC) $(ZLIBINC) $(JPEG) $(JPEGINC) \
+ $(TIFF) $(TIFFINC) $(PDS) $(JP2K) $(JP2KINC) $(TVL10N) $(MGCSFX) \
+ $(UNIX) $(BSDTYPES) $(RAND) $(MALLOC) $(DXWM) $(MCHN) $(NODIRENT) \
+ $(VPRINTF) $(TIMERS) -DDOCDIR=\"$(DOCDIR)\" \
+ -DSYSCONFDIR=\"$(SYSCONFDIR)\" -DXVEXECPATH=\"$(LIBDIR)\"
+
+### remove -lm for BeOS:
+LIBS = $(TIFFLIB) $(JPEGLIB) $(PNGLIB) $(ZLIBLIB) $(JP2KLIB) -L/usr/X11R6/lib -lX11 -lm
+#LIBS = $(TIFFLIB) $(JPEGLIB) $(PNGLIB) $(ZLIBLIB) $(JP2KLIB) -lX11
OBJS = 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 \
@@ -196,7 +351,9 @@
xvdial.o xvgraf.o xvsunras.o xvjpeg.o xvps.o xvpopup.o xvdflt.o \
xvtiff.o xvtiffwr.o xvpds.o xvrle.o xviris.o xvgrab.o vprintf.o \
xvbrowse.o xvtext.o xvpcx.o xviff.o xvtarga.o xvxpm.o xvcut.o \
- xvxwd.o xvfits.o
+ xvxwd.o xvfits.o xvpng.o xvzx.o xvwbmp.o xvpcd.o xvhips.o \
+ xvmag.o xvpic.o xvmaki.o xvpi.o xvpic2.o xvvd.o xvmgcsfx.o \
+ xvml.o xvjp2k.o
MISC = README INSTALL CHANGELOG IDEAS
@@ -206,10 +363,12 @@
-all: $(JPEGLIB) $(TIFFLIB) xv bggen vdcomp xcmap xvpictoppm
+#all: $(JPEGLIB) $(TIFFLIB) xv bggen vdcomp xcmap xvpictoppm
+all: xv bggen vdcomp xcmap xvpictoppm
-xv: $(OBJS) $(JPEGLIB) $(TIFFLIB)
+#xv: $(OBJS) $(JPEGLIB) $(TIFFLIB)
+xv: $(OBJS)
$(CC) -o xv $(CFLAGS) $(OBJS) $(LIBS)
bggen: bggen.c
@@ -231,23 +390,47 @@
clean: xvclean
rm -f bggen vdcomp xcmap xvpictoppm
- ./cleandir $(JPEGDIR)
- rm -f $(JPEGDIR)/jconfig.h $(JPEGDIR)/Makefile
- ./cleandir $(TIFFDIR)
+# clean only local jpeg and tiff dirs, not user's or system's copies:
+ ./$(CLEANDIR) jpeg
+ rm -f jpeg/jconfig.h jpeg/Makefile
+ ./$(CLEANDIR) tiff
+# could also do some shell trickery here to attempt mkdir only if dir is
+# missing (e.g., "test -d || $(MKDIR) ")
install: all
- cp xv bggen vdcomp xcmap xvpictoppm $(BINDIR)
- cp docs/xv.man $(MANDIR)/xv.$(MANSUF)
- cp docs/bggen.man $(MANDIR)/bggen.$(MANSUF)
- cp docs/xcmap.man $(MANDIR)/xcmap.$(MANSUF)
- cp docs/xvp2p.man $(MANDIR)/xvpictoppm.$(MANSUF)
- cp docs/vdcomp.man $(MANDIR)/vdcomp.$(MANSUF)
- cp docs/xvdocs.ps* $(LIBDIR)
+ $(MKDIR) $(DESTDIR)$(BINDIR)
+ cp xv bggen vdcomp xcmap xvpictoppm $(DESTDIR)$(BINDIR)/.
+ chmod 755 $(DESTDIR)$(BINDIR)/xv $(DESTDIR)$(BINDIR)/bggen \
+ $(DESTDIR)$(BINDIR)/vdcomp $(DESTDIR)$(BINDIR)/xcmap \
+ $(DESTDIR)$(BINDIR)/xvpictoppm
+#
+ $(MKDIR) $(DESTDIR)$(MANDIR)
+ cp docs/xv.man $(DESTDIR)$(MANDIR)/xv.$(MANSUF)
+ cp docs/bggen.man $(DESTDIR)$(MANDIR)/bggen.$(MANSUF)
+ cp docs/xcmap.man $(DESTDIR)$(MANDIR)/xcmap.$(MANSUF)
+ cp docs/xvp2p.man $(DESTDIR)$(MANDIR)/xvpictoppm.$(MANSUF)
+ cp docs/vdcomp.man $(DESTDIR)$(MANDIR)/vdcomp.$(MANSUF)
+ chmod 644 $(DESTDIR)$(MANDIR)/xv.$(MANSUF) \
+ $(DESTDIR)$(MANDIR)/bggen.$(MANSUF) \
+ $(DESTDIR)$(MANDIR)/xcmap.$(MANSUF) \
+ $(DESTDIR)$(MANDIR)/xvpictoppm.$(MANSUF) \
+ $(DESTDIR)$(MANDIR)/vdcomp.$(MANSUF)
+#
+ $(MKDIR) $(DESTDIR)$(DOCDIR) # or $(DESTDIR)$(LIBDIR)
+ cp README.jumbo docs/xvdocs.pdf docs/xvdocs.ps $(DESTDIR)$(DOCDIR)/.
+ chmod 644 $(DESTDIR)$(DOCDIR)/README.jumbo \
+ $(DESTDIR)$(DOCDIR)/xvdocs.pdf $(DESTDIR)$(DOCDIR)/xvdocs.ps
+#
+ #$(MKDIR) $(DESTDIR)$(SYSCONFDIR)
+ #cp xv_mgcsfx.sample $(DESTDIR)$(SYSCONFDIR)/xv_mgcsfx
+ #chmod 644 $(DESTDIR)$(SYSCONFDIR)/xv_mgcsfx
+
tar:
+# tar only local jpeg and tiff dirs, not user's or system's copies:
tar cvf xv.tar Makefile* Imakefile *.c *.h bits \
- docs unsupt vms $(JPEGDIR) $(TIFFDIR) $(MISC)
+ docs unsupt vms jpeg tiff $(MISC)
xvtar:
tar cvf xv.tar Makefile* Imakefile *.c *.h bits
@@ -257,26 +440,28 @@
################# bitmap dependencies ####################
-xv.o: bits/icon bits/iconmask bits/runicon bits/runiconm
-xv.o: bits/cboard50 bits/gray25
+xv.o: bits/icon bits/iconmask bits/runicon bits/runiconm
+xv.o: bits/cboard50 bits/gray25
xvbrowse.o: bits/br_file bits/br_dir bits/br_exe bits/br_chr bits/br_blk
-xvbrowse.o: bits/br_sock bits/br_fifo bits/br_error bits/br_unknown
-xvbrowse.o: bits/br_cmpres bits/br_gif bits/br_pm bits/br_pbm
+xvbrowse.o: bits/br_sock bits/br_fifo bits/br_error # bits/br_unknown
+xvbrowse.o: bits/br_cmpres bits/br_bzip2 bits/br_gif bits/br_pm bits/br_pbm
xvbrowse.o: bits/br_sunras bits/br_bmp bits/br_utah bits/br_iris
-xvbrowse.o: bits/br_pcx bits/br_jfif bits/br_tiff bits/br_pds
-xvbrowse.o: bits/br_ps bits/br_iff bits/br_targa bits/br_xpm
+xvbrowse.o: bits/br_pcx bits/br_jfif bits/br_tiff bits/br_pds bits/br_pcd
+xvbrowse.o: bits/br_ps bits/br_iff bits/br_targa bits/br_xpm bits/br_xwd
+xvbrowse.o: bits/br_fits bits/br_png bits/br_zx bits/br_mag bits/br_maki
+xvbrowse.o: bits/br_pic bits/br_pi bits/br_pic2 bits/br_mgcsfx
+xvbrowse.o: bits/br_jp2 bits/br_jpc
xvbrowse.o: bits/br_trash bits/fcurs bits/fccurs bits/fdcurs bits/fcursm
-xvbrowse.o: bits/br_xwd
xvbutt.o: bits/cboard50 bits/rb_frame bits/rb_frame1 bits/rb_top
xvbutt.o: bits/rb_bot bits/rb_dtop bits/rb_dbot bits/rb_body
xvbutt.o: bits/rb_dot bits/cb_check bits/mb_chk
xvctrl.o: bits/gray25 bits/gray50 bits/i_fifo bits/i_chr bits/i_dir
-xvctrl.o: bits/i_blk bits/i_lnk bits/i_sock bits/i_exe bits/i_reg
+xvctrl.o: bits/i_blk bits/i_lnk bits/i_sock bits/i_exe bits/i_reg
xvctrl.o: bits/h_rotl bits/h_rotr bits/fliph bits/flipv bits/p10
-xvctrl.o: bits/m10 bits/cut bits/copy bits/paste bits/clear
+xvctrl.o: bits/m10 bits/cut bits/copy bits/paste bits/clear
xvctrl.o: bits/uicon bits/oicon1 bits/oicon2 bits/icon
xvctrl.o: bits/padimg bits/annot
@@ -285,13 +470,13 @@
xvdflt.o: bits/logo_top bits/logo_bot bits/logo_out bits/xv_jhb
xvdflt.o: bits/xv_cpyrt bits/xv_rev bits/xv_ver
xvdflt.o: bits/xf_left bits/xf_right bits/font5x9.h
-xvdflt.o: xvdflt.h
+xvdflt.o: xvdflt.h
xvdial.o: bits/dial_cw1 bits/dial_ccw1 bits/dial_cw2 bits/dial_ccw2
xvdir.o: bits/d_load bits/d_save
-xvevent.o: bits/dropper bits/dropperm bits/pen bits/penm
+xvevent.o: bits/dropper bits/dropperm bits/pen bits/penm
xvevent.o: bits/blur bits/blurm
xvgam.o: bits/h_rotl bits/h_rotr bits/h_flip bits/h_sinc bits/h_sdec
diff -ru xv-3.10a/bggen.c xv-3.10a-enhancements/bggen.c
--- xv-3.10a/bggen.c 1994-12-22 14:34:41.000000000 -0800
+++ xv-3.10a-enhancements/bggen.c 2005-04-17 14:04:22.000000000 -0700
@@ -18,6 +18,11 @@
#include
#include
+#ifdef __STDC__
+# include /* atoi() */
+# include /* isdigit() */
+#endif
+
#ifndef M_PI
# define M_PI 3.1415926535897932385
#endif
@@ -29,7 +34,7 @@
#define MAXCOLS 128
/* some VMS thing... */
-#ifdef vax11c
+#if defined(vax11c) || (defined(__sony_news) && (defined(bsd43) || defined(__bsd43) || defined(SYSTYPE_BSD) || defined(__SYSTYPE_BSD)))
#include
#endif
@@ -46,8 +51,8 @@
typedef unsigned char byte;
-struct color { int r,g,b;
- int y;
+struct color { int r,g,b;
+ int y;
} colors[MAXCOLS], *cur, *nex;
int numcols;
@@ -62,7 +67,7 @@
double computeDist PARM((int, int, int, int, int));
void writePPM PARM((byte *, int, int, int));
-
+
/*************************************/
int main(argc,argv)
int argc;
@@ -80,18 +85,18 @@
char *geom = NULL;
char *rptgeom = NULL;
-
+
#ifdef VMS
getredirection(&argc, &argv);
#endif
-
+
for (i=1; i8) usage();
-
-
+
+
if (geom) {
int x,y; unsigned int w,h;
i = XParseGeometry(geom, &x, &y, &w, &h);
if (i&WidthValue) { wset++; wide = (int) w; }
if (i&HeightValue) { hset++; high = (int) h; }
}
-
-
+
+
/* attempt to connect to X server and get screen dimensions */
if (theDisp) {
i = DefaultScreen(theDisp);
if (!wset) wide = DisplayWidth(theDisp, i);
if (!hset) high = DisplayHeight(theDisp, i);
}
-
-
+
+
/* normalize 'rot' */
while (rot< 0) rot += 360;
while (rot>=360) rot -= 360;
-
-
+
+
rptwide = wide; rpthigh = high;
if (rptgeom) {
int x,y; unsigned int w,h;
i = XParseGeometry(rptgeom, &x, &y, &w, &h);
if (i&WidthValue) rptwide = (int) w;
if (i&HeightValue) rpthigh = (int) h;
-
+
RANGE(rptwide, 1, wide);
RANGE(rpthigh, 1, high);
}
-
-
-
+
+
+
rpic24 = (byte *) malloc(rptwide * rpthigh * 3 * sizeof(byte));
- if (rptwide != wide || rpthigh != high)
+ if (rptwide != wide || rpthigh != high)
pic24 = (byte *) malloc(wide * high * 3 * sizeof(byte));
else pic24 = rpic24;
@@ -229,7 +234,7 @@
exit(1);
}
for (i=0, pp=pic24; iy < i) { cur++; nex++; }
-
+
r = cur->r + ((nex->r - cur->r) * (i - cur->y)) / (nex->y - cur->y);
g = cur->g + ((nex->g - cur->g) * (i - cur->y)) / (nex->y - cur->y);
b = cur->b + ((nex->b - cur->b) * (i - cur->y)) / (nex->y - cur->y);
-
+
r = r & bmask[bits-1];
g = g & bmask[bits-1];
b = b & bmask[bits-1];
-
+
for (j=0; j1.0) rat = 1.0;
-
+
cval = rat * nc1;
bc = floor(cval);
crat = cval - bc;
-
+
if (bc < nc1) {
r = colors[bc].r + crat * (colors[bc+1].r - colors[bc].r);
g = colors[bc].g + crat * (colors[bc+1].g - colors[bc].g);
@@ -383,7 +388,7 @@
g = colors[nc1].g;
b = colors[nc1].b;
}
-
+
*pp++ = (byte) r; *pp++ = (byte) g; *pp++ = (byte) b;
}
}
@@ -395,9 +400,9 @@
int x,y,cx,cy,rot;
{
/* rot has to be in range 0-359 */
-
- double x1, y1, x2, y2, x3, y3, d, d1, b, theta;
-
+
+ double x1, y1, x2, y2, x3, y3, d, d1, b;
+
if (rot == 0) return (double) (y - cy);
if (rot == 180) return (double) (cy - y);
@@ -407,7 +412,7 @@
/* x2,y2 = vertical projection onto a || line that runs through cx,cy */
x2 = x1;
y2 = cy - (cx-x2)*tant1;
-
+
d1 = y2 - y1; /* vertical distance between lines */
b = d1 * cost1;
@@ -435,11 +440,11 @@
int w,h,doascii;
{
/* dumps a pic24 in PPM format to stdout */
-
+
int x,y;
-
+
printf("P%s %d %d 255\n", (doascii) ? "3" : "6", w, h);
-
+
for (y=0; y, which I don't know all
+ machine has or not.
+ */
# undef UNCOMPRESS
-# define UNCOMPRESS "/usr/bin/uncompress"
+# define UNCOMPRESS "uncompress"
#endif
#if defined(sgi)
@@ -70,18 +94,18 @@
* PostScript file input support:
*
* if you have the 'ghostscript' package installed (version 2.6 or later),
- * XV can use it to read and display PostScript files. To do so,
+ * XV can use it to read and display PostScript files. To do so,
* uncomment the '#define GS_PATH' line, below. You probably will not
* need to modify the GS_LIB or GS_DEV lines, but if you do modify them,
* be sure to uncomment them, as well.
*
- * the ghostscript package can be acquired via anonymous ftp on
+ * the ghostscript package can be acquired via anonymous ftp on
* prep.ai.mit.edu, in the 'pub/gnu' directory
*
- * GS_PATH specifies the complete path to your gs executable.
+ * GS_PATH specifies the complete path to your gs executable.
*
- * GS_LIB should be set if there's some other gs libs that should be
- * searched, but aren't by default. (In which case you should probably
+ * GS_LIB should be set if there's some other gs libs that should be
+ * searched, but aren't by default. (In which case you should probably
* just fix your 'gs' so it looks in the right places without being told...)
*
* GS_DEV is the file format that ghostscript will convert PS into. It
@@ -89,6 +113,7 @@
*/
/* #define GS_PATH "/usr/local/bin/gs" */
+#define GS_PATH "gs"
/* #define GS_LIB "." */
/* #define GS_DEV "ppmraw" */
@@ -97,10 +122,10 @@
* 'old-style' XV logo image:
*
* XV now has a nifty, new logo image. The downside is that it increases
- * the size of the 'xv' executable by 250K or so, and it's possible that
- * your compiler may choke while compiling 'xvdflt.c'. If you're compiler
+ * the size of the 'xv' executable by 250K or so, and it's possible that
+ * your compiler may choke while compiling 'xvdflt.c'. If your compiler
* can't handle it, or you're running Linux on a system with minimal memory,
- * change 'undef' to 'define' in the following line
+ * change 'undef' to 'define' in the following line:
*/
#undef USEOLDPIC
@@ -108,8 +133,8 @@
/***************************************************************************
* Backing Store:
- *
- * XV can request that 'Backing Store' may be turned on ('WhenMapped') for
+ *
+ * XV can request that 'Backing Store' may be turned on ('WhenMapped') for
* several of its windows, which may help performance over a slow network
* connection. However, it has been known to behave strangely (or crash)
* on some X servers, so it's left here as an option. If you run into trouble
@@ -119,3 +144,218 @@
#define BACKING_STORE
+
+/***************************************************************************
+ * TIFF YCbCr-to-RGB conversion:
+ *
+ * Newer versions of libtiff can be compiled with libjpeg for JPEG-in-TIFF
+ * support, and according to Scott Marovich, "the IJG JPEG Library...sometimes
+ * seems to produce slightly more accurate results" (one known example: the
+ * 'quad-jpeg.tif' test image). In addition, libtiff can be compiled with
+ * "old JPEG" support, although its configure script will not enable that by
+ * default. Change 'define' and 'undef' in the following lines as you wish,
+ * but note that defining LIBTIFF_HAS_OLDJPEG_SUPPORT when such is _not_ the
+ * case will result in crashes when encountering old-JPEG TIFFs:
+ */
+
+#define USE_LIBJPEG_FOR_TIFF_YCbCr_RGB_CONVERSION
+#undef LIBTIFF_HAS_OLDJPEG_SUPPORT
+
+
+/***************************************************************************
+ * PhotoCD/MAG/PIC/MAKI/Pi/PIC2/HIPS format Support:
+ *
+ * if, for whatever reason--say, security concerns--you don't want to
+ * include support for one or more of the PhotoCD, MAG/MAKI/Pi/PIC/PIC2
+ * (Japanese), or HIPS (astronomical) image formats, change the relevant
+ * 'define' to 'undef' in the following lines. Conversely, if you *do*
+ * want them, change 'undef' to 'define' as appropriate.
+ */
+
+#define HAVE_PCD /* believed to be reasonably safe */
+
+#undef HAVE_MAG /* probable security issues */
+#undef HAVE_MAKI /* probable security issues */
+#undef HAVE_PI /* probable security issues */
+#undef HAVE_PIC /* probable security issues */
+#undef HAVE_PIC2 /* probable security issues */
+
+#undef HAVE_HIPS /* probable security issues */
+
+
+/***************************************************************************
+ * MacBinary file support:
+ *
+ * if you want XV to be able to handle ``MacBinary'' files (which have
+ * 128 byte info file header at the head), change 'undef' to 'define'
+ * in the following line.
+ */
+
+#undef MACBINARY
+
+
+/***************************************************************************
+ * Auto Expand support:
+ *
+ * if you want to extract archived file automatically and regard it as
+ * a directory, change 'undef' to 'define' in the AUTO_EXPAND line.
+ *
+ * Virtual Thumbdir support:
+ *
+ * if you want Virtual directory based Thumbdir(It means that XV
+ * doesn't forget builded Icons still be quited even if the directory
+ * is read-only), change 'undef' to 'define' the VIRTUAL_TD line.
+ */
+
+#undef AUTO_EXPAND
+#undef VIRTUAL_TD
+
+#if defined(VIRTUAL_TD) && !defined(AUTO_EXPAND)
+# undef VIRTUAL_TD
+#endif
+
+
+/***************************************************************************
+ * Adjust the aspect ratio of Icons:
+ *
+ * if you want to adjust the aspect ratio of the icons in Visual
+ * Schnauzer, change 'undef' to 'define' in the following line.
+ */
+
+#undef VS_ADJUST
+
+
+/***************************************************************************
+ * Restore original colormap:
+ *
+ * if you want to restore original colormap when icons in Visual
+ * Shunauzer is double-clicked, change 'undef' to 'define' in the
+ * following line.
+ */
+
+#undef VS_RESCMAP
+
+
+/***************************************************************************
+ * TextViewer l10n support:
+ *
+ * if you want XV to show the text in Japanese on TextViewer, change
+ * 'undef' to 'define' in the following line.
+ */
+
+#undef TV_L10N
+
+#ifdef TV_L10N
+/*
+ * if you want to change the default code-set used in case that XV
+ * fails to select correct code-set, uncomment the '#define
+ * LOCALE_DEFAULT' line and change the 'LOCALE_DEFAULT' definition
+ * appropriately.
+ * (0:ASCII, 1:EUC-j, 2:JIS, 3:MS Kanji) */
+
+/* # define LOCALE_DEFAULT 0 */
+
+/*
+ * Uncomment and edit the following lines, if your X Window System was
+ * not compiled with -DX_LOCALE and you failed to display the Japanese
+ * text in TextViewer. You don't have to write locale name of JIS code-set
+ * and Microsoft code-set, if your system doesn't support those code-sets.
+ */
+
+/*
+# define LOCALE_NAME_EUC "ja_JP.EUC"
+# define LOCALE_NAME_JIS "ja_JP.JIS"
+# define LOCALE_NAME_MSCODE "ja_JP.SJIS"
+*/
+
+/*
+ * if your system doesn't have the Japanese fonts in the sizes,
+ * Uncomment and edit the following font size entries.
+ */
+
+/* # define TV_FONTSIZE 14,16,24 */
+
+/*
+ * If you need, uncomment and modify the following font name.
+ */
+
+/* # define TV_FONTSET "-*-fixed-medium-r-normal--%d-*" */
+#endif /* TV_L10N */
+
+
+/***************************************************************************
+ * User definable filter support:
+ *
+ * Use the filters as input and output method for load and save unsupported
+ * image format file. The filter command is recognized by definition of
+ * magic number or suffix in "~/.xv_mgcsfx" .
+ * To enable this feature, change 'undef' to 'define' in the following line.
+ */
+#undef HAVE_MGCSFX
+
+#ifdef HAVE_MGCSFX
+/*
+ * Support symbol 'auto' as in startup file. This type
+ * cannot use pipe as input; it writes to a temporary file and recognizes
+ * the actual filetype by XV processing.
+ */
+# define HAVE_MGCSFX_AUTO
+
+/*
+ * The startup file of definition for MgcSfx. 'MGCSFX_SITE_RC' is read
+ * first and '~/MGCSFX_RC' is second. So same definitions in both files
+ * are overridden by '~/MGCSFX_RC'
+ * To define startup file, see the sample of startup file 'xv_mgcsfx.sample'.
+ */
+# define MGCSFX_SITE_RC "xv_mgcsfx"
+# define MGCSFX_RC ".xv_mgcsfx"
+
+/*
+ * If you want startup file to pass preprocessor in reading time, then
+ * change 'undef' to 'define' in the following line.
+ *
+ * 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
+
+# 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 "cc -E" */
+
+# endif /* USE_MGCSFX_PREPROCESSOR */
+
+/*
+ * Default string of command. If input command is required for undefined file,
+ * dialog is popuped with 'MGCSFX_DEFAULT_INPUT_COMMAND'. And, if output
+ * command is required in save dialog of MgcSfx, dialog is popuped with
+ * 'MGCSFX_DEFAULT_OUTPUT_COMMAND'.
+ *
+ * WARNING : Now, supported only 'PNM' image format, when command input is
+ * required. You should define filter which use 'PNM' image format
+ * as input or output.
+ */
+# define MGCSFX_DEFAULT_INPUT_COMMAND "tifftopnm"
+# define MGCSFX_DEFAULT_OUTPUT_COMMAND "pnmtotiff"
+
+#endif /* HAVE_MGCSFX */
+
+
+/***************************************************************************
+ * Multi-Lingual TextViewer
+ *
+ * if you want XV to show the text in multi-lingual on TextViewer, change
+ * 'undef' to 'define' in the following line.
+ */
+
+#undef TV_MULTILINGUAL
+
+#define TV_DEFAULT_CODESET TV_EUC_JAPAN
+
+#ifdef TV_MULTILINGUAL
+# undef TV_L10N
+#endif
diff -ru xv-3.10a/copyright.h xv-3.10a-enhancements/copyright.h
--- xv-3.10a/copyright.h 1994-12-22 14:34:56.000000000 -0800
+++ xv-3.10a-enhancements/copyright.h 2007-05-20 21:35:34.000000000 -0700
@@ -1,11 +1,11 @@
/* Copyright Notice
* ================
* Copyright 1989, 1994 by John Bradley
- *
- * Permission to copy and distribute XV in its entirety, for non-commercial
- * purposes, is hereby granted without fee, provided that this license
+ *
+ * Permission to copy and distribute XV in its entirety, for non-commercial
+ * purposes, is hereby granted without fee, provided that this license
* information and copyright notice appear unmodified in all copies.
- *
+ *
* Note that distributing XV 'bundled' in with any product is considered
* to be a 'commercial purpose'.
*
@@ -13,16 +13,16 @@
* and/or configured to be in their 'unregistered copy' mode, so that it
* is made obvious to the user that XV is shareware, and that they should
* consider donating, or at least reading this License Info.
- *
+ *
* The software may be modified for your own purposes, but modified
* versions may not be distributed without prior consent of the author.
- *
+ *
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the author be held liable for any damages
* arising from the use of this software.
- *
+ *
* If you would like to do something with XV that this copyright
- * prohibits (such as distributing it with a commercial product,
+ * prohibits (such as distributing it with a commercial product,
* using portions of the source in some other program, etc.), please
* contact the author (preferably via email). Arrangements can
* probably be worked out.
@@ -34,13 +34,13 @@
* larger donations are quite welcome. Folks who donate $25 or more
* can receive a Real Nice bound copy of the XV manual for no extra
* charge.
- *
+ *
* Commercial, government, and institutional users must register their
* copies of XV, for the price of $25 per workstation/X terminal or per
* XV user, whichever is less. Note that it does NOT say 'simultaneous user',
- * but rather, the total number of people who use XV on any sort of
- * recurring basis. Site licenses are available (and recommended) for those
- * who wish to run XV on a large (>10) number of machines.
+ * but rather, the total number of people who use XV on any sort of
+ * recurring basis. Site licenses are available (and recommended) for those
+ * who wish to run XV on a large (>10) number of machines.
* Contact the author for more details.
*
* The author may be contacted via:
@@ -56,3 +56,51 @@
* The author may not be contacted by (voice) phone. Please don't try.
*
*/
+
+/*
+ * Portions copyright 2000-2007 by Greg Roelofs and contributors:
+ *
+ * Andrey A. Chernov [ache]
+ * (http://cvsweb.freebsd.org/ports/graphics/xv/files/patch-ab)
+ * Andreas Dilger (adilger clusterfs.com)
+ * Alexander Lehmann (lehmann usa.net)
+ * Alexey Spiridonov (http://www-math.mit.edu/~lesha/)
+ * Anthony Thyssen (http://www.cit.gu.edu.au/~anthony/)
+ * Bruno Rohee (http://bruno.rohee.com/)
+ * David A. Clunie (http://www.dclunie.com/xv-pcd.html)
+ * Erling A. Jacobsen (linuxcub email.dk)
+ * Egmont Koblinger (egmont users.sourceforge.net)
+ * Fabian Greffrath (fabian debian-unofficial.org)
+ * Greg Roelofs (http://pobox.com/~newt/greg_contact.html)
+ * Guido Vollbeding (http://sylvana.net/guido/)
+ * IKEMOTO Masahiro (ikeyan airlab.cs.ritsumei.ac.jp)
+ * John Cooper (john.cooper third-harmonic.com)
+ * John C. Elliott (http://www.seasip.demon.co.uk/ZX/zxdload.html)
+ * John D. Baker (http://mylinuxisp.com/~jdbaker/)
+ * Jörgen Grahn (jgrahn algonet.se)
+ * John H. Bradley, of course (http://www.trilon.com/xv/)
+ * Jean-Pierre Demailly (http://www-fourier.ujf-grenoble.fr/~demailly/)
+ * John Rochester (http://www.freebsd.org/cgi/query-pr.cgi?pr=2920)
+ * (also http://cvsweb.freebsd.org/ports/graphics/xv/files/patch-af, -ag)
+ * James Roberts Kirkpatrick (uwyo.edu)
+ * Joe Zbiciak (http://spatula-city.org/~im14u2c/)
+ * Kyoichiro Suda (http://www.coara.or.jp/~sudakyo/XV_jp.html)
+ * Landon Curt "chongo" Noll (http://www.isthe.com/chongo/)
+ * Larry Jones (lawrence.jones ugs.com)
+ * Peter Jordan (http://www.ibiblio.org/pub/Linux/apps/graphics/viewers/X/)
+ * Pawel S. Veselov (http://manticore.2y.net/wbmp.html)
+ * Ross Combs (rocombs cs.nmsu.edu)
+ * Robin Humble (http://www.cita.utoronto.ca/~rjh/)
+ * Sean Borman (http://www.nd.edu/~sborman/software/xvwheelmouse.html)
+ * TenThumbs (tenthumbs cybernex.net)
+ * Scott B. Marovich (formerly marovich hpl.hp.com)
+ * Tim Adye (http://hepwww.rl.ac.uk/Adye/xv-psnewstyle.html)
+ * Tim Ramsey (tar pobox.com)
+ * Tetsuya INOUE (tin329 chino.it.okayama-u.ac.jp)
+ * Tavis Ormandy (taviso gentoo.org)
+ * Werner Fink (http://www.suse.de/~werner/)
+ *
+ * Other credits are as listed on the XV Downloads page or in the respective
+ * patches (e.g., the jp-extension patches or within the PNG patch).
+ *
+ */
diff -ru xv-3.10a/docs/bggen.man xv-3.10a-enhancements/docs/bggen.man
--- xv-3.10a/docs/bggen.man 1994-12-22 14:35:22.000000000 -0800
+++ xv-3.10a-enhancements/docs/bggen.man 2007-04-22 17:32:11.000000000 -0700
@@ -1,4 +1,4 @@
-.TH bggen l
+.TH bggen 1
.SH NAME
bggen \- generates colored backgrounds on X11 displays
.SH SYNTAX
diff -ru xv-3.10a/docs/xcmap.man xv-3.10a-enhancements/docs/xcmap.man
--- xv-3.10a/docs/xcmap.man 1994-12-22 14:35:23.000000000 -0800
+++ xv-3.10a-enhancements/docs/xcmap.man 2007-04-22 17:32:31.000000000 -0700
@@ -1,4 +1,4 @@
-.TH xcmap 1X
+.TH xcmap 1
.SH NAME
xcmap \- displays the default colormap on X11 displays
.SH SYNTAX
diff -ru xv-3.10a/docs/xv.man xv-3.10a-enhancements/docs/xv.man
--- xv-3.10a/docs/xv.man 1994-12-22 14:35:22.000000000 -0800
+++ xv-3.10a-enhancements/docs/xv.man 2007-04-22 17:32:53.000000000 -0700
@@ -1,4 +1,4 @@
-.TH XV l "2 December 1994" "Rev. 3.10"
+.TH XV 1 "22 April 2007" "Rev. 3.10a-jumboFix+Enh"
.SH NAME
\fBxv\fP \- interactive image display for the X Window System
.SH SYNTAX
@@ -8,14 +8,17 @@
.SH DESCRIPTION
The
.I xv
-program displays images in the GIF, JPEG, TIFF,
-PBM, PGM, PPM, X11 bitmap, Utah Raster Toolkit RLE, PDS/VICAR, Sun Rasterfile,
-BMP, PCX, IRIS RGB, XPM, Targa, XWD, possibly PostScript, and PM formats on
-workstations and terminals running the X Window System, Version 11.
+program displays images on workstations and terminals running the X Window
+System, Version 11. Supported image formats include
+PBM, PGM, PPM, X11 bitmap, XWD, XPM, Utah Raster Toolkit RLE, PDS/VICAR,
+FITS, Sun Rasterfile, GIF, PCX, Targa/TGA, BMP, WBMP, IRIS RGB, Spectrum
+SCREEN$, PM, and optionally PNG, JPEG, JPEG 2000, JP2, TIFF, PostScript,
+PDF, G3 fax, MAG, PIC, MAKI (640x400), PI, and PIC2.
.LP
-The documentation for XV is now distributed
+Aside from the usage screen (available by typing 'xv -help' at the command
+line), documentation for XV is now distributed
.I only
-as a PostScript file, as it has gotten enormous,
+as a PostScript (or PDF) file, as it has gotten enormous
and is no longer very well suited to the 'man' page format.
Print a copy of the (100-ish page) manual found in
.IR docs/xvdocs.ps .
@@ -26,9 +29,14 @@
If you don't
.I have
the PostScript file, it is part of the standard XV distribution, the
-latest version of which can be obtained via anonymous ftp from
+latest version of which can be obtained from
+.IR http://www.trilon.com/xv/
+or via anonymous ftp from
.IR ftp.cis.upenn.edu
-in the directory pub/xv
+in the directory pub/xv .
+.PP
+This version has been patched with the XV Jumbo Patches, available from
+.IR http://pobox.com/~newt/greg_xv.html .
.PP
.SH AUTHOR
-John Bradley
+John Bradley (and many contributors)
diff -ru xv-3.10a/docs/xvp2p.man xv-3.10a-enhancements/docs/xvp2p.man
--- xv-3.10a/docs/xvp2p.man 1994-12-22 14:35:25.000000000 -0800
+++ xv-3.10a-enhancements/docs/xvp2p.man 2007-04-22 17:33:23.000000000 -0700
@@ -1,4 +1,4 @@
-.TH xvpictoppm 1X
+.TH xvpictoppm 1
.SH NAME
xvpictoppm \- converts XV 'thumbnail' files to standard PPM format
.SH SYNTAX
diff -ru xv-3.10a/tiff/Makefile xv-3.10a-enhancements/tiff/Makefile
--- xv-3.10a/tiff/Makefile 1994-12-22 14:35:12.000000000 -0800
+++ xv-3.10a-enhancements/tiff/Makefile 2005-04-17 14:45:28.000000000 -0700
@@ -30,13 +30,15 @@
# OF THIS SOFTWARE.
#
-AR= ar
-RANLIB= ./RANLIB.csh
+AR= ar
+CHMOD= chmod
+#RANLIB= ./RANLIB.csh
+RANLIB= ./RANLIB.sh
IPATH= -I.
COPTS= -O
-CFLAGS= ${COPTS} ${IPATH}
+CFLAGS= ${COPTS} ${IPATH} -D_BSD_SOURCE
INCS= tiff.h tiffio.h
@@ -60,6 +62,7 @@
${ALL}: ${OBJS}
${AR} rc libtiff.a $?
+ ${CHMOD} +x ${RANLIB}
${RANLIB} libtiff.a
${OBJS}: tiffio.h tiff.h tiffcomp.h tiffiop.h tiffconf.h
diff -ru xv-3.10a/tiff/Makefile.std xv-3.10a-enhancements/tiff/Makefile.std
--- xv-3.10a/tiff/Makefile.std 1994-12-22 14:35:16.000000000 -0800
+++ xv-3.10a-enhancements/tiff/Makefile.std 2004-05-16 18:50:39.000000000 -0700
@@ -30,8 +30,10 @@
# OF THIS SOFTWARE.
#
-AR= /bin/ar
-RANLIB= ./RANLIB.csh
+AR= /bin/ar
+CHMOD= chmod
+#RANLIB= ./RANLIB.csh
+RANLIB= ./RANLIB.sh
IPATH= -I.
@@ -60,6 +62,7 @@
${ALL}: ${OBJS}
${AR} rc libtiff.a $?
+ ${CHMOD} +x ${RANLIB}
${RANLIB} libtiff.a
${OBJS}: tiffio.h tiff.h tiffcomp.h tiffiop.h tiffconf.h
diff -ru xv-3.10a/vdcomp.c xv-3.10a-enhancements/vdcomp.c
--- xv-3.10a/vdcomp.c 1994-12-22 14:34:47.000000000 -0800
+++ xv-3.10a-enhancements/vdcomp.c 2007-04-15 21:09:55.000000000 -0700
@@ -5,8 +5,8 @@
/* Decompresses images using Kris Becker's subroutine DECOMP.C */
/* which is included in this program in a shortened version. */
/* */
-/* Reads a variable length compressed PDS image and outputs a */
-/* fixed length uncompressed image file in PDS format with */
+/* Reads a variable-length compressed PDS image and outputs a */
+/* fixed-length uncompressed image file in PDS format with */
/* labels, image histogram, engineering table, line header table */
/* and an image with PDS, FITS, VICAR or no labels. If used on */
/* a non-byte-swapped machine the image histogram is un-swapped. */
@@ -96,40 +96,54 @@
#include
#include
-/* include a malloc.h, of some sort... */
-#ifndef VMS /* VMS hates multi-line '#if's */
-# if !defined(ibm032) && \
- !defined(__convex__) && \
- !(defined(vax) && !defined(ultrix)) && \
- !defined(mips) && \
- !defined(apollo) && \
- !defined(pyr) && \
- !defined(__UMAXV__) && \
- !defined(bsd43) && \
- !defined(aux) && \
- !defined(__bsdi__) && \
- !defined(sequent)
-
-# if defined(hp300) || defined(hp800) || defined(NeXT)
-# include /* it's in 'sys' on HPs and NeXT */
-# else
-# include
-# endif
-# endif
+/* include a malloc.h of some sort (if needed...most systems use stdlib.h) */
+#ifndef VMS /* VMS hates multi-line "#if"s */
+ /*
+ * I want to use BSD macro for checking if this OS is *BSD or not,
+ * but the macro is defined in , which I don't know all
+ * machine has or not.
+ */
+# if !defined(ibm032) && \
+ !defined(__convex__) && \
+ !(defined(vax) && !defined(ultrix)) && \
+ !defined(mips) && \
+ !defined(apollo) && \
+ !defined(pyr) && \
+ !defined(sequent) && \
+ !defined(__UMAXV__) && \
+ !defined(aux) && \
+ !defined(bsd43) && \
+ !defined(__bsd43) && \
+ !defined(__bsdi__) && \
+ !defined(__386BSD__) && \
+ !defined(__FreeBSD__) && \
+ !defined(__OpenBSD__) && \
+ !defined(__NetBSD__) && \
+ !defined(__DARWIN__)
+
+# if defined(hp300) || defined(hp800) || defined(NeXT)
+# include /* it's in "sys" on HPs and NeXT */
+# else
+# include /* FIXME: should explicitly list systems that NEED this, not everyone that doesn't */
+# endif
+
+# endif /* !most modern systems */
#endif /* !VMS */
#include
-#define TRUE 1
-#define FALSE 0
+#define TRUE 1
+#define FALSE 0
+
+#define NAMELEN 1024 /* inname and outname sizes */
- /* pc i/o defines */
-#define O_BINARY 0x8000 /* file mode is binary */
+ /* PC I/O defines */
+#define O_BINARY 0x8000 /* file mode is binary */
- /* vax i/o defines */
-#define RECORD_TYPE "rfm=fix" /* VAX fixed length output */
-#define CTX "ctx=bin" /* no translation of \n */
+ /* VAX/VMS I/O defines */
+#define RECORD_TYPE "rfm=fix" /* VAX/VMS fixed-length output */
+#define CTX "ctx=bin" /* no translation of \n */
#define FOP "fop=cif,sup" /* file processing ops */
typedef struct leaf { struct leaf *right;
@@ -142,9 +156,9 @@
once the tree is created by the accompanying routine huff_tree.
**************************************************************************/
- NODE *tree;
+static NODE *tree;
-/* subroutine definitions */
+/* subroutine definitions */
#undef PARM
#ifdef __STDC__
@@ -172,11 +186,11 @@
void free_tree PARM((int *));
int free_node PARM((NODE *, int));
-/* global variables */
+/* global variables */
int infile;
FILE *outfile;
-char inname[1024],outname[1024];
+char inname[NAMELEN], outname[NAMELEN];
int output_format;
int record_bytes, max_lines;
int line_samples, fits_pad;
@@ -185,8 +199,8 @@
/*************************************************/
int main(argc,argv)
- int argc;
- char **argv;
+ int argc;
+ char **argv;
{
unsigned char ibuf[2048],obuf[2048];
unsigned char blank=32;
@@ -200,12 +214,12 @@
/* */
/*********************************************************************/
- strcpy(inname," ");
+ strcpy(inname," ");
strcpy(outname," ");
output_format = 0;
if (argc == 1); /* prompt user for parameters */
- else if (argc == 2 && (strncmp(argv[1],"help",(size_t) 4) == 0 ||
+ else if (argc == 2 && (strncmp(argv[1],"help",(size_t) 4) == 0 ||
strncmp(argv[1],"HELP",(size_t) 4) == 0 ||
strncmp(argv[1],"?", (size_t) 1) == 0)) {
fprintf(stderr,
@@ -214,18 +228,22 @@
fprintf(stderr," infile - name of compressed image file. \n");
fprintf(stderr," outfile - name of uncompressed output file.\n");
fprintf(stderr," output format - selected from the following list:\n");
- fprintf(stderr,"\n");
- fprintf(stderr," 1 SFDU/PDS format [DEFAULT].\n");
- fprintf(stderr," 2 FITS format. \n");
- fprintf(stderr," 3 VICAR format. \n");
- fprintf(stderr," 4 Unlabelled binary array. \n\n");
+ fprintf(stderr,"\n");
+ fprintf(stderr," 1 SFDU/PDS format [DEFAULT].\n");
+ fprintf(stderr," 2 FITS format. \n");
+ fprintf(stderr," 3 VICAR format. \n");
+ fprintf(stderr," 4 Unlabelled binary array. \n\n");
exit(1);
- }
+ }
else {
- strcpy(inname,argv[1]);
- if (argc >= 3) strcpy(outname,argv[2]);
+ strncpy(inname, argv[1], sizeof(inname)-1);
+ inname[sizeof(inname)-1] = '\0';
+ if (argc >= 3) {
+ strncpy(outname, argv[2], sizeof(outname)-1);
+ outname[sizeof(outname)-1] = '\0';
+ }
if (argc == 3) output_format = 1;
- if (argc == 4) sscanf(argv[3],"%d",&output_format);
+ if (argc == 4) sscanf(argv[3],"%d",&output_format);
}
host = check_host();
@@ -244,13 +262,13 @@
case 4: no_labels(host); break;
}
- if (record_bytes == 836) { /* set up values for image sizes */
+ if (record_bytes == 836) { /* set up values for image sizes */
max_lines = 800;
fits_pad = 2240;
line_samples = 800;
}
else {
- max_lines = 1056;
+ max_lines = 1056;
fits_pad = 1536;
line_samples = 1204;
}
@@ -394,12 +412,12 @@
if (record_bytes == 1204) /* do checksum for viking */
for (i=0; i 0 && line < max_lines);
- if (record_bytes == 1204 && (outfile != stdout))
+ if (record_bytes == 1204 && (outfile != stdout))
/* print checksum for viking */
fprintf(stderr,"\n Image label checksum = %d computed checksum = %d\n",
label_checksum,checksum);
@@ -425,33 +443,36 @@
/*********************************************************************/
int get_files(host)
-int host;
+ int host;
{
- short shortint;
typedef long off_t;
+ short shortint;
+ char *s;
if (inname[0] == ' ') {
printf("\nEnter name of file to be decompressed: ");
- gets (inname);
+ fgets(inname, sizeof(inname), stdin);
+ if ((s = strchr(inname, '\n')) != NULL)
+ *s = '\0';
}
- if (host == 1 | host == 2) {
- if ((infile = open(inname,O_RDONLY | O_BINARY)) <= 0) {
- fprintf(stderr,"\ncan't open input file: %s\n",inname);
+ if (host == 1 || host == 2) {
+ if ((infile = open(inname, O_RDONLY | O_BINARY)) <= 0) {
+ fprintf(stderr,"\ncan't open input file: %s\n", inname);
exit(1);
}
}
- else if (host == 3 | host == 5) {
- if ((infile = open(inname,O_RDONLY)) <= 0) {
- fprintf(stderr,"\ncan't open input file: %s\n",inname);
+ else if (host == 3 || host == 5) {
+ if ((infile = open(inname, O_RDONLY)) <= 0) {
+ fprintf(stderr,"\ncan't open input file: %s\n", inname);
exit(1);
}
/****************************************************************/
- /* If we are on a vax see if the file is in var length format. */
- /* This logic is in here in case the vax file has been stored */
+ /* If we are on a VAX see if the file is in var length format. */
+ /* This logic is in here in case the VAX file has been stored */
/* in fixed or undefined format. This might be necessary since */
- /* vax variable length files can't be moved to other computer */
+ /* VAX variable-length files can't be moved to other computer */
/* systems with standard comm programs (kermit, for example). */
/****************************************************************/
@@ -459,9 +480,9 @@
read(infile,&shortint, (size_t) 2);
if (shortint > 0 && shortint < 80) {
host = 4; /* change host to 4 */
- printf("This is not a VAX variable length file.");
+ printf("This is not a VAX variable-length file.");
}
- else printf("This is a VAX variable length file.");
+ else printf("This is a VAX variable-length file.");
lseek(infile,(off_t) 0,0); /* reposition to beginning of file */
}
}
@@ -474,13 +495,17 @@
printf("\n 3. VICAR format.");
printf("\n 4. Unlabelled binary array.\n");
printf("\n Enter format number:");
- gets(inname);
+ fgets(inname, sizeof(inname), stdin);
+ if ((s = strchr(inname, '\n')) != NULL)
+ *s = '\0';
output_format = atoi(inname);
} while (output_format < 1 || output_format > 4);
if (outname[0] == ' ') {
printf("\nEnter name of uncompressed output file: ");
- gets (outname);
+ fgets(outname, sizeof(outname), stdin);
+ if ((s = strchr(outname, '\n')) != NULL)
+ *s = '\0';
}
return(host);
@@ -495,68 +520,68 @@
/*********************************************************************/
void open_files(host)
-int *host;
+ int *host;
{
if (*host == 1 || *host == 2 || *host == 5) {
if (outname[0] == '-') outfile=stdout;
- else if ((outfile = fopen(outname,"wb"))==NULL) {
- fprintf(stderr,"\ncan't open output file: %s\n",outname);
+ else if ((outfile = fopen(outname, "wb"))==NULL) {
+ fprintf(stderr,"\ncan't open output file: %s\n", outname);
exit(1);
}
}
else if (*host == 3 || *host == 4) {
if (output_format == 1) { /* write PDS format blocks */
- if (record_bytes == 836) {
- if ((outfile=fopen(outname,"w"
+ if (record_bytes == 836) {
+ if ((outfile=fopen(outname, "w"
#ifdef VMS
,"mrs=836",FOP,CTX,RECORD_TYPE
#endif
))==NULL) {
- fprintf(stderr,"\ncan't open output file: %s\n",outname);
+ fprintf(stderr,"\ncan't open output file: %s\n", outname);
exit(1);
}
}
else {
- if ((outfile=fopen(outname,"w"
+ if ((outfile=fopen(outname, "w"
#ifdef VMS
,"mrs=1204",FOP,CTX,RECORD_TYPE
#endif
))==NULL) {
- fprintf(stderr,"\ncan't open output file: %s\n",outname);
+ fprintf(stderr,"\ncan't open output file: %s\n", outname);
exit(1);
}
}
}
else if (output_format == 2) { /* write FITS format blocks */
- if ((outfile=fopen(outname,"w"
+ if ((outfile=fopen(outname, "w"
#ifdef VMS
,"mrs=2880",FOP,CTX,RECORD_TYPE
#endif
))==NULL) {
- fprintf(stderr,"\ncan't open output file: %s\n",outname);
+ fprintf(stderr,"\ncan't open output file: %s\n", outname);
exit(1);
}
}
- else { /* write fixed length records */
- if (record_bytes == 836) {
- if ((outfile=fopen(outname,"w"
+ else { /* write fixed-length records */
+ if (record_bytes == 836) {
+ if ((outfile=fopen(outname, "w"
#ifdef VMS
,"mrs=800",FOP,CTX,RECORD_TYPE
#endif
))==NULL) {
- fprintf(stderr,"\ncan't open output file: %s\n",outname);
+ fprintf(stderr,"\ncan't open output file: %s\n", outname);
exit(1);
}
}
else {
- if ((outfile=fopen(outname,"w"
+ if ((outfile=fopen(outname, "w"
#ifdef VMS
,"mrs=1204",FOP,CTX,RECORD_TYPE
#endif
))==NULL) {
- fprintf(stderr,"\ncan't open output file: %s\n",outname);
+ fprintf(stderr,"\ncan't open output file: %s\n", outname);
exit(1);
}
}
@@ -572,11 +597,11 @@
/*********************************************************************/
void pds_labels(host)
- int host;
+ int host;
{
- char outstring[80],ibuf[2048];
+ char ibuf[2048];
unsigned char cr=13,lf=10,blank=32;
- short length,nlen,total_bytes,line,i;
+ short length,total_bytes,i;
total_bytes = 0;
@@ -613,11 +638,11 @@
(size_t) 53,(size_t) 1,outfile);
else
fwrite("CCSD3ZF0000100000001NJPL3IF0PDS200000001 = SFDU_LABEL",
- (size_t) 53,(size_t) 1,outfile);
+ (size_t) 53,(size_t) 1,outfile);
fprintf(outfile,"%c%c",cr,lf);
fwrite("/* FILE FORMAT AND LENGTH */",(size_t) 37,(size_t) 1,
- outfile);
+ outfile);
fprintf(outfile,"%c%c",cr,lf);
fwrite("RECORD_TYPE = FIXED_LENGTH",(size_t) 47,
(size_t) 1,outfile);
@@ -710,7 +735,7 @@
}
else {
strcpy(ibuf+35,"60");
- length = length - 2;
+ length = length - 2;
}
fwrite(ibuf,(size_t) length,(size_t) 1,outfile);
@@ -730,7 +755,7 @@
}
else if ((i = strncmp(ibuf," ENCODING",(size_t) 9)) == 0);
-
+
/*****************************************************************/
/* delete the encoding type label in the image object */
/*****************************************************************/
@@ -787,10 +812,10 @@
/*********************************************************************/
void fits_labels(host)
-int host;
+ int host;
{
char ibuf[2048],outstring[80];
- short length,nlen,total_bytes,line,i;
+ short length,total_bytes,i;
unsigned char cr=13,lf=10,blank=32;
do {
@@ -799,7 +824,7 @@
/*****************************************************************/
/* find the checksum and store in label_checksum */
/*****************************************************************/
- if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) {
+ if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) {
ibuf[length] = '\0';
label_checksum = atol(ibuf+35);
}
@@ -842,7 +867,7 @@
if (record_bytes == 836)
strcpy(outstring,"NAXIS1 = 800");
- else
+ else
strcpy(outstring,"NAXIS1 = 1204");
strcat(outstring," ");
@@ -862,7 +887,7 @@
strcpy(outstring,"END ");
strcat(outstring," ");
-
+
fwrite(outstring,(size_t) 78,(size_t) 1,outfile);
fprintf(outfile,"%c%c",cr,lf);
total_bytes = total_bytes + 80;
@@ -871,6 +896,7 @@
for (i=total_bytes; i<2880; i++) fputc(blank,outfile);
}
+
/*********************************************************************/
/* */
/* subroutine vicar_labels - write vicar labels to output file */
@@ -878,11 +904,10 @@
/*********************************************************************/
void vicar_labels(host)
-int host;
-
+ int host;
{
char ibuf[2048],outstring[80];
- short length,nlen,total_bytes,line,i;
+ short length,total_bytes,i;
unsigned char cr=13,lf=10,blank=32;
do {
@@ -890,7 +915,7 @@
/*****************************************************************/
/* find the checksum and store in label_checksum */
/*****************************************************************/
- if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) {
+ if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) {
ibuf[length] = '\0';
label_checksum = atol(ibuf+35);
}
@@ -950,10 +975,10 @@
/*********************************************************************/
void no_labels(host)
-int host;
+ int host;
{
- char ibuf[2048],outstring[80];
- short length,nlen,total_bytes,line,i;
+ char ibuf[2048];
+ short length,i;
do {
length = read_var(ibuf,host);
@@ -961,7 +986,7 @@
/*****************************************************************/
/* find the checksum and store in label_checksum */
/*****************************************************************/
- if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) {
+ if ((i = strncmp(ibuf," CHECKSUM",(size_t) 9)) == 0) {
ibuf[length] = '\0';
label_checksum = atol(ibuf+35);
}
@@ -984,15 +1009,16 @@
open_files(&host);
}
+
/*********************************************************************/
/* */
-/* subroutine read_var - read variable length records from input file*/
+/* subroutine read_var - read variable-length records from input file*/
/* */
/*********************************************************************/
int read_var(ibuf,host)
-char *ibuf;
-int host;
+ char *ibuf;
+ int host;
{
int length,result,nlen;
char temp;
@@ -1027,19 +1053,19 @@
return (length);
case 3: /*******************************************************/
- /* VAX host with variable length support */
+ /* VAX host with variable-length support */
/*******************************************************/
length = read(infile,ibuf,(size_t) 2048/* upper bound */);
return (length);
case 4: /*******************************************************/
- /* VAX host, but not a variable length file */
+ /* VAX host, but not a variable-length file */
/*******************************************************/
length = 0;
result = read(infile,&length,(size_t) 2);
nlen = read(infile,ibuf,(size_t) length+(length%2));
- /* check to see if we crossed a vax record boundary */
+ /* check to see if we crossed a VAX record boundary */
while (nlen < length)
nlen += read(infile,ibuf+nlen,(size_t) length+(length%2)-nlen);
return (length);
@@ -1061,6 +1087,7 @@
return 0;
}
+
/*********************************************************************/
/* */
/* subroutine check_host - find out what kind of machine we are on */
@@ -1115,23 +1142,23 @@
"Host 5 - 32 bit integers without swapping, no var len support.");
}
- if ((*outname)!='-') fprintf(stderr,"%s\n",hostname);
+ if ((*outname) != '-') fprintf(stderr, "%s\n", hostname);
return(host);
}
-int swap_int(inval) /* swap 4 byte integer */
- int inval;
+int swap_int(inval) /* swap 4 byte integer */
+ int inval;
{
- union /* this union is used to swap 16 and 32 bit integers */
+ union /* this union is used to swap 16 and 32 bit integers */
{
char ichar[4];
short slen;
int llen;
} onion;
char temp;
-
- /* byte swap the input field */
+
+ /* byte swap the input field */
onion.llen = inval;
temp = onion.ichar[0];
onion.ichar[0]=onion.ichar[3];
@@ -1146,17 +1173,13 @@
/****************************************************************************
*_TITLE decompress - decompresses image lines stored in compressed format *
*_ARGS TYPE NAME I/O DESCRIPTION */
- char *ibuf; /* I Compressed data buffer */
- char *obuf; /* O Decompressed image line */
- int *nin; /* I Number of bytes on input buffer */
- int *nout; /* I Number of bytes in output buffer */
-
+ char *ibuf; /* I Compressed data buffer */
+ char *obuf; /* O Decompressed image line */
+ int *nin; /* I Number of bytes on input buffer */
+ int *nout; /* I Number of bytes in output buffer */
{
- /* The external root pointer to tree */
- extern NODE *tree;
-
dcmprs(ibuf,obuf,nin,nout,tree);
-
+
return;
}
@@ -1165,10 +1188,8 @@
/***************************************************************************
*_TITLE decmpinit - initializes the Huffman tree *
*_ARGS TYPE NAME I/O DESCRIPTION */
- int *hist; /* I First-difference histogram. */
-
+ int *hist; /* I First-difference histogram. */
{
- extern NODE *tree; /* Huffman tree root pointer */
tree = huff_tree(hist);
return;
}
@@ -1178,8 +1199,7 @@
/****************************************************************************
*_TITLE huff_tree - constructs the Huffman tree; returns pointer to root *
*_ARGS TYPE NAME I/O DESCRIPTION */
- int *hist; /* I First difference histogram */
-
+ int *hist; /* I First difference histogram */
{
/* Local variables used */
int freq_list[512]; /* Histogram frequency list */
@@ -1189,7 +1209,6 @@
NODE **np; /* Node list pointer */
int num_freq; /* Number non-zero frequencies in histogram */
- int sum; /* Sum of all frequencies */
short int num_nodes; /* Counter for DN initialization */
short int cnt; /* Miscellaneous counter */
@@ -1228,7 +1247,7 @@
j = 0;
for (i=4 ; --i >= 0 ; j = (j << 8) | *(cp+i));
-
+
/* Now make the assignment */
*fp++ = j;
temp = new_node(num_nodes);
@@ -1341,7 +1360,7 @@
l--;
if ( j <= freq_list) break;
}
-
+
}
return;
}
@@ -1362,9 +1381,9 @@
NODE *ptr = root; /* pointer to position in tree */
unsigned char test; /* test byte for bit set */
unsigned char idn; /* input compressed byte */
-
+
char odn; /* last dn value decompressed */
-
+
char *ilim = ibuf + *nin; /* end of compressed bytes */
char *olim = obuf + *nout; /* end of output buffer */
@@ -1406,10 +1425,9 @@
/****************************************************************************
*_TITLE free_tree - free memory of all allocated nodes *
*_ARGS TYPE NAME I/O DESCRIPTION */
- int *nfreed; /* O Return of total count of nodes *
+ int *nfreed; /* O Return of total count of nodes *
* freed. */
-
-/*
+/* *
*_DESCR This routine is supplied to the programmer to free up all the *
* allocated memory required to build the huffman tree. The count *
* of the nodes freed is returned in the parameter 'nfreed'. The *
@@ -1417,16 +1435,13 @@
* than one file per run, the program will not keep allocating new *
* memory without first deallocating all previous nodes associated *
* with the previous file decompression. *
-
+* *
*_HIST 16-AUG-89 Kris Becker USGS, Flagstaff Original Version *
*_END *
****************************************************************************/
-
{
int total_free = 0;
- extern NODE *tree; /* Huffman tree root pointer */
-
*nfreed = free_node(tree,total_free);
return;
@@ -1435,36 +1450,33 @@
int free_node(pnode,total_free)
/***************************************************************************
-*_TITLE free_node - deallocates an allocated NODE pointer
+*_TITLE free_node - deallocates an allocated NODE pointer *
*_ARGS TYPE NAME I/O DESCRIPTION */
NODE *pnode; /* I Pointer to node to free */
- int total_free; /* I Total number of freed nodes */
-
-/*
+ int total_free; /* I Total number of freed nodes */
+/* *
*_DESCR free_node will check both right and left pointers of a node *
* and then free the current node using the free() C utility. *
* Note that all nodes attached to the node via right or left *
* pointers area also freed, so be sure that this is the desired *
* result when calling this routine. *
-
+* *
* This routine is supplied to allow successive calls to the *
* decmpinit routine. It will free up the memory allocated *
* by previous calls to the decmpinit routine. The call to free *
-* a previous huffman tree is: total = free_node(tree,(int) 0); *
+* a previous huffman tree is: total = free_node(tree,(int) 0); *
* This call must be done by the programmer application routine *
* and is not done by any of these routines. *
*_HIST 16-AUG-89 Kris Becker U.S.G.S Flagstaff Original Version */
{
if (pnode == (NODE *) NULL) return(total_free);
-
+
if (pnode->right != (NODE *) NULL)
total_free = free_node(pnode->right,total_free);
if (pnode->left != (NODE *) NULL)
total_free = free_node(pnode->left,total_free);
-
+
free((char *) pnode);
return(total_free + 1);
}
-
-
diff -ru xv-3.10a/xcmap.c xv-3.10a-enhancements/xcmap.c
--- xv-3.10a/xcmap.c 1995-01-03 13:14:52.000000000 -0800
+++ xv-3.10a-enhancements/xcmap.c 2007-04-15 13:12:41.000000000 -0700
@@ -9,6 +9,9 @@
/* include files */
#include
+#ifdef __STDC__
+# include /* exit(), abs() */
+#endif
#include
#include
@@ -18,7 +21,7 @@
#include
#ifdef VMS
-#define index strchr
+# define index strchr
#endif
typedef unsigned char byte;
@@ -58,7 +61,7 @@
int main PARM((int, char **));
static void HandleEvent PARM((XEvent *));
static void Syntax PARM((void));
-static void FatalError PARM((char *));
+static void FatalError PARM((const char *));
static void Quit PARM((void));
static void CreateMainWindow PARM((char *, char *, int, char **));
static void DrawWindow PARM((int,int,int,int));
@@ -75,50 +78,50 @@
int i;
char *display, *geom;
XEvent event;
-
+
cmd = argv[0];
display = geom = NULL;
-
-
+
+
/*********************Options*********************/
-
+
for (i = 1; i < argc; i++) {
char *strind;
-
+
if (!strncmp(argv[i],"-g", (size_t)2)) { /* geometry */
i++;
geom = argv[i];
continue;
}
-
+
if (argv[i][0] == '=') { /* old-style geometry */
geom = argv[i];
continue;
}
-
+
if (!strncmp(argv[i],"-d",(size_t) 2)) { /* display */
i++;
display = argv[i];
continue;
}
-
+
strind = (char *) index(argv[i], ':'); /* old-style display */
if(strind != NULL) {
display = argv[i];
continue;
}
-
+
Syntax();
}
-
-
+
+
/*****************************************************/
-
+
/* Open up the display. */
-
+
if ( (theDisp=XOpenDisplay(display)) == NULL)
FatalError("can't open display");
-
+
theScreen = DefaultScreen(theDisp);
theCmap = DefaultColormap(theDisp, theScreen);
rootW = RootWindow(theDisp,theScreen);
@@ -126,9 +129,9 @@
fcol = WhitePixel(theDisp,theScreen);
bcol = BlackPixel(theDisp,theScreen);
theVisual = DefaultVisual(theDisp,theScreen);
-
+
dispcells = DisplayCells(theDisp, theScreen);
-
+
if (dispcells>256) {
sprintf(tmpstr,"dispcells = %d. %s",
dispcells, "This program can only deal with <= 8-bit displays.");
@@ -140,27 +143,32 @@
nxcells = nycells = 8;
else if (dispcells>4)
nxcells = nycells = 4;
- else
+ else if (dispcells>2)
nxcells = nycells = 2;
-
+ else
+ {
+ nxcells = 2;
+ nycells = 1;
+ }
+
/**************** Create/Open X Resources ***************/
if ((mfinfo = XLoadQueryFont(theDisp,FONT))==NULL) {
sprintf(tmpstr,"couldn't open '%s' font",FONT);
FatalError(tmpstr);
}
-
+
mfont=mfinfo->fid;
XSetFont(theDisp,theGC,mfont);
XSetForeground(theDisp,theGC,fcol);
XSetBackground(theDisp,theGC,bcol);
-
+
CreateMainWindow(cmd,geom,argc,argv);
- Resize(WIDE,HIGH);
-
- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
+ Resize((int)WIDE,(int)HIGH);
+
+ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
| StructureNotifyMask | ButtonPressMask);
XMapWindow(theDisp,mainW);
-
+
/**************** Main loop *****************/
while (1) {
XNextEvent(theDisp, &event);
@@ -177,41 +185,41 @@
switch (event->type) {
case Expose: {
XExposeEvent *exp_event = (XExposeEvent *) event;
-
- if (exp_event->window==mainW)
+
+ if (exp_event->window==mainW)
DrawWindow(exp_event->x,exp_event->y,
exp_event->width, exp_event->height);
}
break;
-
+
case ButtonPress: {
XButtonEvent *but_event = (XButtonEvent *) event;
-
- if (but_event->window == mainW && but_event->button == Button1)
+
+ if (but_event->window == mainW && but_event->button == Button1)
TrackMouse(but_event->x, but_event->y);
}
break;
-
+
case KeyPress: {
XKeyEvent *key_event = (XKeyEvent *) event;
KeySym ks;
XComposeStatus status;
-
+
XLookupString(key_event,tmpstr,128,&ks,&status);
if (tmpstr[0]=='q' || tmpstr[0]=='Q') Quit();
}
break;
-
+
case ConfigureNotify: {
XConfigureEvent *conf_event = (XConfigureEvent *) event;
-
- if (conf_event->window == mainW &&
- (conf_event->width != WIDE || conf_event->height != HIGH))
- Resize(conf_event->width, conf_event->height);
+ int w = conf_event->width, h = conf_event->height;
+
+ if (conf_event->window == mainW && (w != WIDE || h != HIGH))
+ Resize((int)(w ? w : WIDE), (int)(h ? h : HIGH));
}
break;
-
-
+
+
case CirculateNotify:
case MapNotify:
case DestroyNotify:
@@ -220,7 +228,7 @@
case UnmapNotify:
case MappingNotify:
case ClientMessage: break;
-
+
default: /* ignore unexpected events */
break;
} /* end of switch */
@@ -237,10 +245,10 @@
/***********************************/
-static void FatalError (identifier)
- char *identifier;
+static void FatalError(identifier)
+ const char *identifier;
{
- fprintf(stderr, "%s: %s\n",cmd, identifier);
+ fprintf(stderr, "%s: %s\n", cmd, identifier);
exit(-1);
}
@@ -262,24 +270,33 @@
XSizeHints hints;
int i,x,y;
unsigned int w,h;
-
+
WIDE = HIGH = 256; /* default window size */
-
+
x=y=w=h=1;
+ hints.flags = 0;
+
i=XParseGeometry(geom,&x,&y,&w,&h);
- if (i&WidthValue) WIDE = (int) w;
- if (i&HeightValue) HIGH = (int) h;
-
- if (i&XValue || i&YValue) hints.flags = USPosition;
- else hints.flags = PPosition;
-
- hints.flags |= USSize;
-
- if (i&XValue && i&XNegative)
- x = XDisplayWidth(theDisp,theScreen)-WIDE-abs(x);
- if (i&YValue && i&YNegative)
- y = XDisplayHeight(theDisp,theScreen)-HIGH-abs(y);
-
+ if (i&WidthValue)
+ {
+ WIDE = (int) w;
+ hints.flags |= USSize;
+ }
+ if (i&HeightValue)
+ {
+ HIGH = (int) h;
+ hints.flags |= USSize;
+ }
+
+ if (i&XValue || i&YValue)
+ {
+ if (i&XNegative)
+ x = XDisplayWidth(theDisp,theScreen)-WIDE-abs(x);
+ if (i&YNegative)
+ y = XDisplayHeight(theDisp,theScreen)-HIGH-abs(y);
+ hints.flags |= USPosition;
+ }
+
hints.x=x; hints.y=y;
hints.width = WIDE; hints.height = HIGH;
hints.max_width = DisplayWidth(theDisp,theScreen);
@@ -288,22 +305,22 @@
hints.min_height = 16;
hints.width_inc = hints.height_inc = 16;
hints.flags |= PMaxSize | PMinSize | PResizeInc;
-
+
xswa.background_pixel = bcol;
xswa.border_pixel = fcol;
xswa.cursor = XCreateFontCursor (theDisp, XC_top_left_arrow);
xswamask = CWBackPixel | CWBorderPixel | CWCursor;
-
+
mainW = XCreateWindow(theDisp,rootW,x,y,(unsigned int) WIDE,
- (unsigned int) HIGH, 2, 0,
+ (unsigned int) HIGH, 2, 0,
(unsigned int) CopyFromParent,
CopyFromParent, xswamask, &xswa);
-
+
XSetStandardProperties(theDisp,mainW,"xcmap","xcmap",None,
argv,argc,&hints);
-
+
if (!mainW) FatalError("Can't open main window");
-
+
}
@@ -312,11 +329,11 @@
int x,y,w,h;
{
int i,j,x1,y1,x2,y2;
-
+
x1 = x / cWIDE; y1 = y / cHIGH; /* (x1,y1) (x2,y2): bounding */
x2 = ((x+w) + cWIDE - 1) / cWIDE; /* rect in cell coords */
y2 = ((y+h) + cHIGH - 1) / cHIGH;
-
+
for (i=y1; i=WIDE) x=WIDE-1;
if (y<0) y=0; if (y>=HIGH) y=HIGH-1;
-
+
if (!pvalup) { /* it's not up. make it so */
if (y >= HIGH/2) pvaly = 0; else pvaly = HIGH - 12;
pvalup = 1;
@@ -378,30 +395,30 @@
XClearArea(theDisp,mainW,0,pvaly,
(unsigned int) WIDE, (unsigned int) 13,True);
}
-
+
x /= cWIDE; y /= cHIGH;
-
+
pix = y * nxcells + x;
-
+
if (pix != lastpix) {
XColor def;
char *sp;
-
+
XSetForeground(theDisp,theGC,fcol);
lastpix = def.pixel = pix;
if (pix24-bit */
+ for (i=0; i= 24)) best=i;
+ }
+ for (i=0; i24 && best<0) best = i;
+ }
+ for (i=0; i24-bit ? */
+ if (vinfo[i].depth >= 24) best = i;
}
}
if (best == -1) { /* look for a DirectColor, 24-bit or more (pref 24) */
rvinfo.class = DirectColor;
if (vinfo) XFree((char *) vinfo);
+
vinfo = XGetVisualInfo(theDisp, flags, &rvinfo, &numvis);
if (vinfo) {
- for (i=0, best = -1; i= 24)) best=i;
+ }
+ for (i=0; i24 && best<0) best = i;
+ }
+ for (i=0; i24-bit ? */
+ if (vinfo[i].depth >= 24) best = i;
}
}
}
-
+
if (best>=0 && best= 0) {
+ if (vclass >= 0) {
rvinfo.class = vclass; vinfomask = VisualClassMask;
}
else { rvinfo.visualid = vid; vinfomask = VisualIDMask; }
-
+
rvinfo.screen = theScreen;
vinfomask |= VisualScreenMask;
@@ -429,9 +539,9 @@
/* make linear colormap for DirectColor visual */
if (theVisual->class == DirectColor) makeDirectCmap();
- defaultVis = (XVisualIDFromVisual(theVisual) ==
+ defaultVis = (XVisualIDFromVisual(theVisual) ==
XVisualIDFromVisual(DefaultVisual(theDisp, DefaultScreen(theDisp))));
-
+
/* turn GraphicsExposures OFF in the default GC */
{
@@ -441,9 +551,6 @@
}
- if (!useroot && limit2x) { maxWIDE *= 2; maxHIGH *= 2; }
- if (nolimits) { maxWIDE = 65000; maxHIGH = 65000; }
-
XSetErrorHandler(xvErrorHandler);
/* always search for virtual root window */
@@ -456,14 +563,14 @@
Atom actual_type;
int actual_format;
unsigned long nitems, bytesafter;
- Window *newRoot = NULL;
+ byte *newRoot = NULL; /* byte instead of Window avoids type-pun warning */
XWindowAttributes xwa;
if (XGetWindowProperty (theDisp, children[i], __SWM_VROOT, 0L, 1L,
False, XA_WINDOW, &actual_type, &actual_format, &nitems,
&bytesafter, (unsigned char **) &newRoot) == Success && newRoot) {
- vrootW = *newRoot;
+ vrootW = *(Window *)newRoot;
XGetWindowAttributes(theDisp, vrootW, &xwa);
- vrWIDE = xwa.width; vrHIGH = xwa.height;
+ maxWIDE = vrWIDE = xwa.width; maxHIGH = vrHIGH = xwa.height;
dispDEEP = xwa.depth;
break;
}
@@ -472,7 +579,8 @@
vrootW = pseudo_root(theDisp, theScreen);
#endif
-
+ if (!useroot && limit2x) { maxWIDE *= 2; maxHIGH *= 2; }
+ if (nolimits) { maxWIDE = 65000; maxHIGH = 65000; }
if (clrroot || useroot) {
@@ -486,13 +594,14 @@
arrow = XCreateFontCursor(theDisp,(u_int) curstype);
cross = XCreateFontCursor(theDisp,XC_crosshair);
tcross = XCreateFontCursor(theDisp,XC_tcross);
+ tlcorner = XCreateFontCursor(theDisp,XC_top_left_corner);
zoom = XCreateFontCursor(theDisp,XC_sizing);
{
XColor fc, bc;
fc.red = fc.green = fc.blue = 0xffff;
bc.red = bc.green = bc.blue = 0x0000;
-
+
XRecolorCursor(theDisp, zoom, &fc, &bc);
}
@@ -541,7 +650,7 @@
/* set up fg,bg colors */
- fg = black; bg = white;
+ fg = black; bg = white;
if (fgstr && XParseColor(theDisp, theCmap, fgstr, &ecdef) &&
xvAllocColor(theDisp, theCmap, &ecdef)) {
fg = ecdef.pixel;
@@ -561,6 +670,18 @@
xvAllocColor(theDisp, theCmap, &ecdef)) rootbg = ecdef.pixel;
+ /* GRR 19980308: set up image bg color (for transparent images) */
+ have_imagebg = 0;
+ if (imagebgstr && XParseColor(theDisp, theCmap, imagebgstr, &ecdef) &&
+ xvAllocColor(theDisp, theCmap, &ecdef)) {
+ /* imagebg = ecdef.pixel; */
+ have_imagebg = 1;
+ imagebgR = ecdef.red;
+ imagebgG = ecdef.green;
+ imagebgB = ecdef.blue;
+ }
+
+
/* set up hi/lo colors */
i=0;
if (dispDEEP > 1) { /* only if we're on a reasonable display */
@@ -590,7 +711,7 @@
if (theVisual->class == StaticGray || theVisual->class == GrayScale)
mono = 1;
}
-
+
iconPix = MakePix1(rootW, icon_bits, icon_width, icon_height);
@@ -598,32 +719,32 @@
riconPix = MakePix1(rootW, runicon_bits, runicon_width, runicon_height);
riconmask= MakePix1(rootW, runiconm_bits, runiconm_width,runiconm_height);
- if (!iconPix || !iconmask || !riconPix || !riconmask)
+ if (!iconPix || !iconmask || !riconPix || !riconmask)
FatalError("Unable to create icon pixmaps\n");
- gray50Tile = XCreatePixmapFromBitmapData(theDisp, rootW,
+ gray50Tile = XCreatePixmapFromBitmapData(theDisp, rootW,
(char *) cboard50_bits,
- cboard50_width, cboard50_height,
+ cboard50_width, cboard50_height,
infofg, infobg, dispDEEP);
if (!gray50Tile) FatalError("Unable to create gray50Tile bitmap\n");
- gray25Tile = XCreatePixmapFromBitmapData(theDisp, rootW,
+ gray25Tile = XCreatePixmapFromBitmapData(theDisp, rootW,
(char *) gray25_bits,
- gray25_width, gray25_height,
+ gray25_width, gray25_height,
infofg, infobg, dispDEEP);
if (!gray25Tile) FatalError("Unable to create gray25Tile bitmap\n");
/* try to load fonts */
- if ( (mfinfo = XLoadQueryFont(theDisp,FONT1))==NULL &&
- (mfinfo = XLoadQueryFont(theDisp,FONT2))==NULL &&
- (mfinfo = XLoadQueryFont(theDisp,FONT3))==NULL &&
- (mfinfo = XLoadQueryFont(theDisp,FONT4))==NULL &&
+ if ( (mfinfo = XLoadQueryFont(theDisp,FONT1))==NULL &&
+ (mfinfo = XLoadQueryFont(theDisp,FONT2))==NULL &&
+ (mfinfo = XLoadQueryFont(theDisp,FONT3))==NULL &&
+ (mfinfo = XLoadQueryFont(theDisp,FONT4))==NULL &&
(mfinfo = XLoadQueryFont(theDisp,FONT5))==NULL) {
- sprintf(str,
+ sprintf(dummystr,
"couldn't open the following fonts:\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s",
FONT1, FONT2, FONT3, FONT4, FONT5);
- FatalError(str);
+ FatalError(dummystr);
}
mfont=mfinfo->fid;
XSetFont(theDisp,theGC,mfont);
@@ -632,45 +753,100 @@
if (monofontname) {
monofinfo = XLoadQueryFont(theDisp, monofontname);
- if (!monofinfo) fprintf(stderr,"xv: unable to load font '%s'\n",
+ if (!monofinfo) fprintf(stderr,"xv: unable to load font '%s'\n",
monofontname);
- }
+ }
if (!monofinfo) {
- if ((monofinfo = XLoadQueryFont(theDisp,MFONT1))==NULL &&
- (monofinfo = XLoadQueryFont(theDisp,MFONT2))==NULL &&
- (monofinfo = XLoadQueryFont(theDisp,MFONT3))==NULL &&
+ if ((monofinfo = XLoadQueryFont(theDisp,MFONT1))==NULL &&
+ (monofinfo = XLoadQueryFont(theDisp,MFONT2))==NULL &&
+ (monofinfo = XLoadQueryFont(theDisp,MFONT3))==NULL &&
(monofinfo = XLoadQueryFont(theDisp,MFONT4))==NULL) {
- sprintf(str,"couldn't open %s fonts:\n\t%s\n\t%s\n\t%s\n\t%s",
+ sprintf(dummystr,"couldn't open %s fonts:\n\t%s\n\t%s\n\t%s\n\t%s",
"any of the following",
MFONT1, MFONT2, MFONT3, MFONT4);
- FatalError(str);
+ FatalError(dummystr);
}
}
monofont=monofinfo->fid;
-
-
-
+#ifdef TV_L10N
+ if (xlocale) {
+ i = 0;
+ while (mfontsize[i]) {
+ xlocale = 1; /* True */
+
+ sprintf(mfontset, TV_FONTSET, mfontsize[i]);
+/*fprintf(stderr, "FontSet: %s\n", mfontset);*/
+
+ monofset = XCreateFontSet(theDisp, mfontset,
+ &misscharset, &nmisscharset, &defstr);
+# if 0 /* not useful */
+ if (!monofset) {
+ /* the current locale is not supported */
+/*fprintf(stderr, "Current locale `%s' is not supported.\n", localeList[i]);*/
+ xlocale = 0;
+ break;
+ }
+# endif
+/*fprintf(stderr, "# of misscharset in mfontsize[%d]: %d\n", i,nmisscharset);*/
+
+ for (j = 0; j < nmisscharset; j++) {
+ if (!strncmp(misscharset[j], "jisx0208", 8)) {
+ /* font for JIS X 0208 is not found */
+ xlocale = 0;
+ break;
+ }
+ }
+
+ if (xlocale) {
+ monofsetinfo = XExtentsOfFontSet(monofset);
+ monofsetinfo->max_logical_extent.width = mfontsize[i];
+ /* correct size of TextViewer
+ in case that JIS X 0208 is not found */
+ break;
+ }
+
+ i++;
+ } /* while (mfontsize[i]) */
+
+# if 0
+ if (nmisscharset > 0) {
+ sprintf(dummystr,"missing %d charset:\n", nmisscharset);
+ for (i = 0; i < nmisscharset; i++) {
+ sprintf(dummystr, "%s\t%s\n", dummystr, misscharset[i]);
+ }
+# if 0
+ FatalError(dummystr);
+# else
+ fprintf(stderr, "%s", dummystr);
+# endif
+ }
+# endif
+ }
+#endif /* TV_L10N */
+
+
+
/* if ncols wasn't set, set it to 2^dispDEEP, unless dispDEEP=1, in which
case ncols = 0; (ncols = max number of colors allocated. on 1-bit
displays, no colors are allocated */
-
+
if (ncols == -1) {
if (dispDEEP>1) ncols = 1 << ((dispDEEP>8) ? 8 : dispDEEP);
else ncols = 0;
}
else if (ncols>256) ncols = 256; /* so program doesn't blow up */
-
-
+
+
GenerateFSGamma(); /* has to be done before 'OpenBrowse()' is called */
-
-
-
+
+
+
/* no filenames. build one-name (stdio) list (if stdinflag) */
if (numnames==0) {
- if (stdinflag) {
+ if (stdinflag) {
/* have to malloc namelist[0] so we can free it in deleteFromList() */
namelist[0] = (char *) malloc(strlen(STDINSTR) + 1);
if (!namelist[0]) FatalError("unable to to build namelist[0]");
@@ -679,16 +855,28 @@
}
else namelist[0] = NULL;
}
-
+ else if (randomShow) {
+ int i, j;
+ char *tmp;
+
+ srandom((int)time((time_t *)0));
+ for (i = numnames; i > 1; i--) {
+ j = random() % i;
+ tmp = namelist[i-1];
+ namelist[i-1] = namelist[j];
+ namelist[j] = tmp;
+ }
+ }
+
if (numnames) makeDispNames();
-
-
- if (viewonly || autoquit) {
- imap = ctrlmap = gmap = browmap = cmtmap = 0;
+
+
+ if (viewonly || autoquit) {
+ imap = ctrlmap = gmap = browmap = cmtmap = 0;
novbrowse = 1;
}
-
-
+
+
/* create the info box window */
CreateInfo(infogeom);
XSelectInput(theDisp, infoW, ExposureMask | ButtonPressMask | KeyPressMask
@@ -698,12 +886,12 @@
RedrawInfo(0,0,1000,1000); /* explicit draw if mapped */
XFlush(theDisp);
}
-
-
+
+
/* create the control box window */
CreateCtrl(ctrlgeom);
epicMode = EM_RAW; SetEpicMode();
-
+
XSelectInput(theDisp, ctrlW, ExposureMask | ButtonPressMask | KeyPressMask
| StructureNotifyMask);
if (ctrlmap < 0) { /* map iconified */
@@ -719,22 +907,22 @@
RedrawCtrl(0,0,1000,1000); /* explicit draw if mapped */
XFlush(theDisp);
}
-
+
fixDispNames();
ChangedCtrlList();
-
+
/* disable root modes if using non-default visual */
if (!defaultVis) {
for (i=RMB_ROOT; ired_mask;
gmask = theVisual->green_mask;
@@ -849,22 +1061,22 @@
if (rshift<0) rmask = rmask << (-rshift);
else rmask = rmask >> rshift;
-
+
if (gshift<0) gmask = gmask << (-gshift);
else gmask = gmask >> gshift;
-
+
if (bshift<0) bmask = bmask << (-bshift);
else bmask = bmask >> bshift;
cmaplen = theVisual->map_entries;
if (cmaplen>256) cmaplen=256;
-
+
/* try to alloc a 'cmaplen' long grayscale colormap. May not get all
entries for whatever reason. Build table 'directConv[]' that
maps range [0..(cmaplen-1)] into set of colors we did get */
-
+
for (i=0; i<256; i++) { origgot[i] = 0; directConv[i] = 0; }
for (i=numgot=0; i= 0 && !origgot[i-numbak]) numbak++;
while ((i + numfwd) < cmaplen && !origgot[i+numfwd]) numfwd++;
-
+
if (i-numbak<0 || !origgot[i-numbak]) numbak = 999;
if (i+numfwd>=cmaplen || !origgot[i+numfwd]) numfwd = 999;
-
+
if (numbak-8 conv.*/
conv24 = CONV24_SLOW;
-
+
else if (!argcmp(argv[i],"-smooth",3,1,&autosmooth)); /* autosmooth */
+ else if (!argcmp(argv[i],"-startgrab",3,1,&startGrab)); /* startGrab */
else if (!argcmp(argv[i],"-stdcmap",3,1,&stdcmap)); /* use stdcmap */
else if (!argcmp(argv[i],"-tgeometry",2,0,&pm)) /* textview geom */
{ if (++i 15) {
@@ -1498,9 +1811,9 @@
fprintf(stderr," (Valid values: 1, 2, 3, 4)\n");
preset = 0;
- }
+ }
- if (waitsec < 0) noFreeCols = 0; /* disallow nfc if not doing slideshow */
+ if (waitsec < 0.0) noFreeCols = 0; /* disallow nfc if not doing slideshow */
if (noFreeCols && perfect) { perfect = 0; owncmap = 1; }
/* decide what default color allocation stuff we've settled on */
@@ -1512,24 +1825,24 @@
defaultCmapMode = colorMapMode; /* default mode for 8-bit images */
- if (nopos) {
- maingeom = infogeom = ctrlgeom = gamgeom = browgeom = textgeom = NULL;
- cmtgeom = NULL;
+ if (nopos) {
+ maingeom = infogeom = ctrlgeom = gamgeom = browgeom = textgeom = cmtgeom =
+ (const char *) NULL;
}
/* if -root and -maxp, disallow 'integer' tiling modes */
- if (useroot && fixedaspect && automax && !rmodeset &&
+ if (useroot && fixedaspect && automax && !rmodeset &&
(rootMode == RM_TILE || rootMode == RM_IMIRROR))
rootMode = RM_CSOLID;
}
+static int cpos = 0;
/***********************************/
-static int cpos = 0;
static void printoption(st)
- char *st;
+ const char *st;
{
if (strlen(st) + cpos > 78) {
fprintf(stderr,"\n ");
@@ -1540,8 +1853,26 @@
cpos = cpos + strlen(st) + 1;
}
+
static void cmdSyntax()
{
+ /* GRR 19980605: added version info for most common libraries */
+ fprintf(stderr, "XV - %s.\n", REVDATE);
+#ifdef HAVE_JPEG
+ VersionInfoJPEG();
+#endif
+#ifdef HAVE_JP2K
+ VersionInfoJP2K();
+#endif
+#ifdef HAVE_TIFF
+ VersionInfoTIFF();
+#endif
+#ifdef HAVE_PNG
+ VersionInfoPNG();
+#endif
+ /* pbm/pgm/ppm support is native, not via pbmplus/netpbm libraries */
+ fprintf(stderr, "\n");
+
fprintf(stderr, "Usage:\n");
printoption(cmd);
printoption("[-]");
@@ -1579,8 +1910,14 @@
printoption("[-/+dither]");
printoption("[-drift dx dy]");
printoption("[-expand exp | hexp:vexp]");
+#ifdef HAVE_G3
+ printoption("[-fax]");
+#endif
printoption("[-fg color]");
printoption("[-/+fixed]");
+#ifdef ENABLE_FIXPIX_SMOOTH
+ printoption("[-/+fixpix]");
+#endif
printoption("[-flist fname]");
printoption("[-gamma val]");
printoption("[-geometry geom]");
@@ -1591,8 +1928,12 @@
printoption("[-help]");
printoption("[-/+hflip]");
printoption("[-hi color]");
+#ifdef HAVE_G3
+ printoption("[-highresfax]");
+#endif
printoption("[-/+hist]");
printoption("[-/+hsv]");
+ printoption("[-ibg color]"); /* GRR 19980314 */
printoption("[-icgeometry geom]");
printoption("[-/+iconic]");
printoption("[-igeometry geom]");
@@ -1600,9 +1941,15 @@
printoption("[-/+lbrowse]");
printoption("[-lo color]");
printoption("[-/+loadclear]");
+#ifdef MACBINARY
+ printoption("[-/+macbinary]");
+#endif
printoption("[-/+max]");
printoption("[-/+maxpect]");
printoption("[-mfn font]");
+#ifdef HAVE_MGCSFX
+ printoption("[-/+mgcsfx]");
+#endif
printoption("[-/+mono]");
printoption("[-name str]");
printoption("[-ncols #]");
@@ -1610,13 +1957,25 @@
printoption("[-/+nodecor]");
printoption("[-/+nofreecols]");
printoption("[-/+nolimits]");
+#ifdef HAVE_MGCSFX
+ printoption("[-/+nomgcsfx]");
+#endif
+#if defined(HAVE_PIC) || defined(HAVE_PIC2)
+ printoption("[-/+nopicadjust]");
+#endif
printoption("[-/+nopos]");
printoption("[-/+noqcheck]");
printoption("[-/+noresetroot]");
printoption("[-/+norm]");
printoption("[-/+nostat]");
printoption("[-/+owncmap]");
+#ifdef HAVE_PCD
+ printoption("[-pcd size(0=192*128,1,2,3,4=3072*2048)]");
+#endif
printoption("[-/+perfect]");
+#ifdef HAVE_PIC2
+ printoption("[-/+pic2split]");
+#endif
printoption("[-/+pkludge]");
printoption("[-/+poll]");
printoption("[-preset #]");
@@ -1635,17 +1994,22 @@
printoption("[-/+rw]");
printoption("[-slow24]");
printoption("[-/+smooth]");
+ printoption("[-/+startgrab]");
printoption("[-/+stdcmap]");
printoption("[-tgeometry geom]");
printoption("[-/+vflip]");
printoption("[-/+viewonly]");
printoption("[-visual type]");
+#ifdef VS_ADJUST
+ printoption("[-/+vsadjust]");
+#endif
printoption("[-/+vsdisable]");
printoption("[-vsgeometry geom]");
printoption("[-/+vsmap]");
printoption("[-/+vsperfect]");
- printoption("[-wait seconds]");
+ printoption("[-wait secs[,final_secs]]");
printoption("[-white color]");
+ printoption("[-windowid windowid]");
printoption("[-/+wloop]");
printoption("[filename ...]");
fprintf(stderr,"\n\n");
@@ -1656,7 +2020,7 @@
/***********************************/
static void rmodeSyntax()
{
- fprintf(stderr,"%s: unknown root mode '%d'. Valid modes are:\n",
+ fprintf(stderr,"%s: unknown root mode '%d'. Valid modes are:\n",
cmd, rootMode);
fprintf(stderr,"\t0: tiling\n");
fprintf(stderr,"\t1: integer tiling\n");
@@ -1668,6 +2032,7 @@
fprintf(stderr,"\t7: centered on a 'brick' background\n");
fprintf(stderr,"\t8: symmetrical tiling\n");
fprintf(stderr,"\t9: symmetrical mirrored tiling\n");
+ fprintf(stderr,"\t10: upper left corner\n");
fprintf(stderr,"\n");
Quit(1);
}
@@ -1675,17 +2040,15 @@
/***********************************/
static int argcmp(a1, a2, minlen, plusallowed, plusminus)
- char *a1, *a2;
+ const char *a1, *a2;
int minlen, plusallowed;
int *plusminus;
{
- /* does a string compare between a1 and a2. To return '0', a1 and a2
- must match to the length of a2, and that length has to
+ /* does a string compare between a1 and a2. To return '0', a1 and a2
+ must match to the length of a1, and that length has to
be at least 'minlen'. Otherwise, return non-zero. plusminus set to '1'
if '-option', '0' if '+option' */
- int i;
-
if ((strlen(a1) < (size_t) minlen) || (strlen(a2) < (size_t) minlen))
return 1;
if (strlen(a1) > strlen(a2)) return 1;
@@ -1694,7 +2057,7 @@
if (a1[0]=='-' || (plusallowed && a1[0]=='+')) {
/* only set if we match */
- *plusminus = (a1[0] == '-');
+ *plusminus = (a1[0] == '-');
return 0;
}
@@ -1721,8 +2084,11 @@
int oldCXOFF, oldCYOFF, oldCWIDE, oldCHIGH, wascropped;
char *tmp;
char *fullname, /* full name of the original file */
- filename[512], /* full name of file to load (could be /tmp/xxx)*/
- globnm[512]; /* globbed version of fullname of orig file */
+ filename[512]; /* full name of file to load (could be /tmp/xxx)*/
+#ifdef MACBINARY
+ char origname[512]; /* file name of original file (NO processing) */
+ origname[0] = '\0';
+#endif
xvbzero((char *) &pinfo, sizeof(PICINFO));
@@ -1748,7 +2114,7 @@
/* if we're not loading next or prev page in a multi-page doc, kill off
page files */
- if (strlen(pageBaseName) && filenum!=OP_PAGEDN && filenum!=OP_PAGEUP)
+ if (strlen(pageBaseName) && filenum!=OP_PAGEDN && filenum!=OP_PAGEUP)
killpage = 1;
@@ -1799,14 +2165,13 @@
}
else if (filenum == PADDED) {
- /* need fullfname (used for window/icon name),
+ /* need fullfname (used for window/icon name),
basefname(compute from fullfname) */
i = LoadPad(&pinfo, fullfname);
fullname = fullfname;
strcpy(filename, fullfname);
- tmp = BaseName(fullfname);
- strcpy(basefname, tmp);
+ strcpy(basefname, BaseName(fullfname));
if (!i) goto FAILED; /* shouldn't happen */
@@ -1855,33 +2220,48 @@
frompipe = 1;
}
}
+#ifdef AUTO_EXPAND
+ else {
+ fullname = (char *) malloc(MAXPATHLEN+2);
+ strcpy(fullname, namelist[filenum]); // 1 of 2 places fullname != const
+ freename = 1;
+ }
+ tmp = (char *) rindex(fullname, '/');
+ if (tmp) {
+ *tmp = '\0'; // 2 of 2 places fullname != const
+ Mkvdir(fullname);
+ *tmp = '/';
+ }
+ Dirtovd(fullname);
+#else
else fullname = namelist[filenum];
-
+#endif
strcpy(fullfname, fullname);
- tmp = BaseName(fullname);
- strcpy(basefname, tmp);
+ strcpy(basefname, BaseName(fullname));
/* chop off trailing ".Z", ".z", or ".gz" from displayed basefname, if any */
- if (strlen(basefname) > (size_t) 2 &&
- strcmp(basefname+strlen(basefname)-2,".Z")==0)
+ if (strlen(basefname)>2 && strcmp(basefname+strlen(basefname)-2,".Z")==0)
basefname[strlen(basefname)-2]='\0';
else {
#ifdef GUNZIP
- if (strlen(basefname)>2 && strcmp(basefname+strlen(basefname)-2,".Z")==0)
+ if (strlen(basefname)>2 && strcmp(basefname+strlen(basefname)-2,".z")==0)
basefname[strlen(basefname)-2]='\0';
-
- else if (strlen(basefname)>3 &&
- strcmp(basefname+strlen(basefname)-3,".gz")==0)
+ else
+ if (strlen(basefname)>3 && strcmp(basefname+strlen(basefname)-3,".gz")==0)
basefname[strlen(basefname)-3]='\0';
-#endif /* GUNZIP */
+#endif
+#ifdef BUNZIP2
+ if (strlen(basefname)>4 && strcmp(basefname+strlen(basefname)-4,".bz2")==0)
+ basefname[strlen(basefname)-4]='\0';
+#endif
}
if (filenum == LOADPIC && ISPIPE(fullname[0])) {
/* if we're reading from a pipe, 'filename' will have the /tmp/xvXXXXXX
- filename, and we can skip a lot of stuff: (such as prepending
+ filename, and we can skip a lot of stuff: (such as prepending
'initdir' to relative paths, dealing with reading from stdin, etc. */
/* at this point, fullname = "! do some commands",
@@ -1891,11 +2271,11 @@
else { /* NOT reading from a PIPE */
- /* if fullname doesn't start with a '/' (ie, it's a relative path),
- (and it's not LOADPIC and it's not the special case '')
+ /* if fullname doesn't start with a '/' (ie, it's a relative path),
+ (and it's not LOADPIC and it's not the special case '')
then we need to prepend a directory name to it:
-
- prepend 'initdir',
+
+ prepend 'initdir',
if we have a searchdir (ie, we have multiple places to look),
see if such a file exists (via fopen()),
if it does, we're done.
@@ -1904,7 +2284,7 @@
if it does, we're done.
if it doesn't, remove all prepended directories, and fall through
to error code below. */
-
+
if (filenum!=LOADPIC && fullname[0]!='/' && strcmp(fullname,STDINSTR)!=0) {
char *tmp1;
@@ -1954,28 +2334,40 @@
}
}
}
-
+
strcpy(filename, fullname);
-
-
+
+
/* if the file is STDIN, write it out to a temp file */
if (strcmp(filename,STDINSTR)==0) {
- FILE *fp;
+ FILE *fp = NULL;
+#ifndef USE_MKSTEMP
+ int tmpfd;
+#endif
-#ifndef VMS
+#ifndef VMS
sprintf(filename,"%s/xvXXXXXX",tmpdir);
#else /* it is VMS */
sprintf(filename, "[]xvXXXXXX");
#endif
+
+#ifdef USE_MKSTEMP
+ fp = fdopen(mkstemp(filename), "w");
+#else
mktemp(filename);
+ tmpfd = open(filename,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR);
+ if (tmpfd < 0) FatalError("openPic(): can't create temporary file");
+ fp = fdopen(tmpfd,"w");
+#endif
+ if (!fp) FatalError("openPic(): can't write temporary file");
clearerr(stdin);
- fp = fopen(filename,"w");
- if (!fp) FatalError("openPic(): can't write temporary file");
-
while ( (i=getchar()) != EOF) putc(i,fp);
fclose(fp);
+#ifndef USE_MKSTEMP
+ close(tmpfd);
+#endif
/* and remove it from list, since we can never reload from stdin */
if (strcmp(namelist[0], STDINSTR)==0) deleteFromList(0);
@@ -1990,20 +2382,26 @@
(no pipes or stdin, though it could be compressed) to be loaded */
filetype = ReadFileType(filename);
+#ifdef HAVE_MGCSFX
+ if (mgcsfx && filetype == RFT_UNKNOWN){ /* force use MgcSfx */
+ if(getInputCom() != 0) filetype = RFT_MGCSFX;
+ }
+#endif
- if (filetype == RFT_COMPRESS) { /* a compressed file. uncompress it */
+ /* if it's a compressed file, uncompress it: */
+ if ((filetype == RFT_COMPRESS) || (filetype == RFT_BZIP2)) {
char tmpname[128];
if (
#ifndef VMS
- UncompressFile(filename, tmpname)
+ UncompressFile(filename, tmpname, filetype)
#else
- UncompressFile(basefname, tmpname)
+ UncompressFile(basefname, tmpname, filetype)
#endif
) {
filetype = ReadFileType(tmpname); /* and try again */
-
+
/* if we made a /tmp file (from stdin, etc.) won't need it any more */
if (strcmp(fullname,filename)!=0) unlink(filename);
@@ -2013,7 +2411,58 @@
WaitCursor();
}
-
+
+#ifdef MACBINARY
+ if (handlemacb && macb_file == True) {
+ char tmpname[128];
+
+ if (RemoveMacbinary(filename, tmpname)) {
+ if (strcmp(fullname,filename)!=0) unlink(filename);
+ strcpy(origname, filename);
+ strcpy(filename, tmpname);
+ }
+ else filetype = RFT_ERROR;
+
+ WaitCursor();
+ }
+#endif
+
+#ifdef HAVE_MGCSFX_AUTO
+ if (filetype == RFT_MGCSFX) {
+ char tmpname[128], tmp[256];
+ char *icom;
+
+ if ((icom = mgcsfx_auto_input_com(filename)) != NULL) {
+ sprintf(tmpname, "%s/xvmsautoXXXXXX", tmpdir);
+#ifdef USE_MKSTEMP
+ close(mkstemp(tmpname));
+#else
+ mktemp(tmpname);
+#endif
+ SetISTR(ISTR_INFO, "Converting to known format by MgcSfx auto...");
+ sprintf(tmp,"%s >%s", icom, tmpname);
+ }
+ else goto ms_auto_no;
+
+#ifndef VMS
+ if (system(tmp))
+#else
+ if (!system(tmp))
+#endif
+ {
+ SetISTR(ISTR_INFO, "Unable to convert '%s' by MgcSfx auto.",
+ BaseName(filename));
+ Warning();
+ filetype = RFT_ERROR;
+ goto ms_auto_no;
+ }
+
+ filetype = ReadFileType(tmpname);
+ if (strcmp(fullname,filename)!=0) unlink(filename);
+ strcpy(filename, tmpname);
+ }
+ms_auto_no:
+#endif /* HAVE_MGCSFX_AUTO */
if (filetype == RFT_ERROR) {
char foostr[512];
@@ -2027,10 +2476,16 @@
if (filetype == RFT_UNKNOWN) {
/* view as a text/hex file */
- TextView(filename);
+#ifdef MACBINARY
+ if (origname[0])
+ i = TextView(origname);
+ else
+#endif
+ i = TextView(filename);
SetISTR(ISTR_INFO,"'%s' not in a recognized format.", basefname);
/* Warning(); */
- goto SHOWN_AS_TEXT;
+ if (i) goto SHOWN_AS_TEXT;
+ else goto FAILED;
}
if (filetype < RFT_ERROR) {
@@ -2058,8 +2513,9 @@
if (filetype == RFT_XBM && (!i || pinfo.w==0 || pinfo.h==0)) {
/* probably just a '.h' file or something... */
SetISTR(ISTR_INFO," ");
- TextView(filename);
- goto SHOWN_AS_TEXT;
+ i = TextView(filename);
+ if (i) goto SHOWN_AS_TEXT;
+ else goto FAILED;
}
if (!i) {
@@ -2084,7 +2540,7 @@
/**************/
/* SUCCESS!!! */
/**************/
-
+
GOTIMAGE:
/* successfully read this picture. No failures from here on out
@@ -2097,7 +2553,7 @@
if (conv24MB.flags[CONV24_LOCK]) { /* locked */
if (pinfo.type==PIC24 && picType==PIC8) { /* 24 -> 8 bit */
byte *pic8;
- pic8 = Conv24to8(pinfo.pic, pinfo.w, pinfo.h, ncols,
+ pic8 = Conv24to8(pinfo.pic, pinfo.w, pinfo.h, ncols,
pinfo.r, pinfo.g, pinfo.b);
free(pinfo.pic);
pinfo.pic = pic8;
@@ -2108,7 +2564,7 @@
else if (pinfo.type!=PIC24 && picType==PIC24) { /* 8 -> 24 bit */
byte *pic24;
- pic24 = Conv8to24(pinfo.pic, pinfo.w, pinfo.h,
+ pic24 = Conv8to24(pinfo.pic, pinfo.w, pinfo.h,
pinfo.r, pinfo.g, pinfo.b);
free(pinfo.pic);
pinfo.pic = pic24;
@@ -2144,7 +2600,7 @@
if (mainW && !useroot) {
/* avoid generating excess configure events while we resize the window */
- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
+ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
| StructureNotifyMask
| ButtonPressMask | KeyReleaseMask
| EnterWindowMask | LeaveWindowMask);
@@ -2162,11 +2618,13 @@
pHIGH = pinfo.h;
if (pinfo.frmType >=0) SetDirSaveMode(F_FORMAT, pinfo.frmType);
if (pinfo.colType >=0) SetDirSaveMode(F_COLORS, pinfo.colType);
-
+
SetISTR(ISTR_FORMAT, pinfo.fullInfo);
strcpy(formatStr, pinfo.shrtInfo);
picComments = pinfo.comment;
ChangeCommentText();
+ picExifInfo = pinfo.exifInfo;
+ picExifInfoSize = pinfo.exifInfoSize;
for (i=0; i<256; i++) {
rMap[i] = pinfo.r[i];
@@ -2194,12 +2652,15 @@
if (fullname && strcmp(fullname,filename)!=0) unlink(filename);
- SetISTR(ISTR_INFO,formatStr);
-
+ SetISTR(ISTR_INFO, "%s", formatStr);
+
SetInfoMode(INF_PART);
- SetISTR(ISTR_FILENAME,
- (filenum==DFLTPIC || filenum==GRABBED || frompipe)
- ? "" : basefname);
+ if (filenum==DFLTPIC || filenum==GRABBED || frompipe)
+ SetISTR(ISTR_FILENAME, "");
+ else if (numPages > 1)
+ SetISTR(ISTR_FILENAME, "%s Page %d of %d", basefname, curPage+1, numPages);
+ else
+ SetISTR(ISTR_FILENAME, "%s", basefname);
SetISTR(ISTR_RES,"%d x %d",pWIDE,pHIGH);
SetISTR(ISTR_COLOR, "");
@@ -2219,7 +2680,7 @@
/* handle various 'auto-whatever' command line options
- Note that if 'frompoll' is set, things that have to do with
+ Note that if 'frompoll' is set, things that have to do with
setting the expansion factor are skipped, as we'll want it to
display in the (already-existing) window at the same size */
@@ -2254,7 +2715,7 @@
w = eWIDE; h = (w*3) / 4;
eWIDE = w; eHIGH = h;
}
-
+
if (eWIDE != cWIDE || eHIGH != cHIGH) epic = (byte *) NULL;
@@ -2306,14 +2767,14 @@
aspWIDE = eWIDE; aspHIGH = eHIGH; /* aspect-corrected eWIDE,eHIGH */
if (hexpand < 0.0) eWIDE=(int)(aspWIDE / -hexpand); /* neg: reciprocal */
- else eWIDE=(int)(aspWIDE * hexpand);
+ else eWIDE=(int)(aspWIDE * hexpand);
if (vexpand < 0.0) eHIGH=(int)(aspHIGH / -vexpand); /* neg: reciprocal */
- else eHIGH=(int)(aspHIGH * vexpand);
+ else eHIGH=(int)(aspHIGH * vexpand);
if (maingeom) {
/* deal with geometry spec. Note, they shouldn't have given us
*both* an expansion factor and a geomsize. The geomsize wins out */
-
+
int i,x,y,gewide,gehigh; u_int w,h;
gewide = eWIDE; gehigh = eHIGH;
@@ -2321,11 +2782,11 @@
if (i&WidthValue) gewide = (int) w;
if (i&HeightValue) gehigh = (int) h;
-
+
/* handle case where the pinheads only specified width *or * height */
if (( i&WidthValue && ~i&HeightValue) ||
(~i&WidthValue && i&HeightValue)) {
-
+
if (i&WidthValue) { gehigh = (aspHIGH * gewide) / pWIDE; }
else { gewide = (aspWIDE * gehigh) / pHIGH; }
}
@@ -2391,7 +2852,7 @@
/* if we're using an integer tiled root mode, truncate eWIDE/eHIGH to
be an integer divisor of the display size */
-
+
if (useroot && (rootMode == RM_TILE || rootMode == RM_IMIRROR)) {
/* make picture size a divisor of the rootW size. round down */
i = (dispWIDE + eWIDE-1) / eWIDE; eWIDE = (dispWIDE + i-1) / i;
@@ -2409,7 +2870,7 @@
if (autodither && ncols>0) epicMode = EM_DITH;
/* if in CM_STDCMAP mode, and *not* in '-wait 0', then autodither */
- if (colorMapMode == CM_STDCMAP && waitsec != 0) epicMode = EM_DITH;
+ if (colorMapMode == CM_STDCMAP && waitsec != 0.0) epicMode = EM_DITH;
/* if -smooth or image has been shrunk to fit screen */
if (autosmooth || (pWIDE >maxWIDE || pHIGH>maxHIGH)
@@ -2419,7 +2880,7 @@
/* 'dithering' makes no sense in 24-bit mode */
if (picType == PIC24 && epicMode == EM_DITH) epicMode = EM_RAW;
-
+
SetEpicMode();
} /* end of !frompoll */
@@ -2450,7 +2911,7 @@
if (useroot) mainW = vrootW;
if (eWIDE != cWIDE || eHIGH != cHIGH) epic = (byte *) NULL;
- NewPicGetColors(autonorm, autohisteq);
+ NewPicGetColors(autonorm, autohisteq);
GenerateEpic(eWIDE, eHIGH); /* want to dither *after* color allocs */
CreateXImage();
@@ -2474,7 +2935,7 @@
SetISTR(ISTR_INFO,"%s %s %s", formatStr,
(picType==PIC8) ? "8-bit mode." : "24-bit mode.",
tmp);
-
+
SetInfoMode(INF_FULL);
if (freename) free(fullname);
@@ -2495,20 +2956,24 @@
to generate the correct exposes (particularly with 'BitGravity' turned
on */
- if (mainW && !useroot) GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH);
+ /*Brian T. Schellenberger: fix for X 4.2 refresh problem*/
+ if (mainW && !useroot) {
+ XSync(theDisp, False);
+ GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH);
+ }
return 1;
-
+
FAILED:
SetCursors(-1);
KillPageFiles(pinfo.pagebname, pinfo.numpages);
- if (fullname && strcmp(fullname,filename)!=0)
+ if (fullname && strcmp(fullname,filename)!=0)
unlink(filename); /* kill /tmp file */
if (freename) free(fullname);
- if (!fromint && !polling && filenum>=0 && filenum=0 && filenum 4 &&
+ strcasecmp(fname+strlen(fname)-5, ".wbmp")==0) rv = RFT_WBMP;
+
+ n = fread(magicno, (size_t) 1, sizeof(magicno), fp);
fclose(fp);
- if (n<30) return RFT_UNKNOWN; /* files less than 30 bytes long... */
+ if (n<=0) return RFT_UNKNOWN;
+
+ /* it is just barely possible that a few files could legitimately be as small
+ as 30 bytes (e.g., binary P{B,G,P}M format), so zero out rest of "magic
+ number" buffer and don't quit immediately if we read something small but
+ not empty */
+ if (n<30) memset(magicno+n, 0, sizeof(magicno)-n);
- rv = RFT_UNKNOWN;
+#ifdef MACBINARY
+ macb_file = False;
+ while (1) {
+#endif
- if (strncmp((char *) magicno,"GIF87a", (size_t) 6)==0 ||
- strncmp((char *) magicno,"GIF89a", (size_t) 6)==0) rv = RFT_GIF;
+#ifdef HAVE_MGCSFX
+ if (is_mgcsfx(fname, magicno, 30) != 0) rv = RFT_MGCSFX;
+ else
+#endif
+ if (strncmp((char *) magicno,"GIF87a", (size_t) 6)==0 ||
+ strncmp((char *) magicno,"GIF89a", (size_t) 6)==0) rv = RFT_GIF;
else if (strncmp((char *) magicno,"VIEW", (size_t) 4)==0 ||
- strncmp((char *) magicno,"WEIV", (size_t) 4)==0) rv = RFT_PM;
+ strncmp((char *) magicno,"WEIV", (size_t) 4)==0) rv = RFT_PM;
+
+#ifdef HAVE_PIC2
+ else if (magicno[0]=='P' && magicno[1]=='2' &&
+ magicno[2]=='D' && magicno[3]=='T') rv = RFT_PIC2;
+#endif
- else if (magicno[0] == 'P' && magicno[1]>='1' &&
- magicno[1]<='6') rv = RFT_PBM;
+ else if (magicno[0] == 'P' && magicno[1]>='1' &&
+ (magicno[1]<='6' || magicno[1]=='8')) rv = RFT_PBM;
/* note: have to check XPM before XBM, as first 2 chars are the same */
else if (strncmp((char *) magicno, "/* XPM */", (size_t) 9)==0) rv = RFT_XPM;
else if (strncmp((char *) magicno,"#define", (size_t) 7)==0 ||
- (magicno[0] == '/' && magicno[1] == '*')) rv = RFT_XBM;
+ (magicno[0] == '/' && magicno[1] == '*')) rv = RFT_XBM;
else if (magicno[0]==0x59 && (magicno[1]&0x7f)==0x26 &&
- magicno[2]==0x6a && (magicno[3]&0x7f)==0x15) rv = RFT_SUNRAS;
+ magicno[2]==0x6a && (magicno[3]&0x7f)==0x15) rv = RFT_SUNRAS;
- else if (magicno[0] == 'B' && magicno[1] == 'M') rv = RFT_BMP;
+ else if (magicno[0] == 'B' && magicno[1] == 'M') rv = RFT_BMP;
- else if (magicno[0]==0x52 && magicno[1]==0xcc) rv = RFT_UTAHRLE;
+ else if (magicno[0]==0x52 && magicno[1]==0xcc) rv = RFT_UTAHRLE;
else if ((magicno[0]==0x01 && magicno[1]==0xda) ||
- (magicno[0]==0xda && magicno[1]==0x01)) rv = RFT_IRIS;
+ (magicno[0]==0xda && magicno[1]==0x01)) rv = RFT_IRIS;
- else if (magicno[0]==0x1f && magicno[1]==0x9d) rv = RFT_COMPRESS;
+ else if (magicno[0]==0x1f && magicno[1]==0x9d) rv = RFT_COMPRESS;
#ifdef GUNZIP
- else if (magicno[0]==0x1f && magicno[1]==0x8b) rv = RFT_COMPRESS;
+ else if (magicno[0]==0x1f && magicno[1]==0x8b) rv = RFT_COMPRESS;
+#endif
+
+#ifdef BUNZIP2
+ else if (magicno[0]==0x42 && magicno[1]==0x5a) rv = RFT_BZIP2;
#endif
- else if (magicno[0]==0x0a && magicno[1] <= 5) rv = RFT_PCX;
+ else if (magicno[0]==0x0a && magicno[1] <= 5) rv = RFT_PCX;
- else if (strncmp((char *) magicno, "FORM", (size_t) 4)==0 &&
- strncmp((char *) magicno+8, "ILBM", (size_t) 4)==0) rv = RFT_IFF;
+ else if (strncmp((char *) magicno, "FORM", (size_t) 4)==0 &&
+ strncmp((char *) magicno+8, "ILBM", (size_t) 4)==0) rv = RFT_IFF;
else if (magicno[0]==0 && magicno[1]==0 &&
magicno[2]==2 && magicno[3]==0 &&
magicno[4]==0 && magicno[5]==0 &&
- magicno[6]==0 && magicno[7]==0) rv = RFT_TARGA;
+ magicno[6]==0 && magicno[7]==0) rv = RFT_TARGA;
else if (magicno[4]==0x00 && magicno[5]==0x00 &&
- magicno[6]==0x00 && magicno[7]==0x07) rv = RFT_XWD;
+ magicno[6]==0x00 && magicno[7]==0x07) rv = RFT_XWD;
- else if (strncmp((char *) magicno,"SIMPLE ", (size_t) 8)==0 &&
- magicno[29] == 'T') rv = RFT_FITS;
-
+ else if (strncmp((char *) magicno,"SIMPLE ", (size_t) 8)==0 &&
+ magicno[29] == 'T') rv = RFT_FITS;
+
+ /* [JCE] Spectrum screen */
+ else if (memcmp(magicno, ZXheader, (size_t) 18)==0) rv = RFT_ZX;
#ifdef HAVE_JPEG
- else if (magicno[0]==0xff && magicno[1]==0xd8 &&
- magicno[2]==0xff) rv = RFT_JFIF;
+ else if (magicno[0]==0xff && magicno[1]==0xd8 &&
+ magicno[2]==0xff) rv = RFT_JFIF;
+#endif
+
+#ifdef HAVE_JP2K
+ else if (magicno[0]==0xff && magicno[1]==0x4f &&
+ magicno[2]==0xff && magicno[3]==0x51) rv = RFT_JPC;
+
+ else if (memcmp(magicno, jp2k_magic, sizeof(jp2k_magic))==0) rv = RFT_JP2;
#endif
#ifdef HAVE_TIFF
else if ((magicno[0]=='M' && magicno[1]=='M') ||
- (magicno[0]=='I' && magicno[1]=='I')) rv = RFT_TIFF;
+ (magicno[0]=='I' && magicno[1]=='I')) rv = RFT_TIFF;
+#endif
+
+#ifdef HAVE_PNG
+ else if (magicno[0]==0x89 && magicno[1]=='P' &&
+ magicno[2]=='N' && magicno[3]=='G') rv = RFT_PNG;
#endif
#ifdef HAVE_PDS
@@ -2620,11 +3130,67 @@
rv = RFT_PDSVICAR;
#endif
-#ifdef GS_PATH
+#ifdef GS_PATH /* Ghostscript handles both PostScript and PDF */
else if (strncmp((char *) magicno, "%!", (size_t) 2)==0 ||
- strncmp((char *) magicno, "\004%!", (size_t) 3)==0) rv = RFT_PS;
+ strncmp((char *) magicno, "\004%!", (size_t) 3)==0 ||
+ strncmp((char *) magicno, "%PDF", (size_t) 4)==0) rv = RFT_PS;
+#endif
+
+#ifdef HAVE_G3
+ else if ((magicno[0]== 1 && magicno[1]== 1 &&
+ magicno[2]== 77 && magicno[3]==154 &&
+ magicno[4]==128 && magicno[5]== 0 &&
+ magicno[6]== 1 && magicno[7]== 77)
+ || highresfax || fax) /* kludge! */ rv = RFT_G3;
+#endif
+
+#ifdef HAVE_MAG
+ else if (strncmp((char *) magicno,"MAKI02 ", (size_t) 8)==0) rv = RFT_MAG;
+#endif
+
+#ifdef HAVE_MAKI
+ else if (strncmp((char *) magicno,"MAKI01A ", (size_t) 8)==0 ||
+ strncmp((char *) magicno,"MAKI01B ", (size_t) 8)==0) rv = RFT_MAKI;
+#endif
+
+#ifdef HAVE_PIC
+ else if (magicno[0]=='P' && magicno[1]=='I'&&magicno[2]=='C') rv = RFT_PIC;
+#endif
+
+#ifdef HAVE_PI
+ else if (magicno[0]=='P' && magicno[1]=='i') rv = RFT_PI;
+#endif
+
+#ifdef HAVE_HIPS
+ else if (strstr((char *) magicno, "./digest")) rv = RFT_HIPS;
+#endif
+
+#ifdef HAVE_PCD
+ else if (magicno[0]==0xff && magicno[1]==0xff &&
+ magicno[2]==0xff && magicno[3]==0xff) rv = RFT_PCD;
#endif
+#ifdef MACBINARY
+ /* Now we try to handle MacBinary files, but the method is VERY dirty... */
+ if (macbin_alrchk == True) {
+ macb_file = True;
+ break;
+ }
+
+ if (rv != RFT_UNKNOWN)
+ break;
+
+ /* Skip MACBSIZE and recheck */
+ macbin_alrchk = True;
+ fp = xv_fopen(fname, "r");
+ if (!fp) return RFT_ERROR;
+ fseek(fp, MACBSIZE, SEEK_SET);
+ n = fread(magicno, (size_t) 1, (size_t) 30, fp);
+ fclose(fp);
+
+ if (n<30) return RFT_UNKNOWN; /* files less than 30 bytes long... */
+ }
+#endif
return rv;
}
@@ -2637,9 +3203,10 @@
PICINFO *pinfo;
{
/* if quick is set, we're being called to generate icons, or something
- like that. We should load the image as quickly as possible. Currently,
- this only affects the LoadPS routine, which, if quick is set, only
- generates the page file for the first page of the document */
+ like that. We should load the image as quickly as possible. Previously,
+ this affected only the LoadPS routine, which, if quick is set, only
+ generates the page file for the first page of the document. Now it
+ also affects PCD, which loads only a thumbnail. */
int rv = 0;
@@ -2650,7 +3217,11 @@
switch (ftype) {
case RFT_GIF: rv = LoadGIF (fname, pinfo); break;
case RFT_PM: rv = LoadPM (fname, pinfo); break;
+#ifdef HAVE_MGCSFX
+ case RFT_PBM: rv = LoadPBM (fname, pinfo, -1); break;
+#else
case RFT_PBM: rv = LoadPBM (fname, pinfo); break;
+#endif
case RFT_XBM: rv = LoadXBM (fname, pinfo); break;
case RFT_SUNRAS: rv = LoadSunRas(fname, pinfo); break;
case RFT_BMP: rv = LoadBMP (fname, pinfo); break;
@@ -2662,21 +3233,69 @@
case RFT_XPM: rv = LoadXPM (fname, pinfo); break;
case RFT_XWD: rv = LoadXWD (fname, pinfo); break;
case RFT_FITS: rv = LoadFITS (fname, pinfo, quick); break;
+ case RFT_ZX: rv = LoadZX (fname, pinfo); break; /* [JCE] */
+ case RFT_WBMP: rv = LoadWBMP (fname, pinfo); break;
+
+#ifdef HAVE_PCD
+ /* if quick is switched on, use the smallest image size; don't ask the user */
+ case RFT_PCD: rv = LoadPCD (fname, pinfo, quick ? 0 : PcdSize); break;
+#endif
#ifdef HAVE_JPEG
- case RFT_JFIF: rv = LoadJFIF (fname, pinfo, quick); break;
+ case RFT_JFIF: rv = LoadJFIF (fname, pinfo, quick); break;
+#endif
+
+#ifdef HAVE_JP2K
+ case RFT_JPC: rv = LoadJPC (fname, pinfo, quick); break;
+ case RFT_JP2: rv = LoadJP2 (fname, pinfo, quick); break;
#endif
#ifdef HAVE_TIFF
- case RFT_TIFF: rv = LoadTIFF (fname, pinfo); break;
+ case RFT_TIFF: rv = LoadTIFF (fname, pinfo, quick); break;
+#endif
+
+#ifdef HAVE_PNG
+ case RFT_PNG: rv = LoadPNG (fname, pinfo); break;
#endif
#ifdef HAVE_PDS
- case RFT_PDSVICAR: rv = LoadPDS (fname, pinfo); break;
+ case RFT_PDSVICAR: rv = LoadPDS (fname, pinfo); break;
+#endif
+
+#ifdef HAVE_G3
+ case RFT_G3: rv = LoadG3 (fname, pinfo); break;
#endif
#ifdef GS_PATH
- case RFT_PS: rv = LoadPS (fname, pinfo, quick); break;
+ case RFT_PS: rv = LoadPS (fname, pinfo, quick); break;
+#endif
+
+#ifdef HAVE_MAG
+ case RFT_MAG: rv = LoadMAG (fname, pinfo); break;
+#endif
+
+#ifdef HAVE_MAKI
+ case RFT_MAKI: rv = LoadMAKI (fname, pinfo); break;
+#endif
+
+#ifdef HAVE_PIC
+ case RFT_PIC: rv = LoadPIC (fname, pinfo); break;
+#endif
+
+#ifdef HAVE_PI
+ case RFT_PI: rv = LoadPi (fname, pinfo); break;
+#endif
+
+#ifdef HAVE_PIC2
+ case RFT_PIC2: rv = LoadPIC2 (fname, pinfo, quick); break;
+#endif
+
+#ifdef HAVE_HIPS
+ case RFT_HIPS: rv = LoadHIPS (fname, pinfo); break;
+#endif
+
+#ifdef HAVE_MGCSFX
+ case RFT_MGCSFX: rv = LoadMGCSFX (fname, pinfo); break;
#endif
}
@@ -2685,13 +3304,17 @@
/********************************/
-int UncompressFile(name, uncompname)
+int UncompressFile(name, uncompname, filetype)
char *name, *uncompname;
+ int filetype;
{
/* returns '1' on success, with name of uncompressed file in uncompname
returns '0' on failure */
char namez[128], *fname, buf[512];
+#ifndef USE_MKSTEMP
+ int tmpfd;
+#endif
fname = name;
namez[0] = '\0';
@@ -2703,7 +3326,7 @@
to what it was. necessary because uncompress doesn't handle files
that don't end with '.Z' */
- if (strlen(name) >= (size_t) 2 &&
+ if (strlen(name) >= (size_t) 2 &&
strcmp(name + strlen(name)-2,".Z")!=0 &&
strcmp(name + strlen(name)-2,".z")!=0) {
strcpy(namez, name);
@@ -2721,34 +3344,50 @@
#endif /* not VMS and not GUNZIP */
-
#ifndef VMS
sprintf(uncompname, "%s/xvuXXXXXX", tmpdir);
- mktemp(uncompname);
- sprintf(buf,"%s -c %s >%s", UNCOMPRESS, fname, uncompname);
-#else /* it IS VMS */
+#else
strcpy(uncompname, "[]xvuXXXXXX");
+#endif
+
+#ifdef USE_MKSTEMP
+ close(mkstemp(uncompname));
+#else
mktemp(uncompname);
-# ifdef GUNZIP
- sprintf(buf,"%s %s %s", UNCOMPRESS, fname, uncompname);
-# else
- sprintf(buf,"%s %s", UNCOMPRESS, fname);
-# endif
+ tmpfd = open(uncompname,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR);
+ if (tmpfd < 0) FatalError("UncompressFile(): can't create temporary file");
+ close(tmpfd);
+#endif
+
+#ifndef VMS
+ if (filetype == RFT_COMPRESS)
+ sprintf(buf,"%s -c '%s' > '%s'", UNCOMPRESS, fname, uncompname);
+# ifdef BUNZIP2
+ else if (filetype == RFT_BZIP2)
+ sprintf(buf,"%s -c '%s' > '%s'", BUNZIP2, fname, uncompname);
+# endif
+#else /* it IS VMS */
+# ifdef GUNZIP
+ sprintf(buf,"%s '%s' '%s'", UNCOMPRESS, fname, uncompname);
+# else
+ sprintf(buf,"%s '%s'", UNCOMPRESS, fname);
+# endif
#endif
SetISTR(ISTR_INFO, "Uncompressing '%s'...", BaseName(fname));
#ifndef VMS
- if (system(buf)) {
+ if (system(buf))
#else
- if (!system(buf)) {
+ if (!system(buf))
#endif
+ {
SetISTR(ISTR_INFO, "Unable to uncompress '%s'.", BaseName(fname));
Warning();
return 0;
}
-#ifndef VMS
- /* if we renamed the file to end with a .Z for the sake of 'uncompress',
+#ifndef VMS
+ /* if we renamed the file to end with a .Z for the sake of 'uncompress',
rename it back to what it once was... */
if (strlen(namez)) {
@@ -2769,9 +3408,65 @@
}
*/
#endif /* not VMS */
-
+
+ return 1;
+}
+
+
+#ifdef MACBINARY
+/********************************/
+int RemoveMacbinary(src, dst)
+ char *src, *dst;
+{
+ char buffer[8192]; /* XXX */
+ int n, eof;
+#ifndef USE_MKSTEMP
+ int tmpfd;
+#endif
+ FILE *sfp, *dfp;
+
+ sprintf(dst, "%s/xvmXXXXXX", tmpdir);
+#ifdef USE_MKSTEMP
+ close(mkstemp(dst));
+#else
+ mktemp(dst);
+ tmpfd = open(dst,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR);
+ if (tmpfd < 0) FatalError("RemoveMacbinary(): can't create temporary file");
+#endif
+
+ SetISTR(ISTR_INFO, "Removing MacBinary...");
+
+ sfp = xv_fopen(src, "r");
+#ifdef USE_MKSTEMP
+ dfp = xv_fopen(dst, "w");
+#else
+ dfp = fdopen(tmpfd, "w");
+#endif
+ if (!sfp || !dfp) {
+ SetISTR(ISTR_INFO, "Unable to remove a InfoFile header form '%s'.", src);
+ Warning();
+ return 0;
+ }
+ fseek(sfp, MACBSIZE, SEEK_SET);
+ while ((n = fread(buffer, 1, sizeof(buffer), sfp)) == 8192) /* XXX */
+ fwrite(buffer, 1, n, dfp);
+ if ((eof = feof(sfp)))
+ fwrite(buffer, 1, n, dfp);
+ fclose(sfp);
+ fflush(dfp);
+ fclose(dfp);
+#ifndef USE_MKSTEMP
+ close(tmpfd);
+#endif
+ if (!eof) {
+ SetISTR(ISTR_INFO, "Unable to remove a InfoFile header form '%s'.", src);
+ Warning();
+ return 0;
+ }
+
return 1;
}
+#endif
/********************************/
@@ -2789,6 +3484,10 @@
sprintf(tmp, "%s%d", bname, i);
unlink(tmp);
}
+
+ /* GRR 20070506: basename file doesn't go away, at least on Linux and for
+ * GIF and TIFF images, so explicitly unlink() it, too */
+ unlink(bname);
}
@@ -2798,11 +3497,11 @@
{
int i;
- /* some stuff that necessary whenever running an algorithm or
+ /* some stuff that necessary whenever running an algorithm or
installing a new 'pic' (or switching 824 modes) */
numcols = 0; /* gets set by SortColormap: set to 0 for PIC24 images */
- for (i=0; i<256; i++) cols[i]=infobg;
+ for (i=0; i<256; i++) cols[i]=infobg;
if (picType == PIC8) {
byte trans[256];
@@ -2811,18 +3510,18 @@
}
if (picType == PIC8) {
- /* see if image is a b/w bitmap.
+ /* see if image is a b/w bitmap.
If so, use '-black' and '-white' colors */
if (numcols == 2) {
if ((rMap[0] == gMap[0] && rMap[0] == bMap[0] && rMap[0] == 255) &&
(rMap[1] == gMap[1] && rMap[1] == bMap[1] && rMap[1] == 0)) {
/* 0=wht, 1=blk */
- rMap[0] = (whtRGB>>16)&0xff;
- gMap[0] = (whtRGB>>8)&0xff;
+ rMap[0] = (whtRGB>>16)&0xff;
+ gMap[0] = (whtRGB>>8)&0xff;
bMap[0] = whtRGB&0xff;
rMap[1] = (blkRGB>>16)&0xff;
- gMap[1] = (blkRGB>>8)&0xff;
+ gMap[1] = (blkRGB>>8)&0xff;
bMap[1] = blkRGB&0xff;
}
@@ -2852,10 +3551,10 @@
}
/* save the desired RGB colormap (before dicking with it) */
- for (i=0; i /tmp/xv******" appended).
+ * runs command (with "> /tmp/xv******" appended).
* returns "/tmp/xv******" in fname
* returns '0' if everything's cool, '1' on error
*/
char fullcmd[512], tmpname[64], str[512];
int i;
+#ifndef USE_MKSTEMP
+ int tmpfd;
+#endif
if (!cmd || (strlen(cmd) < (size_t) 2)) return 1;
sprintf(tmpname,"%s/xvXXXXXX", tmpdir);
+#ifdef USE_MKSTEMP
+ close(mkstemp(tmpname));
+#else
mktemp(tmpname);
- if (tmpname[0] == '\0') { /* mktemp() blew up */
+ tmpfd = open(tmpname,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR);
+ if (tmpfd < 0) FatalError("openPic(): can't create temporary file");
+ close(tmpfd);
+#endif
+ if (tmpname[0] == '\0') { /* mktemp() or mkstemp() blew up */
sprintf(str,"Unable to create temporary filename.");
ErrPopUp(str, "\nHow unlikely!");
return 1;
@@ -2939,26 +3648,21 @@
{
int i;
+ waitsec = (numnames <= 1)? waitsec_final : waitsec_nonfinal;
+
if (!numnames) { openPic(DFLTPIC); return; }
i = 0;
- if (!randomShow) {
- while (numnames>0) {
- if (openPic(0)) return; /* success */
- else {
- if (polling && !i)
- fprintf(stderr,"%s: POLLING: Waiting for file '%s' \n\tto %s\n",
- cmd, namelist[0], "be created, or whatever...");
- i = 1;
- }
+ while (numnames>0) {
+ if (openPic(0)) return; /* success */
+ else {
+ if (polling && !i)
+ fprintf(stderr,"%s: POLLING: Waiting for file '%s' \n\tto %s\n",
+ cmd, namelist[0], "be created, or whatever...");
+ i = 1;
}
}
- else { /* pick random first picture */
- for (i=findRandomPic(); i>=0; i=findRandomPic())
- if (openPic(i)) return; /* success */
- }
-
if (numnames>1) FatalError("couldn't open any pictures");
else Quit(-1);
}
@@ -2970,11 +3674,11 @@
int i;
if (curname>=0) i = curname+1;
- else if (nList.selected >= 0 && nList.selected < numnames)
+ else if (nList.selected >= 0 && nList.selected < numnames)
i = nList.selected;
else i = 0;
-
+
while (i=0) i = curname+1;
- else if (nList.selected >= 0 && nList.selected < numnames)
- i = nList.selected;
- else i = 0;
+ if (curname>=0) i = curname+1;
+ else if (nList.selected >= 0 && nList.selected < numnames)
+ i = nList.selected;
+ else i = 0;
- while (i=0; i=findRandomPic())
- if (openPic(i)) return;
- }
+ waitsec = (i == numnames-1)? waitsec_final : waitsec_nonfinal;
+
+ while (i=0) i = curname+1;
- else if (nList.selected >= 0 && nList.selected < numnames)
- i = nList.selected;
- else i = 0;
+ if (curname>=0) i = curname+1;
+ else if (nList.selected >= 0 && nList.selected < numnames)
+ i = nList.selected;
+ else i = 0;
+
+ if (loop) { i = 0; loop = 0; }
- if (loop) { i = 0; loop = 0; }
+ waitsec = (i == numnames-1)? waitsec_final : waitsec_nonfinal;
- while (i=0; i=findRandomPic())
- if (openPic(i)) return;
- }
+ while (i0) i = curname-1;
- else if (nList.selected>0 && nList.selected < numnames)
+ else if (nList.selected>0 && nList.selected < numnames)
i = nList.selected - 1;
else i = numnames-1;
@@ -3063,64 +3759,24 @@
openPic(LOADPIC);
}
-
-
-
-/****************/
-static int findRandomPic()
-/****************/
-{
- static byte *loadList;
- static int left_to_load, listLen = -1;
- int k;
- time_t t;
-
- /* picks a random name out of the list, and returns it's index. If there
- are no more names to pick, it returns '-1' and resets itself */
-
- if (!loadList || numnames!=listLen) {
- if (loadList) free(loadList);
- else {
- time(&t);
- srandom((unsigned int) t); /* seed the random */
- }
-
- left_to_load = listLen = numnames;
- loadList = (byte *) malloc((size_t) listLen);
- for (k=0; k= 0, a filenum to GOTO */
int i;
- /* if curname<0 (there is no 'current' file), 'Next' means view the
+ /* if curname<0 (there is no 'current' file), 'Next' means view the
selected file (or the 0th file, if no selection either), and 'Prev' means
view the one right before the selected file */
- openFirstPic(); /* find first displayable picture, exit if none */
+ /* find first displayable picture, exit if none */
+ if (!startGrab) openFirstPic();
if (!pic) { /* must've opened a text file... display dflt pic */
- openPic(DFLTPIC);
+ if (!startGrab) openPic(DFLTPIC);
if (mainW && !useroot) RaiseTextWindows();
}
@@ -3133,7 +3789,7 @@
}
else if (i==PREVPIC) {
- if (curname>0 || (curname<0 && nList.selected>0))
+ if (curname>0 || (curname<0 && nList.selected>0))
openPrevPic();
}
@@ -3151,7 +3807,7 @@
else if (i==THISNEXT) { /* open current sel, 'next' until success */
int j;
- j = nList.selected;
+ j = nList.selected;
if (j<0) j = 0;
while (j vrWIDE) x = vrWIDE - eWIDE; /* keep on screen */
+ /* keep on screen */
+ if (x+eWIDE > vrWIDE) x = vrWIDE - eWIDE;
if (y+eHIGH > vrHIGH) y = vrHIGH - eHIGH;
-
+ if (x < 0) x = 0;
+ if (y < 0) y = 0;
#define VROOT_TRANS
#ifdef VROOT_TRANS
- if (vrootW != rootW) { /* virtual window manager running */
+ if (vrootW != rootW && !(hints.flags & USPosition)) { /* virtual window manager running */
int x1,y1;
Window child;
+
XTranslateCoordinates(theDisp, rootW, vrootW, x, y, &x1, &y1, &child);
- if (DEBUG) fprintf(stderr,"translate: %d,%d -> %d,%d\n",x,y,x1,y1);
+ if (DEBUG) fprintf(stderr,"translate: %d,%d -> %d,%d\n", x, y, x1, y1);
x = x1; y = y1;
}
#endif
@@ -3218,13 +3887,13 @@
hints.x = x; hints.y = y;
hints.width = eWIDE; hints.height = eHIGH;
hints.max_width = maxWIDE; hints.max_height = maxHIGH;
- hints.flags |= USSize | PMaxSize;
-
- xswa.bit_gravity = StaticGravity;
+ hints.flags |= PSize | PMaxSize;
+
+ xswa.bit_gravity = StaticGravity;
xswa.background_pixel = bg;
xswa.border_pixel = fg;
xswa.colormap = theCmap;
-
+
xswa.backing_store = WhenMapped;
/* NOTE: I've turned 'backing-store' off on the image window, as some
@@ -3233,9 +3902,9 @@
improvement anyway (for the image window), unless you're on a slow
network. In any event, I'm not *turning off* backing store, I'm
just not explicitly turning it *on*. If your X server is set up
- that windows, by default, have backing-store turned on, then the
+ that windows, by default, have backing-store turned on, then the
image window will, too */
-
+
xswamask = CWBackPixel | CWBorderPixel | CWColormap /* | CWBackingStore */;
if (!clearonload) xswamask |= CWBitGravity;
@@ -3244,18 +3913,18 @@
xwa.width = eWIDE; xwa.height = eHIGH;
/* try to keep the damned thing on-screen, if possible */
- if (xwa.x + xwa.width > dispWIDE) xwa.x = dispWIDE - xwa.width;
- if (xwa.y + xwa.height > dispHIGH) xwa.y = dispHIGH - xwa.height;
+ if (xwa.x + xwa.width > vrWIDE) xwa.x = vrWIDE - xwa.width;
+ if (xwa.y + xwa.height > vrHIGH) xwa.y = vrHIGH - xwa.height;
if (xwa.x < 0) xwa.x = 0;
if (xwa.y < 0) xwa.y = 0;
SetWindowPos(&xwa);
hints.flags = PSize | PMaxSize;
- }
+ }
else {
mainW = XCreateWindow(theDisp,rootW,x,y, (u_int) eWIDE, (u_int) eHIGH,
- (u_int) bwidth, (int) dispDEEP, InputOutput,
+ (u_int) bwidth, (int) dispDEEP, InputOutput,
theVisual, xswamask, &xswa);
if (!mainW) FatalError("can't create window!");
@@ -3267,15 +3936,11 @@
}
}
-
- XSetStandardProperties(theDisp,mainW,"","",None,NULL,0,&hints);
- setWinIconNames(name);
-
xwmh.input = True;
xwmh.flags = InputHint;
- xwmh.icon_pixmap = iconPix;
- xwmh.icon_mask = iconmask;
+ xwmh.icon_pixmap = iconPix;
+ xwmh.icon_mask = iconmask;
xwmh.flags |= (IconPixmapHint | IconMaskHint);
@@ -3295,14 +3960,15 @@
}
}
}
- XSetWMHints(theDisp, mainW, &xwmh);
classh.res_name = "xv";
classh.res_class = "XVroot";
- XSetClassHint(theDisp, mainW, &classh);
+ XmbSetWMProperties(theDisp, mainW, NULL, NULL, NULL, 0, &hints, &xwmh,
+ &classh);
+ setWinIconNames(name);
- if (nodecor) { /* turn of image window decorations (in MWM) */
+ if (nodecor) { /* turn of image window decorations (in MWM) */
Atom mwm_wm_hints;
struct s_mwmhints {
long flags;
@@ -3311,7 +3977,7 @@
u_long input_mode;
long status;
} mwmhints;
-
+
mwm_wm_hints = XInternAtom(theDisp, "_MOTIF_WM_HINTS", False);
if (mwm_wm_hints != None) {
xvbzero((char *) &mwmhints, sizeof(mwmhints));
@@ -3319,20 +3985,20 @@
mwmhints.decorations = 4;
XChangeProperty(theDisp, mainW, mwm_wm_hints, mwm_wm_hints, 32,
- PropModeReplace, (byte *) &mwmhints,
- (int) (sizeof(mwmhints))/4);
+ PropModeReplace, (byte *) &mwmhints,
+ (int) (sizeof(mwmhints))/4);
XSync(theDisp, False);
}
}
-
+
firstTime = 0;
}
/***********************************/
static void setWinIconNames(name)
- char *name;
+ const char *name;
{
char winname[256], iconname[256];
@@ -3362,12 +4028,12 @@
/***********************************/
void FixAspect(grow,w,h)
-int grow;
-int *w, *h;
+ int grow;
+ int *w, *h;
{
/* computes new values of eWIDE and eHIGH which will have aspect ratio
- 'normaspect'. If 'grow' it will preserve aspect by enlarging,
- otherwise, it will shrink to preserve aspect ratio.
+ 'normaspect'. If 'grow' it will preserve aspect by enlarging,
+ otherwise, it will shrink to preserve aspect ratio.
Returns these values in 'w' and 'h' */
float xr,yr,curaspect,a,exp;
@@ -3380,14 +4046,14 @@
curaspect = xr / yr;
/* if too narrow & shrink, shrink height. too wide and grow, grow height */
- if ((curaspect < normaspect && !grow) ||
+ if ((curaspect < normaspect && !grow) ||
(curaspect > normaspect && grow)) { /* modify height */
exp = curaspect / normaspect;
*h = (int) (eHIGH * exp + .5);
}
/* if too narrow & grow, grow width. too wide and shrink, shrink width */
- if ((curaspect < normaspect && grow) ||
+ if ((curaspect < normaspect && grow) ||
(curaspect > normaspect && !grow)) { /* modify width */
exp = normaspect / curaspect;
*w = (int) (eWIDE * exp + .5);
@@ -3423,22 +4089,22 @@
suffix = namelist[0];
prelen = 0; /* length of prefix to be removed */
n = i = 0; /* shut up pesky compiler warnings */
-
+
done = 0;
while (!done) {
suffix = (char *) index(suffix,'/'); /* find next '/' in file name */
if (!suffix) break;
-
+
suffix++; /* go past it */
n = suffix - namelist[0];
for (i=1; i (nList.w-10-16)) { /* have to trunc. */
tmp = dname;
while (1) {
tmp = (char *) index(tmp,'/'); /* find next '/' in filename */
if (!tmp) { tmp = dname; break; }
-
+
tmp++; /* move to char following the '/' */
if (StringWidth(tmp) <= (nList.w-10-16)) { /* is cool now */
j++; break;
@@ -3484,9 +4150,9 @@
name = GetDirFName();
GetDirPath(cwd);
-
+
AddFNameToCtrlList(cwd, name);
-
+
if (select) {
nList.selected = numnames-1;
curname = numnames - 1;
@@ -3498,35 +4164,35 @@
/***********************************/
void AddFNameToCtrlList(fpath,fname)
- char *fpath, *fname;
+ const char *fpath, *fname;
{
/* stick given path/name into 'namelist'. Doesn't redraw list */
-
- char *fullname, *dname;
+
+ char *fullname;
char cwd[MAXPATHLEN], globnm[MAXPATHLEN+100];
int i;
-
+
if (!fpath) fpath = ""; /* bulletproofing... */
- if (!fname) fname = "";
-
+ if (!fname) fname = "";
+
if (numnames == MAXNAMES) return; /* full up */
-
+
/* handle globbing */
if (fname[0] == '~') {
strcpy(globnm, fname);
Globify(globnm);
fname = globnm;
}
-
+
if (fname[0] != '/') { /* prepend path */
strcpy(cwd, fpath); /* copy it to a modifiable place */
-
+
/* make sure fpath has a trailing '/' char */
if (strlen(cwd)==0 || cwd[strlen(cwd)-1]!='/') strcat(cwd, "/");
-
+
fullname = (char *) malloc(strlen(cwd) + strlen(fname) + 2);
if (!fullname) FatalError("couldn't alloc name in AddFNameToCtrlList()\n");
-
+
sprintf(fullname, "%s%s", cwd, fname);
}
else { /* copy name to fullname */
@@ -3534,15 +4200,15 @@
if (!fullname) FatalError("couldn't alloc name in AddFNameToCtrlList()\n");
strcpy(fullname, fname);
}
-
-
+
+
/* see if this name is a duplicate. Don't add it if it is. */
for (i=0; i0));
}
}
-
+
/***********************************/
int DeleteCmd()
{
/* 'delete' button was pressed. Pop up a dialog box to determine
what should be deleted, then do it.
- returns '1' if THE CURRENTLY VIEWED entry was deleted from the list,
- in which case the 'selected' filename on the ctrl list is now
+ returns '1' if THE CURRENTLY VIEWED entry was deleted from the list,
+ in which case the 'selected' filename on the ctrl list is now
different, and should be auto-loaded, or something */
- static char *bnames[] = { "\004Disk File", "\nList Entry", "\033Cancel" };
+ static const char *bnames[] =
+ { "\004Disk File", "\nList Entry", "\033Cancel" };
char str[512];
int del, i, delnum, rv;
@@ -3610,15 +4277,14 @@
delnum = nList.selected;
if (delnum < 0 || delnum >= numnames) return 0;
- sprintf(str,"Delete '%s'?\n\n%s%s",
- namelist[delnum],
+ sprintf(str, "Delete '%s'?\n\n%s%s", namelist[delnum],
"'List Entry' deletes selection from list.\n",
"'Disk File' deletes file associated with selection.");
del = PopUp(str, bnames, 3);
-
+
if (del == 2) return 0; /* cancel */
-
+
if (del == 0) { /* 'Disk File' */
char *name;
if (namelist[delnum][0] != '/') { /* prepend 'initdir' */
@@ -3669,13 +4335,13 @@
if (delnum != numnames-1) {
/* snip out of namelist and dispnames lists */
- xvbcopy((char *) &namelist[delnum+1], (char *) &namelist[delnum],
+ xvbcopy((char *) &namelist[delnum+1], (char *) &namelist[delnum],
(numnames - delnum - 1) * sizeof(namelist[0]));
- xvbcopy((char *) &dispnames[delnum+1], (char *) &dispnames[delnum],
+ xvbcopy((char *) &dispnames[delnum+1], (char *) &dispnames[delnum],
(numnames - delnum - 1) * sizeof(dispnames[0]));
}
-
+
numnames--;
if (numnames==0) BTSetActive(&but[BDELETE],0);
windowMB.dim[WMB_TEXTVIEW] = (numnames==0);
@@ -3686,7 +4352,7 @@
if (nList.selected >= numnames) nList.selected = numnames-1;
if (nList.selected < 0) nList.selected = 0;
- SCSetRange(&nList.scrl, 0, numnames - nList.nlines,
+ SCSetRange(&nList.scrl, 0, numnames - nList.nlines,
nList.scrl.val, nList.nlines-1);
ScrollToCurrent(&nList);
DrawCtrlNumFiles();
@@ -3753,7 +4419,7 @@
if (useroot && resetroot) ClearRoot();
if (mainW == (Window) NULL || useroot) { /* window not visible */
- useroot = 0;
+ useroot = 0;
if (haveoldinfo) { /* just remap mainW and resize it */
XWMHints xwmh;
@@ -3771,8 +4437,8 @@
xwmh.input = True;
xwmh.flags = InputHint;
- xwmh.icon_pixmap = iconPix;
- xwmh.icon_mask = iconmask;
+ xwmh.icon_pixmap = iconPix;
+ xwmh.icon_mask = iconmask;
xwmh.flags |= ( IconPixmapHint | IconMaskHint) ;
xwmh.flags |= StateHint;
@@ -3787,7 +4453,7 @@
else { /* first time. need to create mainW */
mainW = (Window) NULL;
createMainWindow(maingeom, fnam);
- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
+ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
| StructureNotifyMask | ButtonPressMask
| KeyReleaseMask | ColormapChangeMask
| EnterWindowMask | LeaveWindowMask );
@@ -3802,7 +4468,7 @@
else { /* mainW already visible */
createMainWindow(maingeom, fnam);
- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
+ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
| StructureNotifyMask | ButtonPressMask
| KeyReleaseMask | ColormapChangeMask
| EnterWindowMask | LeaveWindowMask );
@@ -3845,13 +4511,13 @@
if (LocalCmap) regen=1;
/* this reallocs the colors */
- if (colorMapMode==CM_PERFECT || colorMapMode==CM_OWNCMAP)
+ if (colorMapMode==CM_PERFECT || colorMapMode==CM_OWNCMAP)
ChangeCmapMode(CM_NORMAL, 0, 0);
-
-
+
+
XUnmapWindow(theDisp, mainW);
mainW = vrootW;
-
+
if (!ctrlUp) { /* make sure ctrl is up when going to 'root' mode */
XWMHints xwmh;
xwmh.input = True;
@@ -3861,7 +4527,7 @@
CtrlBox(1);
}
}
-
+
useroot = 1;
rootMode = dispMode - RMB_ROOT;
ew = eWIDE; eh = eHIGH;
@@ -3877,7 +4543,7 @@
GenerateEpic(ew, eh);
CreateXImage();
}
- else if (regen) CreateXImage();
+ else if (regen) CreateXImage();
KillOldRootInfo();
MakeRootPic();
@@ -3923,7 +4589,7 @@
if (*numn == maxn) {
- fprintf(stderr, "%s: too many filenames. Only using first %d.\n",
+ fprintf(stderr, "%s: too many filenames. Using only first %d.\n",
flist, maxn);
}
@@ -3947,14 +4613,14 @@
/***********************************/
int rd_int(name)
- char *name;
+ const char *name;
{
/* returns '1' if successful. result in def_int */
if (rd_str_cl(name, "", 0)) { /* sets def_str */
if (sscanf(def_str, "%d", &def_int) == 1) return 1;
else {
- fprintf(stderr, "%s: couldn't read integer value for %s resource\n",
+ fprintf(stderr, "%s: couldn't read integer value for %s resource\n",
cmd, name);
return 0;
}
@@ -3965,7 +4631,7 @@
/***********************************/
int rd_str(name)
- char *name;
+ const char *name;
{
return rd_str_cl(name, "", 0);
}
@@ -3973,17 +4639,17 @@
/***********************************/
int rd_flag(name)
-char *name;
+ const char *name;
{
/* returns '1' if successful. result in def_int */
-
+
char buf[256];
if (rd_str_cl(name, "", 0)) { /* sets def_str */
strcpy(buf, def_str);
lower_str(buf);
- def_int = (strcmp(buf, "on")==0) ||
+ def_int = (strcmp(buf, "on")==0) ||
(strcmp(buf, "1")==0) ||
(strcmp(buf, "true")==0) ||
(strcmp(buf, "yes")==0);
@@ -3992,16 +4658,16 @@
else return 0;
}
-
+
static int xrm_initted = 0;
-
+
/***********************************/
int rd_str_cl (name_str, class_str, reinit)
- char *name_str;
- char *class_str;
+ const char *name_str;
+ const char *class_str;
int reinit;
{
/* note: *all* X resource reading goes through this routine... */
@@ -4043,16 +4709,30 @@
unsigned long nitems, nleft;
byte *data;
- i = XGetWindowProperty(theDisp, RootWindow(theDisp, 0),
- resAtom, 0L, 1L, False,
- XA_STRING, &actType, &actFormat, &nitems, &nleft,
- (unsigned char **) &data);
+ if (spec_window) {
+ i = XGetWindowProperty(theDisp, spec_window,
+ resAtom, 0L, 1L, False,
+ XA_STRING, &actType, &actFormat, &nitems, &nleft,
+ (unsigned char **) &data);
+ } else {
+ i = XGetWindowProperty(theDisp, RootWindow(theDisp, 0),
+ resAtom, 0L, 1L, False,
+ XA_STRING, &actType, &actFormat, &nitems, &nleft,
+ (unsigned char **) &data);
+ }
if (i==Success && actType==XA_STRING && actFormat==8) {
if (nitems>0 && data) XFree(data);
- i = XGetWindowProperty(theDisp, RootWindow(theDisp, 0), resAtom, 0L,
- (long) ((nleft+4+3)/4),
- False, XA_STRING, &actType, &actFormat,
- &nitems, &nleft, (unsigned char **) &data);
+ if (spec_window) {
+ i = XGetWindowProperty(theDisp, spec_window, resAtom, 0L,
+ (long) ((nleft+4+3)/4),
+ False, XA_STRING, &actType, &actFormat,
+ &nitems, &nleft, (unsigned char **) &data);
+ } else {
+ i = XGetWindowProperty(theDisp, RootWindow(theDisp, 0), resAtom, 0L,
+ (long) ((nleft+4+3)/4),
+ False, XA_STRING, &actType, &actFormat,
+ &nitems, &nleft, (unsigned char **) &data);
+ }
if (i==Success && actType==XA_STRING && actFormat==8 && data) {
def_resource = XrmGetStringDatabase((char *) data);
XFree(data);
@@ -4064,50 +4744,51 @@
if (!gotit) {
- xrm_str = XResourceManagerString(theDisp);
-
+ xrm_str = XResourceManagerString(theDisp);
+
if (xrm_str) {
def_resource = XrmGetStringDatabase(xrm_str);
if (DEBUG) fprintf(stderr,"rd_str_cl: Using RESOURCE_MANAGER prop.\n");
}
else { /* no RESOURCE_MANAGER prop. read from 'likely' file */
- char foo[256], *homedir, *xenviron;
+ char foo[256], *xenviron;
+ const char *homedir;
XrmDatabase res1;
-
+
#ifdef VMS
strcpy(foo, "SYS$LOGIN:DECW$XDEFAULTS.DAT");
#else
- homedir = (char *) getenv("HOME");
+ homedir = (const char *) getenv("HOME");
if (!homedir) homedir = ".";
sprintf(foo,"%s/.Xdefaults", homedir);
#endif
-
+
def_resource = XrmGetFileDatabase(foo);
-
+
if (DEBUG) {
fprintf(stderr,"rd_str_cl: No RESOURCE_MANAGER prop.\n");
fprintf(stderr,"rd_str_cl: Using file '%s' (%s) ",
foo, (def_resource) ? "success" : "failure");
}
-
-
+
+
/* merge file pointed to by XENVIRONMENT */
xenviron = (char *) getenv("XENVIRONMENT");
if (xenviron) {
res1 = XrmGetFileDatabase(xenviron);
-
+
if (DEBUG) {
fprintf(stderr,"merging XENVIRONMENT='%s' (%s) ",
xenviron, (res1) ? "success" : "failure");
}
-
+
if (res1) { /* merge databases */
if (!def_resource) def_resource = res1;
else XrmMergeDatabases(res1, &def_resource);
}
}
-
-
+
+
if (DEBUG) fprintf(stderr,"\n\n");
}
}
@@ -4120,16 +4801,15 @@
strcpy (q_name, PROGNAME);
strcat (q_name, ".");
strcat (q_name, name_str);
-
+
strcpy (q_class, "Program");
strcat (q_class, ".");
strcat (q_class, class_str);
(void) XrmGetResource(def_resource, q_name, q_class, &type, &result);
-
+
def_str = result.addr;
- if (def_str) return (1);
- else return (0);
+ if (def_str) return 1;
+ else return 0;
}
-
diff -ru xv-3.10a/xv.h xv-3.10a-enhancements/xv.h
--- xv-3.10a/xv.h 1995-01-23 12:22:23.000000000 -0800
+++ xv-3.10a-enhancements/xv.h 2007-05-20 21:26:40.000000000 -0700
@@ -1,6 +1,6 @@
/*
* xv.h - header file for xv, but you probably guessed as much
- *
+ *
* Author: John Bradley (bradley@cis.upenn.edu)
*/
@@ -8,8 +8,16 @@
#include "config.h"
-#define REVDATE "Version 3.10a Rev: 12/29/94"
-#define VERSTR "3.10a"
+/* xv 3.10a: 19941229 */
+/* PNG patch 1.2d: 19960731 */
+/* GRR orig jumbo fixes patch: 20000213 */
+/* GRR orig jumbo enhancements patch: 20000220 */
+/* GRR 1st public jumbo F+E patches: 20040531 */
+/* GRR 2nd public jumbo F+E patches: 20050410 */
+/* GRR 3rd public jumbo F+E patches: 20050501 */
+/* GRR 4th public jumbo F+E patch: 20070520 */
+#define REVDATE "version 3.10a-jumboFix+Enh of 20070520"
+#define VERSTR "3.10a-20070520"
/*
* uncomment the following, and modify for your site, but only if you've
@@ -43,6 +51,10 @@
/* START OF MACHINE-DEPENDENT CONFIGURATION INFO */
/*************************************************/
+
+#define ENABLE_FIXPIX_SMOOTH /* GRR 19980607 */
+
+
/* Things to make xv more likely to just build, without the user tweaking
the makefile */
@@ -61,16 +73,38 @@
# define SVR4
#endif
+#if defined(__sony_news) && defined(bsd43) && !defined(__bsd43)
+# define __bsd43
+#elif defined(__sony_news) && (defined(SYSTYPE_BSD) || defined(__SYSTYPE_BSD)) && !defined(bsd43) && !defined(__bsd43)
+# define bsd43
+# define __bsd43
+#endif
+
+#include /* for interrupt handling */
+
+/* at least on Linux, the following file (1) includes sys/types.h and
+ * (2) defines __USE_BSD (which was not defined before here), so __linux__
+ * block is now moved after this #include */
+#include /* need type declarations immediately */
+
-#ifdef LINUX
+#ifdef __linux__
# ifndef _LINUX_LIMITS_H
# include
# endif
+# ifndef USLEEP
+# define USLEEP
+# endif
+ /* want only one or the other defined, not both: */
+# if !defined(BSDTYPES) && !defined(__USE_BSD)
+# define BSDTYPES
+# endif
+# if defined(BSDTYPES) && defined(__USE_BSD)
+# undef BSDTYPES
+# endif
#endif
-#include /* need type declarations immediately */
-
/*********************************************************/
@@ -99,6 +133,16 @@
#endif
+#if defined(__sony_news) && defined(__bsd43)
+# include
+#endif
+
+
+#if defined(__FreeBSD__)
+# include
+#endif
+
+
/* include files */
#include
#include
@@ -114,18 +158,24 @@
#ifndef VMS
# include
- extern int errno; /* SHOULD be in errno.h, but often isn't */
# ifndef __NetBSD__
- extern char *sys_errlist[]; /* this too... */
+# if !(defined __GLIBC__ && __GLIBC__ >= 2)
+ extern int errno; /* SHOULD be in errno.h, but often isn't */
+ extern char *sys_errlist[]; /* this too... */
+# endif
# endif
#endif
/* not everyone has the strerror() function, or so I'm told */
-#ifndef VMS
-# define ERRSTR(x) sys_errlist[x]
-#else
+#ifdef VMS
# define ERRSTR(x) strerror(x, vaxc$errno)
+#else
+# if defined(__BEOS__) || defined(__linux__) /* or all modern/glibc systems? */
+# define ERRSTR(x) strerror(x)
+# else
+# define ERRSTR(x) sys_errlist[x]
+# endif
#endif
@@ -146,28 +196,20 @@
#endif
-/* lots of things don't have */
-/* A/UX systems include it from stdlib, from Xos.h */
-#ifndef VMS /* VMS hates multi-line '#if's */
-# if !defined(ibm032) && \
- !defined(__convex__) && \
- !(defined(vax) && !defined(ultrix)) && \
- !defined(mips) && \
- !defined(apollo) && \
- !defined(pyr) && \
- !defined(__UMAXV__) && \
- !defined(bsd43) && \
- !defined(aux) && \
- !defined(__bsdi__) && \
- !defined(sequent)
-
+/* GRR 20070512: Very few modern systems even have a malloc.h anymore;
+ * stdlib.h is, well, the standard. (Former explicitly listed
+ * "don't include" systems: ibm032, __convex__, non-ultrix vax,
+ * mips, apollo, pyr, sequent, __UMAXV__, aux, bsd43, __bsd43,
+ * __bsdi__, __386BSD__, __FreeBSD__, __OpenBSD__, __NetBSD__,
+ * __DARWIN__, VMS.) Anyone who _does_ need it can explicitly
+ * define NEED_MALLOC_H in the makefile. */
+#ifdef NEED_MALLOC_H
# if defined(hp300) || defined(hp800) || defined(NeXT)
-# include /* it's in 'sys' on HPs and NeXT */
+# include /* it's in "sys" on HPs and NeXT */
# else
-# include
+# include
# endif
-# endif
-#endif /* !VMS */
+#endif
@@ -179,9 +221,10 @@
#include
#include
+#ifdef TV_L10N
+# include
+#endif
-#undef SIGCHLD /* defined in both Xos.h and signal.h */
-#include /* for interrupt handling */
#include
@@ -205,6 +248,10 @@
# include
# endif
+# ifdef __BEOS__
+# include
+# endif
+
/*** for select() call ***/
# ifdef __hpux
# define XV_FDTYPE (int *)
@@ -259,7 +306,7 @@
* make them if missing, along with a few fictitious ones
* Cameron Simpson (cameron@cse.unsw.edu.au)
*/
-
+
#ifndef S_ISDIR /* missing POSIX-type macros */
# define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR)
# define S_ISBLK(mode) (((mode)&S_IFMT) == S_IFBLK)
@@ -288,7 +335,9 @@
# endif
#endif
-
+#ifndef S_IRWUSR
+# define S_IRWUSR (S_IRUSR|S_IWUSR) /* or (S_IREAD|S_IWRITE) */
+#endif
#ifndef MAXPATHLEN
# define MAXPATHLEN 256
@@ -308,36 +357,90 @@
#ifndef VMS /* VMS hates multi-line definitions */
# if defined(SVR4) || defined(SYSV) || defined(sco) || \
- defined(XENIX) || defined(__osf__)
+ defined(XENIX) || defined(__osf__) || defined(__linux__)
# undef USE_GETCWD
# define USE_GETCWD /* use 'getcwd()' instead of 'getwd()' */
+# endif /* >> SECURITY ISSUE << */
+#endif
+
+
+/* GRR 20040430: This is new and still not fully deployed. No doubt there
+ * are other systems that have mkstemp() (SUSv3); we can add
+ * them later. */
+#ifndef VMS /* VMS hates multi-line definitions */
+# if defined(__linux__) || defined(__OpenBSD__) || defined(__NetBSD__) || \
+ defined(__bsdi__)
+# ifndef USE_MKSTEMP
+# define USE_MKSTEMP /* use 'mkstemp()' instead of 'mktemp()' */
+# endif /* >> SECURITY ISSUE << */
# endif
#endif
+/* GRR 20040503: This is new and so far tested only under Linux. But it
+ * allows -wait to work with subsecond values as long as
+ * times() exists and clock_t is a long int (latter matters
+ * only if/when clocks wrap, which for Linux is multiples of
+ * 497.11 days since the last reboot). */
+#if defined(__linux__)
+# define USE_TICKS /* use times()/Timer(), not time()/sleep() */
+# include /* LONG_MAX (really want CLOCK_T_MAX) */
+# include /* times() */
+# ifndef CLK_TCK /* can be undefined in strict-ANSI mode */
+# define CLK_TCK CLOCKS_PER_SEC /* claimed to be same thing in time.h */
+# endif
+#endif
+
+#if (defined(SYSV) || defined(SVR4) || defined(linux)) && !defined(USE_GETCWD)
+# define USE_GETCWD
+#endif
+
+#ifndef SEEK_SET
+# define SEEK_SET 0
+# define SEEK_CUR 1
+# define SEEK_END 2
+#endif
+
+#if defined(__mips) && defined(__SYSTYPE_BSD43)
+# define strstr(A,B) pds_strstr((A),(B))
+# undef S_IFIFO
+#endif /* !mips_bsd */
+
/*****************************/
/* END OF CONFIGURATION INFO */
/*****************************/
+
#ifdef DOJPEG
-#define HAVE_JPEG
+# define HAVE_JPEG
+#endif
+
+#ifdef DOJP2K
+# define HAVE_JP2K
#endif
#ifdef DOTIFF
-#define HAVE_TIFF
+# define HAVE_TIFF
+#endif
+
+#ifdef DOPNG
+# define HAVE_PNG
#endif
#ifdef DOPDS
-#define HAVE_PDS
+# define HAVE_PDS
#endif
+#ifdef DOG3
+# define HAVE_G3
+#endif
-#define PROGNAME "xv" /* used in resource database */
+#define PROGNAME "xv" /* used in resource database */
-#define MAXNAMES 4096 /* max # of files in ctrlW list */
+#define MAXNAMES 65536 /* max # of files in ctrlW list */
-#define MAXBRWIN 4 /* max # of vis browser windows */
+#define MAXBRWIN 16 /* max # of vis browser windows */
/* strings in the INFOBOX (used in SetISTR and GetISTR) */
#define NISTR 10 /* number of ISTRs */
@@ -432,7 +535,7 @@
#define F_COLORS 0
#define F_FORMAT 1
-/* the following list give indicies into saveColors[] array in xvdir.c */
+/* the following list give indices into saveColors[] array in xvdir.c */
#define F_FULLCOLOR 0
#define F_GREYSCALE 1
#define F_BWDITHER 2
@@ -440,49 +543,115 @@
#define F_MAXCOLORS 4 /* length of saveColors[] array */
-/* following list gives indicies into 'saveFormats[]' array in xvdir.c
- note that JPEG and TIFF entries may or may not exist, and following
- constants have to be adjusted accordingly. Also, don't worry about
- duplicate cases if JPGINC or TIFINC = 0. All code that references
- F_JPEG or F_TIFF is #ifdef'd, so it won't be a problem */
+/* The following list gives indices into 'saveFormats[]' array in xvdir.c.
+ Note that JPEG, TIFF, and other entries may or may not exist, so the
+ following constants have to be adjusted accordingly. Also, don't worry
+ about duplicate cases if, e.g., JPGINC or TIFINC = 0. All code that
+ references F_JPEG, F_TIFF, etc., is #ifdef'd, so it won't be a problem. */
#ifdef HAVE_JPEG
-#define F_JPGINC 1
+# define F_JPGINC 1
#else
-#define F_JPGINC 0
+# define F_JPGINC 0
+#endif
+
+#ifdef HAVE_JP2K
+# define F_JP2INC 1 /* provides both JPC and JP2 */
+#else
+# define F_JP2INC 0
#endif
#ifdef HAVE_TIFF
-#define F_TIFINC 1
+# define F_TIFINC 1
+#else
+# define F_TIFINC 0
+#endif
+
+#ifdef HAVE_PNG
+# define F_PNGINC 1
+#else
+# define F_PNGINC 0
+#endif
+
+#ifdef HAVE_MAG
+# define F_MAGINC 1
+#else
+# define F_MAGINC 0
+#endif
+
+#ifdef HAVE_PIC
+# define F_PICINC 1
+#else
+# define F_PICINC 0
+#endif
+
+#ifdef HAVE_MAKI
+# define F_MAKINC 1
+#else
+# define F_MAKINC 0
+#endif
+
+#ifdef HAVE_PI
+# define F_PAIINC 1
+#else
+# define F_PAIINC 0
+#endif
+
+#ifdef HAVE_PIC2
+# define F_PC2INC 1
#else
-#define F_TIFINC 0
+# define F_PC2INC 0
#endif
+#ifdef HAVE_MGCSFX
+# define F_MGCSFXINC 1
+#else
+# define F_MGCSFXINC 0
+#endif
-#define F_GIF 0
-#define F_JPEG ( 0 + F_JPGINC)
-#define F_TIFF ( 0 + F_JPGINC + F_TIFINC)
-#define F_PS ( 1 + F_JPGINC + F_TIFINC)
-#define F_PBMRAW ( 2 + F_JPGINC + F_TIFINC)
-#define F_PBMASCII ( 3 + F_JPGINC + F_TIFINC)
-#define F_XBM ( 4 + F_JPGINC + F_TIFINC)
-#define F_XPM ( 5 + F_JPGINC + F_TIFINC)
-#define F_BMP ( 6 + F_JPGINC + F_TIFINC)
-#define F_SUNRAS ( 7 + F_JPGINC + F_TIFINC)
-#define F_IRIS ( 8 + F_JPGINC + F_TIFINC)
-#define F_TARGA ( 9 + F_JPGINC + F_TIFINC)
-#define F_FITS (10 + F_JPGINC + F_TIFINC)
-#define F_PM (11 + F_JPGINC + F_TIFINC)
-#define F_DELIM1 (12 + F_JPGINC + F_TIFINC) /* ----- */
-#define F_FILELIST (13 + F_JPGINC + F_TIFINC)
-#define F_MAXFMTS (14 + F_JPGINC + F_TIFINC) /* 15, normally */
+#ifdef MACBINARY
+# define MACBSIZE 128
+#endif
+
+/* NOTE: order must match saveFormats[] in xvdir.c */
+/* [this works best when first one is always present, but...we like PNG :-) ] */
+#define F_PNG 0
+#define F_JPEG ( 0 + F_PNGINC)
+#define F_JPC ( 0 + F_PNGINC + F_JPGINC)
+#define F_JP2 ( 0 + F_PNGINC + F_JPGINC + F_JP2INC)
+#define F_GIF ( 0 + F_PNGINC + F_JPGINC + F_JP2INC + F_JP2INC) /* always avail; index varies */
+#define F_TIFF ( 0 + F_PNGINC + F_JPGINC + F_JP2INC + F_JP2INC + F_TIFINC)
+#define F_PS ( 1 + F_TIFF)
+#define F_PBMRAW ( 2 + F_TIFF)
+#define F_PBMASCII ( 3 + F_TIFF)
+#define F_XBM ( 4 + F_TIFF)
+#define F_XPM ( 5 + F_TIFF)
+#define F_BMP ( 6 + F_TIFF)
+#define F_SUNRAS ( 7 + F_TIFF)
+#define F_IRIS ( 8 + F_TIFF)
+#define F_TARGA ( 9 + F_TIFF)
+#define F_FITS (10 + F_TIFF)
+#define F_PM (11 + F_TIFF)
+#define F_ZX (12 + F_TIFF) /* [JCE] */
+#define F_WBMP (13 + F_TIFF)
+#define JP_EXT_F (F_WBMP)
+#define F_MAG (JP_EXT_F + F_MAGINC)
+#define F_PIC (JP_EXT_F + F_MAGINC + F_PICINC)
+#define F_MAKI (JP_EXT_F + F_MAGINC + F_PICINC + F_MAKINC)
+#define F_PI (JP_EXT_F + F_MAGINC + F_PICINC + F_MAKINC + F_PAIINC)
+#define F_PIC2 (JP_EXT_F + F_MAGINC + F_PICINC + F_MAKINC + F_PAIINC + F_PC2INC)
+#define F_MGCSFX (JP_EXT_F + F_MAGINC + F_PICINC + F_MAKINC + F_PAIINC + F_PC2INC + F_MGCSFXINC)
+#define JP_EXT_F_END (F_MGCSFX)
+#define F_DELIM1 (JP_EXT_F_END + 1) /* ----- */
+#define F_FILELIST (JP_EXT_F_END + 2)
+#define F_MAXFMTS (JP_EXT_F_END + 3) /* 27, normally (with all formats) */
/* return values from ReadFileType()
* positive values are *definitely* readable formats (HAVE_*** is defined)
* negative values are random files that XV can't read, but display as
- * different icons in the visual browser
+ * different icons in the visual browser
*/
#define RFT_ERROR -1 /* couldn't open file, or whatever... */
#define RFT_UNKNOWN 0
@@ -505,6 +674,22 @@
#define RFT_XPM 17
#define RFT_XWD 18
#define RFT_FITS 19
+#define RFT_PNG 20
+#define RFT_ZX 21 /* [JCE] */
+#define RFT_WBMP 22
+#define RFT_PCD 23
+#define RFT_HIPS 24
+#define RFT_BZIP2 25
+#define RFT_JPC 26
+#define RFT_JP2 27
+#define RFT_G3 28
+#define JP_EXT_RFT (RFT_G3)
+#define RFT_MAG (JP_EXT_RFT + 1)
+#define RFT_MAKI (JP_EXT_RFT + 2)
+#define RFT_PIC (JP_EXT_RFT + 3)
+#define RFT_PI (JP_EXT_RFT + 4)
+#define RFT_PIC2 (JP_EXT_RFT + 5)
+#define RFT_MGCSFX (JP_EXT_RFT + 6)
/* definitions for page up/down, arrow up/down list control */
#define LS_PAGEUP 0
@@ -563,7 +748,8 @@
#define RM_CBRICK 7 /* centered on a 'brick' bg */
#define RM_ECENTER 8 /* symmetrical tiled */
#define RM_ECMIRR 9 /* symmetrical mirror tiled */
-#define RM_MAX RM_ECMIRR
+#define RM_UPLEFT 10 /* just in upper left corner */
+#define RM_MAX RM_UPLEFT
/* values of colorMapMode */
@@ -613,10 +799,11 @@
#define RMB_CBRICK 8
#define RMB_ECENTER 9
#define RMB_ECMIRR 10
-#define RMB_MAX 11
+#define RMB_UPLEFT 11
+#define RMB_MAX 12
-/* indicies into conv24MB */
+/* indices into conv24MB */
#define CONV24_8BIT 0
#define CONV24_24BIT 1
#define CONV24_SEP1 2
@@ -631,7 +818,7 @@
#define PIC8 CONV24_8BIT
#define PIC24 CONV24_24BIT
-/* indicies into algMB */
+/* indices into algMB */
#define ALG_NONE 0
#define ALG_SEP1 1 /* separator */
#define ALG_BLUR 2
@@ -648,7 +835,7 @@
#define ALG_MAX 13
-/* indicies into sizeMB */
+/* indices into sizeMB */
#define SZMB_NORM 0
#define SZMB_MAXPIC 1
#define SZMB_MAXPECT 2
@@ -663,7 +850,7 @@
#define SZMB_INTEXP 11
#define SZMB_MAX 12
-/* indicies into windowMB */
+/* indices into windowMB */
#define WMB_BROWSE 0
#define WMB_COLEDIT 1
#define WMB_INFO 2
@@ -742,15 +929,15 @@
typedef unsigned char byte;
-typedef struct scrl {
+typedef struct scrl {
Window win; /* window ID */
int x,y,w,h; /* window coords in parent */
int len; /* length of major axis */
int vert; /* true if vertical, else horizontal */
int active; /* true if scroll bar can do anything*/
- int min,max; /* min/max values 'pos' can take */
- int val; /* 'value' of scrollbar */
- int page; /* amt val change on pageup/pagedown */
+ double min,max; /* min/max values 'pos' can take */
+ double val; /* 'value' of scrollbar */
+ double page; /* amt val change on pageup/pagedown */
int tpos; /* thumb pos. (pixels from tmin) */
int tmin,tmax; /* min/max thumb offsets (from 0,0) */
int tsize; /* size of thumb (in pixels) */
@@ -765,11 +952,12 @@
typedef struct { Window win; /* window ID */
int x,y,w,h; /* window coords in parent */
int active; /* true if can do anything*/
- int min,max; /* min/max values 'pos' can take */
- int val; /* 'value' of dial */
- int page; /* amt val change on pageup/pagedown */
- char *title; /* title for this guage */
- char *units; /* string appended to value */
+ double min,max; /* min/max values 'pos' can take */
+ double val; /* 'value' of dial */
+ double inc; /* amt val change on up/down */
+ double page; /* amt val change on pageup/pagedown */
+ const char *title; /* title for this gauge */
+ const char *units; /* string appended to value */
u_long fg,bg,hi,lo; /* colors */
int rad, cx, cy; /* internals */
int bx[4], by[4]; /* more internals */
@@ -785,7 +973,7 @@
int active; /* if false, stipple gray */
int toggle; /* if true, clicking toggles state */
u_long fg,bg,hi,lo; /* colors */
- char *str; /* string in button */
+ const char *str; /* string in button */
Pixmap pix; /* use pixmap instead of string */
u_int pw,ph; /* size of pixmap */
int colorpix; /* multi-color pixmap */
@@ -797,21 +985,23 @@
typedef struct rbutt {
Window win; /* parent window */
int x,y; /* position in parent */
- char *str; /* the message string */
+ const char *str; /* the message string */
int selected; /* selected or not */
int active; /* selectable? */
struct rbutt *next; /* pointer to next in group */
- u_long fg,bg,hi,lo; /* colors */
+ u_long fg,bg; /* colors */
+ u_long hi,lo; /* colors */
} RBUTT;
typedef struct { Window win; /* parent window */
int x,y; /* position in parent */
- char *str; /* the message string */
+ const char *str; /* the message string */
int val; /* 1=selected, 0=not */
int active; /* selectable? */
- u_long fg,bg,hi,lo; /* colors */
+ u_long fg,bg; /* colors */
+ u_long hi,lo; /* colors */
} CBUTT;
@@ -819,11 +1009,11 @@
typedef struct { Window win; /* parent window */
int x,y; /* position in parent */
unsigned int w,h;
- char *title; /* title string in norm state */
+ const char *title; /* title string in norm state */
int active; /* selectable? */
- char **list; /* list of strings in menu */
+ const char **list; /* list of strings in menu */
int nlist; /* # of strings in menu */
- byte flags[MAXMBLEN]; /* checkmarks on items */
+ byte flags[MAXMBLEN]; /* checkmarks on items */
int hascheck; /* leave room for checkmark? */
byte dim[MAXMBLEN]; /* dim individual choices */
Pixmap pix; /* use pixmap instd of string */
@@ -833,17 +1023,18 @@
} MBUTT;
-typedef struct { Window win; /* window */
- int x,y; /* size of window */
+typedef struct { Window win; /* window */
+ int x,y; /* size of window */
unsigned int w,h;
- u_long fg,bg,hi,lo; /* colors */
- char **str; /* ptr to list of strings */
- int nstr; /* number of strings */
- int selected; /* number of 'selected' string */
- int nlines; /* number of lines shown at once */
- SCRL scrl; /* scrollbar that controls list */
- int filetypes; /* true if filetype icons to be drawn*/
- int dirsonly; /* if true, only dirs selectable */
+ u_long fg,bg; /* colors */
+ u_long hi,lo; /* colors */
+ /* const? */ char **str; /* ptr to list of strings */
+ int nstr; /* number of strings */
+ int selected; /* number of 'selected' string */
+ int nlines; /* number of lines shown at once */
+ SCRL scrl; /* scrollbar that controls list */
+ int filetypes; /* true if filetype icons to be drawn*/
+ int dirsonly; /* if true, only dirs selectable */
} LIST;
@@ -865,6 +1056,9 @@
char shrtInfo[128]; /* short format info */
char *comment; /* comment text */
+ byte *exifInfo; /* image info from digicam */
+ int exifInfoSize; /* size of image info */
+
int numpages; /* # of page files, if >1 */
char pagebname[64]; /* basename of page files */
} PICINFO;
@@ -881,18 +1075,18 @@
#define GVMAX 8
-typedef struct { Window win; /* window ID */
- Window gwin; /* graph subwindow */
- int spline; /* spline curve or lines? */
- int entergamma; /* currently entering gamma value */
- int gammamode; /* currently using gamma function */
- double gamma; /* gamma value (if gammamode) */
- int nhands; /* current # of handles */
- XPoint hands[MAX_GHANDS]; /* positions of handles */
- byte func[256]; /* output function of GRAF */
- BUTT butts[N_GFB]; /* control buttons */
- u_long fg,bg; /* colors */
- char *str; /* title string */
+typedef struct { Window win; /* window ID */
+ Window gwin; /* graph subwindow */
+ int spline; /* spline curve or lines? */
+ int entergamma; /* currently entering gamma value */
+ int gammamode; /* currently using gamma function */
+ double gamma; /* gamma value (if gammamode) */
+ int nhands; /* current # of handles */
+ XPoint hands[MAX_GHANDS]; /* positions of handles */
+ byte func[256]; /* output function of GRAF */
+ BUTT butts[N_GFB]; /* control buttons */
+ u_long fg,bg; /* colors */
+ const char *str; /* title string */
char gvstr[GVMAX+1]; /* gamma value input string */
void (*drawobj)PARM((void));
} GRAF;
@@ -932,18 +1126,23 @@
/* X stuff */
WHERE Display *theDisp;
WHERE int theScreen;
-WHERE unsigned int ncells, dispWIDE, dispHIGH, dispDEEP;
-WHERE unsigned int vrWIDE, vrHIGH, maxWIDE, maxHIGH;
+WHERE unsigned int ncells, dispDEEP; /* root color sizes */
+WHERE unsigned int dispWIDE, dispHIGH; /* screen sizes */
+WHERE unsigned int vrWIDE, vrHIGH, maxWIDE, maxHIGH; /* virtual root and max image sizes */
WHERE Colormap theCmap, LocalCmap;
-WHERE Window rootW, mainW, vrootW;
+WHERE Window spec_window, rootW, mainW, vrootW;
WHERE GC theGC;
WHERE u_long black, white, fg, bg, infofg, infobg;
WHERE u_long hicol, locol;
WHERE u_long blkRGB, whtRGB;
WHERE Font mfont, monofont;
WHERE XFontStruct *mfinfo, *monofinfo;
+#ifdef TV_L10N
+WHERE XFontSet monofset;
+WHERE XFontSetExtents *monofsetinfo;
+#endif
WHERE Visual *theVisual;
-WHERE Cursor arrow, cross, tcross, zoom, inviso;
+WHERE Cursor arrow, cross, tcross, zoom, inviso, tlcorner;
WHERE Pixmap iconPix, iconmask;
WHERE Pixmap riconPix, riconmask;
WHERE int showzoomcursor;
@@ -959,6 +1158,12 @@
WHERE char formatStr[80]; /* short-form 'file format' */
WHERE int picType; /* CONV24_8BIT,CONV24_24BIT,etc.*/
WHERE char *picComments; /* text comments on current pic */
+WHERE byte *picExifInfo; /* image info from digicam */
+WHERE int picExifInfoSize; /* size of image info */
+
+#ifdef TV_L10N
+WHERE int xlocale; /* true if Xlib supports locale */
+#endif
WHERE int numPages, curPage; /* for multi-page files */
WHERE char pageBaseName[64]; /* basename for multi-page files */
@@ -972,12 +1177,12 @@
/* this is converted to 'theImage' */
WHERE int eWIDE, eHIGH; /* size of epic */
-WHERE byte *egampic; /* expanded, gammified cpic
+WHERE byte *egampic; /* expanded, gammified cpic
(only used in 24-bit mode) */
WHERE int p_offx, p_offy; /* offset of reparented windows */
WHERE int ch_offx,ch_offy; /* ChngAttr ofst for reparented windows */
-WHERE int kludge_offx, /* WM kludges for SetWindowPos routine */
+WHERE int kludge_offx, /* WM kludges for SetWindowPos routine */
kludge_offy;
WHERE int winCtrPosKludge; /* kludge for popup positioning... */
@@ -993,6 +1198,26 @@
WHERE unsigned long cols[256]; /* maps pic pixel values to X pixel vals */
WHERE int fc2pcol[256]; /* maps freecols into pic pixel values */
WHERE int numcols; /* # of desired colors in picture */
+#ifdef MACBINARY
+WHERE char macb_file; /* True if this file type is MacBinary */
+WHERE int handlemacb; /* True if we want to handle MacBinary */
+#endif
+#if defined(HAVE_PIC) || defined(HAVE_PIC2)
+WHERE int nopicadjust; /* True if we don't want to adjust aspect */
+#endif
+#ifdef HAVE_PIC2
+WHERE int pic2split; /* True if we want to split multiblocks */
+#endif
+#ifdef VS_ADJUST
+WHERE int vsadjust; /* True if we want to adjust aspect of icons */
+#endif
+#ifdef HAVE_MGCSFX
+WHERE int mgcsfx; /* True if we want to force use MgcSfx */
+WHERE int nomgcsfx; /* True if we don't want to use MgcSfx */
+#endif
+
+#define FSTRMAX 12 /* Number of function keys to support. */
+WHERE char *fkeycmds[FSTRMAX]; /* command to run when F# is pressed */
/* Std Cmap stuff */
WHERE byte stdr[256], stdg[256], stdb[256]; /* std 3/3/2 cmap */
@@ -1025,7 +1250,7 @@
WHERE int ncols; /* max # of (different) colors to alloc */
-WHERE char str[128]; /* dummy string used for error messages */
+WHERE char dummystr[128]; /* dummy string used for error messages */
WHERE char initdir[MAXPATHLEN]; /* cwd when xv was started */
WHERE char searchdir[MAXPATHLEN]; /* '-dir' option */
WHERE char fullfname[MAXPATHLEN]; /* full name of current file */
@@ -1047,42 +1272,47 @@
noFreeCols, /* don't free colors when loading new pic */
autoquit, /* quit in '-root' or when click on win */
xerrcode, /* errorcode of last X error */
- grabDelay; /* # of seconds to sleep at start of Grab */
+ grabDelay, /* # of seconds to sleep at start of Grab */
+ startGrab; /* start immediate grab ? */
WHERE int state824; /* displays warning when going 8->24 */
WHERE float defaspect, /* default aspect ratio to use */
normaspect; /* normal aspect ratio of this picture */
-WHERE unsigned long rootbg, rootfg; /* fg/bg for root border */
-WHERE int waitsec; /* secs btwn pics. -1=wait for event */
-WHERE int waitloop; /* loop at end of slide show? */
-WHERE int automax; /* maximize pic on open */
-WHERE int rootMode; /* mode used for -root images */
+WHERE u_long rootbg, rootfg; /* fg/bg for root border */
+WHERE u_short imagebgR;
+WHERE u_short imagebgG; /* GRR 19980308: bg for transpar. images */
+WHERE u_short imagebgB;
+WHERE int have_imagebg;
+WHERE double waitsec; /* secs btwn pics. -1.0=wait for event */
+WHERE int waitloop; /* loop at end of slide show? */
+WHERE int automax; /* maximize pic on open */
+WHERE int rootMode; /* mode used for -root images */
-WHERE int nostat; /* if true, don't stat() in LdCurDir */
+WHERE int nostat; /* if true, don't stat() in LdCurDir */
-WHERE int ctrlColor; /* whether or not to use colored butts */
+WHERE int ctrlColor; /* whether or not to use colored butts */
-WHERE char *def_str; /* used by rd_*() routines */
+WHERE char *def_str; /* used by rd_*() routines */
WHERE int def_int;
-WHERE char *tmpdir; /* equal to "/tmp" or $TMPDIR env var */
-WHERE Pixmap gray25Tile, /* used for 3d effect on 1-bit disp's */
+WHERE char *tmpdir; /* equal to "/tmp" or $TMPDIR env var */
+WHERE Pixmap gray25Tile, /* used for 3d effect on 1-bit disp's */
gray50Tile;
-WHERE int autoDelete; /* delete cmd-line files on exit? */
+WHERE int autoDelete; /* delete cmd-line files on exit? */
#define PRINTCMDLEN 256
-WHERE char printCmd[PRINTCMDLEN];
+WHERE char printCmd[PRINTCMDLEN];
/* stuff used for 'info' box */
WHERE Window infoW;
-WHERE int infoUp; /* boolean: whether infobox is visible */
+WHERE int infoUp; /* boolean: whether infobox is visible */
WHERE int infoMode;
/* stuff used for 'ctrl' box */
WHERE Window ctrlW;
-WHERE int ctrlUp; /* boolean: whether ctrlbox is visible */
+WHERE int ctrlUp; /* boolean: whether ctrlbox is visible */
WHERE char *namelist[MAXNAMES]; /* list of file names from argv */
WHERE char *origlist[MAXNAMES]; /* only names from argv (autoDelete)*/
WHERE int orignumnames;
@@ -1121,25 +1351,31 @@
/* stuff used for 'browse' box */
-WHERE int anyBrowUp; /* whether *any* browser visible */
+WHERE int anyBrowUp; /* whether *any* browser visible */
+WHERE int incrementalSearchTimeout;
/* stuff used for textview windows */
-WHERE int anyTextUp; /* are any text windows visible? */
-WHERE int commentUp; /* comment window up? */
+WHERE int anyTextUp; /* are any text windows visible? */
+WHERE int commentUp; /* comment window up? */
/* stuff used for xvcut.c */
-WHERE int forceClipFile; /* don't use property clipboard */
-WHERE int clearR, clearG, clearB; /* clear color in 24-bit mode */
+WHERE int forceClipFile; /* don't use property clipboard */
+WHERE int clearR, clearG, clearB; /* clear color in 24-bit mode */
/* stuff used for 'ps' box */
WHERE Window psW;
-WHERE int psUp; /* is psW mapped, or what? */
-WHERE CBUTT encapsCB, pscompCB;
-WHERE char *gsDev, *gsGeomStr;
+WHERE int psUp; /* is psW mapped, or what? */
+WHERE CBUTT encapsCB, pscompCB;
+WHERE const char *gsDev, *gsGeomStr;
WHERE int gsRes;
+/* stuff used for 'pcd' box */
+WHERE Window pcdW;
+WHERE int pcdUp; /* is pcdW mapped, or what? */
+
+
#ifdef HAVE_JPEG
/* stuff used for 'jpeg' box */
WHERE Window jpegW;
@@ -1147,6 +1383,13 @@
#endif
+#ifdef HAVE_JP2K
+/* stuff used for 'jp2k' box */
+WHERE Window jp2kW;
+WHERE int jp2kUp; /* is jp2kW mapped, or what? */
+#endif
+
+
#ifdef HAVE_TIFF
/* stuff used for 'tiff' box */
WHERE Window tiffW;
@@ -1154,6 +1397,91 @@
#endif
+#ifdef HAVE_PNG
+/* stuff used for 'png' box */
+WHERE Window pngW;
+WHERE int pngUp; /* is pngW mapped, or what? */
+#endif
+
+
+#ifdef ENABLE_FIXPIX_SMOOTH
+WHERE int do_fixpix_smooth; /* GRR 19980607: runtime FS dithering */
+#endif
+
+#ifdef HAVE_PIC2
+/* stuff used for 'pic2' box */
+WHERE Window pic2W;
+WHERE int pic2Up; /* is pic2W mapped, or what? */
+#endif /* HAVE_PIC2 */
+
+#ifdef HAVE_PCD
+/* stuff used for 'pcd' box */
+WHERE Window pcdW;
+WHERE int pcdUp; /* is pcdW mapped, or what? */
+#endif /* HAVE_PCD */
+
+#ifdef HAVE_MGCSFX
+/* stuff used for 'mgcsfx' box */
+WHERE Window mgcsfxW;
+WHERE Window mgcsfxNameW;
+WHERE int mgcsfxUp; /* is mgcsfxW mapped, or what? */
+#endif /* HAVE_MGCSFX */
+
+#ifdef TV_L10N
+/* stuff used for TextViewer Japanization */
+# define LOCALE_USASCII 0
+# define LOCALE_EUCJ 1
+# define LOCALE_JIS 2
+# define LOCALE_MSCODE 3
+
+# ifndef LOCALE_DEFAULT
+# define LOCALE_DEFAULT 0
+# endif /* !LOCALE_DEFAULT */
+
+# ifndef MAIN
+ extern char *localeList[];
+# else
+# ifndef LOCALE_NAME_EUC
+# ifndef X_LOCALE
+# if defined(__FreeBSD__)
+ char *localeList[] = {"", "ja_JP.EUC", "none", "none"};
+# elif defined(__linux__)
+ char *localeList[] = {"", "ja_JP.eucJP", "none", "ja_JP.SJIS"};
+# elif defined(__sun) || defined(sun)
+ char *localeList[] = {"", "ja", "none", "none"};
+# elif defined(__sgi) /* sgi, __sgi, __sgi__ (gcc) */
+ char *localeList[] = {"", "ja_JP.EUC", "none", "none"};
+# elif defined(sony_news)
+ char *localeList[] = {"", "ja_JP.EUC", "none", "ja_JP.SJIS"};
+# elif defined(nec)
+ char *localeList[] = {"", "japan", "none", "none"};
+# elif defined(__hpux)
+ char *localeList[] = {"", "japanese.euc", "none", "japanese"};
+# elif defined(__osf__)
+ char *localeList[] = {"", "ja_JP.deckanji", "none", "ja_JP.SJIS"};
+# elif defined(_AIX)
+ char *localeList[] = {"", "ja_JP", "none", "Ja_JP" };
+# elif defined(__bsdi)
+ char *localeList[] = {"", "Japanese-EUC", "none", "none" };
+# else
+ char *localeList[] = {"", "ja_JP.EUC", "ja_JP.JIS", "ja_JP.SJIS"};
+# endif
+# else
+# if (XlibSpecificationRelease > 5)
+ char *localeList[] = {"", "ja_JP.eucJP", "ja_JP.JIS7",
+ "ja_JP.SJIS"};
+# else
+ char *localeList[] = {"", "ja_JP.ujis", "ja_JP.jis7",
+ "ja_JP.mscode"};
+# endif
+# endif /* X_LOCALE */
+# else
+ char *localeList[] = {"", LOCALE_NAME_EUC,
+ LOCALE_NAME_JIS, LOCALE_NAME_MSCODE};
+# endif /* LOCALE_NAME_EUC */
+# endif /* MAIN */
+#endif /* TV_L10N */
+
#undef WHERE
@@ -1161,172 +1489,115 @@
/* function declarations for externally-callable functions */
/****************************** XV.C ****************************/
-int ReadFileType PARM((char *));
-int ReadPicFile PARM((char *, int, PICINFO *, int));
-int UncompressFile PARM((char *, char *));
-void KillPageFiles PARM((char *, int));
-
-void NewPicGetColors PARM((int, int));
-void FixAspect PARM((int, int *, int *));
-void ActivePrevNext PARM((void));
-int DeleteCmd PARM((void));
-void StickInCtrlList PARM((int));
-void AddFNameToCtrlList PARM((char *, char *));
-void ChangedCtrlList PARM((void));
-void HandleDispMode PARM((void));
-char *lower_str PARM((char *));
-int rd_int PARM((char *));
-int rd_str PARM((char *));
-int rd_flag PARM((char *));
-int rd_str_cl PARM((char *, char *, int));
+int ReadFileType PARM((char *));
+int ReadPicFile PARM((char *, int, PICINFO *, int));
+int UncompressFile PARM((char *, char *, int));
+void KillPageFiles PARM((char *, int));
+#ifdef MACBINARY
+int RemoveMacbinary PARM((char *, char *));
+#endif
+
+void NewPicGetColors PARM((int, int));
+void FixAspect PARM((int, int *, int *));
+void ActivePrevNext PARM((void));
+int DeleteCmd PARM((void));
+void StickInCtrlList PARM((int));
+void AddFNameToCtrlList PARM((const char *, const char *));
+void ChangedCtrlList PARM((void));
+void HandleDispMode PARM((void));
+char *lower_str PARM((char *));
+int rd_int PARM((const char *));
+int rd_str PARM((const char *));
+int rd_flag PARM((const char *));
-/****************************** XVEVENT.C ****************************/
-int EventLoop PARM((void));
-int HandleEvent PARM((XEvent *, int *));
-void SelectDispMB PARM((int));
-void Select24to8MB PARM((int));
-void SelectRootMB PARM((int));
-void SelectWindowMB PARM((int));
-void SelectSizeMB PARM((int));
-
-void DoPrint PARM((void));
-void NewCutBuffer PARM((char *));
-void DrawWindow PARM((int,int,int,int));
-void WResize PARM((int, int));
-void WRotate PARM((void));
-void WCrop PARM((int, int, int, int));
-void WUnCrop PARM((void));
-void GetWindowPos PARM((XWindowAttributes *));
-void SetWindowPos PARM((XWindowAttributes *));
-void SetEpicMode PARM((void));
-int xvErrorHandler PARM((Display *, XErrorEvent *));
-
-/****************************** XVROOT.C ****************************/
-void MakeRootPic PARM((void));
-void ClearRoot PARM((void));
-void SaveRootInfo PARM((void));
-void KillOldRootInfo PARM((void));
+/*************************** XV24TO8.C **************************/
+void Init24to8 PARM((void));
+byte *Conv24to8 PARM((byte *, int, int, int,
+ byte *, byte *, byte *));
-/*************************** XVMISC.C ***************************/
-void StoreDeleteWindowProp PARM((Window));
-Window CreateWindow PARM((char *, char *, char *, int, int,
- u_long, u_long, int));
-void DrawString PARM((Window, int, int, char *));
-void CenterString PARM((Window, int, int, char *));
-void ULineString PARM((Window, int, int, char *));
-int StringWidth PARM((char *));
-int CursorKey PARM((KeySym, int, int));
-void FakeButtonPress PARM((BUTT *));
-void FakeKeyPress PARM((Window, KeySym));
-void GenExpose PARM((Window, int, int, u_int, u_int));
-void DimRect PARM((Window, int, int, u_int, u_int, u_long));
-
-void Draw3dRect PARM((Window, int, int, u_int, u_int, int, int,
- u_long, u_long, u_long));
-
-void RemapKeyCheck PARM((KeySym, char *, int *));
-void xvDestroyImage PARM((XImage *));
-void SetCropString PARM((void));
-void SetSelectionString PARM((void));
-void Warning PARM((void));
-void FatalError PARM((char *));
-void Quit PARM((int));
-void LoadFishCursors PARM((void));
-void WaitCursor PARM((void));
-void SetCursors PARM((int));
-char *BaseName PARM((char *));
-
-void DrawTempGauge PARM((Window, int, int, int, int, double,
- u_long, u_long, u_long, u_long, char *));
-void ProgressMeter PARM((int, int, int, char *));
-void XVDeletedFile PARM((char *));
-void XVCreatedFile PARM((char *));
-void xvbcopy PARM((char *, char *, size_t));
-int xvbcmp PARM((char *, char *, size_t));
-void xvbzero PARM((char *, size_t));
-void xv_getwd PARM((char *, size_t));
-char *xv_strstr PARM((char *, char *));
-FILE *xv_fopen PARM((char *, char *));
-void Timer PARM((int));
+byte *Conv8to24 PARM((byte *, int, int, byte *, byte *, byte *));
-/*************************** XVCOLOR.C ***************************/
-void SortColormap PARM((byte *, int, int, int *, byte*,byte*,byte*,
- byte *, byte *));
-void ColorCompress8 PARM((byte *));
-void AllocColors PARM((void));
-Status xvAllocColor PARM((Display *, Colormap, XColor *));
-void xvFreeColors PARM((Display *, Colormap, u_long *, int, u_long));
-void FreeColors PARM((void));
-void ApplyEditColor PARM((int));
-int MakeStdCmaps PARM((void));
-void MakeBrowCmap PARM((void));
-void ChangeCmapMode PARM((int, int, int));
-/*************************** XVIMAGE.C ***************************/
-void Resize PARM((int, int));
-void GenerateCpic PARM((void));
-void GenerateEpic PARM((int, int));
-void DoZoom PARM((int, int, u_int));
-void Crop PARM((void));
-void UnCrop PARM((void));
-void AutoCrop PARM((void));
-int DoAutoCrop PARM((void));
-void DoCrop PARM((int, int, int, int));
-void Rotate PARM((int));
-void DoRotate PARM((int));
-void RotatePic PARM((byte *, int, int *, int *, int));
-void Flip PARM((int));
-void FlipPic PARM((byte *, int, int, int));
-void InstallNewPic PARM((void));
-void DrawEpic PARM((void));
-void KillOldPics PARM((void));
-
-byte *FSDither PARM((byte *, int, int, int,
- byte *, byte *, byte *, int, int));
-
-void CreateXImage PARM((void));
-XImage *Pic8ToXImage PARM((byte *, u_int, u_int, u_long *,
- byte *, byte *, byte *));
-
-XImage *Pic24ToXImage PARM((byte *, u_int, u_int));
-
-void Set824Menus PARM((int));
-void Change824Mode PARM((int));
-void FreeEpic PARM((void));
-void InvertPic24 PARM((byte *, int, int));
+/*************************** XVALG.C ***************************/
+void AlgInit PARM((void));
+void DoAlg PARM((int));
-byte *XVGetSubImage PARM((byte *, int, int,int, int,int,int,int));
-int DoPad PARM((int, char *, int, int, int, int));
-int LoadPad PARM((PICINFO *, char *));
+/*************************** XVBROWSE.C ************************/
+void CreateBrowse PARM((const char *, const char *, const char *,
+ const char *, const char *));
+void OpenBrowse PARM((void));
+void HideBrowseWindows PARM((void));
+void UnHideBrowseWindows PARM((void));
+void SetBrowseCursor PARM((Cursor));
+void KillBrowseWindows PARM((void));
+int BrowseCheckEvent PARM((XEvent *, int *, int *));
+int BrowseDelWin PARM((Window));
+void SetBrowStr PARM((const char *));
+void RegenBrowseIcons PARM((void));
+void BRDeletedFile PARM((char *));
+void BRCreatedFile PARM((char *));
-/*************************** XVALG.C ***************************/
-void AlgInit PARM((void));
-void DoAlg PARM((int));
-/*************************** XVSMOOTH.C ***************************/
-byte *SmoothResize PARM((byte *, int, int, int, int, byte *, byte *,
- byte *, byte *, byte *, byte *, int));
+/**************************** XVBUTT.C ***************************/
+void BTCreate PARM((BUTT *, Window, int, int, u_int, u_int,
+ const char *, u_long, u_long, u_long, u_long));
-byte *Smooth24 PARM((byte *, int, int, int, int, int,
- byte *, byte *, byte *));
+void BTSetActive PARM((BUTT *, int));
+void BTRedraw PARM((BUTT *));
+int BTTrack PARM((BUTT *));
-byte *DoColorDither PARM((byte *, byte *, int, int, byte *, byte *,
- byte *, byte *, byte *, byte *, int));
-byte *Do332ColorDither PARM((byte *, byte *, int, int, byte *, byte *,
- byte *, byte *, byte *, byte *, int));
+RBUTT *RBCreate PARM((RBUTT *, Window, int, int, const char *,
+ u_long, u_long, u_long, u_long));
-/*************************** XV24TO8.C **************************/
-void Init24to8 PARM((void));
-byte *Conv24to8 PARM((byte *, int, int, int,
- byte *, byte *, byte *));
+void RBRedraw PARM((RBUTT *, int));
+void RBSelect PARM((RBUTT *, int));
+int RBWhich PARM((RBUTT *));
+int RBCount PARM((RBUTT *));
+void RBSetActive PARM((RBUTT *, int, int));
+int RBClick PARM((RBUTT *, int, int));
+int RBTrack PARM((RBUTT *, int));
+
+
+void CBCreate PARM((CBUTT *, Window, int, int, const char *,
+ u_long, u_long, u_long, u_long));
+
+void CBRedraw PARM((CBUTT *));
+void CBSetActive PARM((CBUTT *, int));
+int CBClick PARM((CBUTT *,int,int));
+int CBTrack PARM((CBUTT *));
+
+
+void MBCreate PARM((MBUTT *, Window, int, int, u_int, u_int,
+ const char *, const char * const *, int,
+ u_long, u_long, u_long, u_long));
+
+void MBRedraw PARM((MBUTT *));
+void MBSetActive PARM((MBUTT *, int));
+int MBWhich PARM((MBUTT *));
+void MBSelect PARM((MBUTT *, int));
+int MBClick PARM((MBUTT *, int, int));
+int MBTrack PARM((MBUTT *));
+
+
+/*************************** XVCOLOR.C ***************************/
+void SortColormap PARM((byte *, int, int, int *, byte*,byte*,byte*,
+ byte *, byte *));
+void ColorCompress8 PARM((byte *));
+void AllocColors PARM((void));
+Status xvAllocColor PARM((Display *, Colormap, XColor *));
+void xvFreeColors PARM((Display *, Colormap, u_long *, int, u_long));
+void FreeColors PARM((void));
+void ApplyEditColor PARM((int));
+int MakeStdCmaps PARM((void));
+void MakeBrowCmap PARM((void));
+void ChangeCmapMode PARM((int, int, int));
-byte *Conv8to24 PARM((byte *, int, int, byte *, byte *, byte *));
/**************************** XVCTRL.C **************************/
-void CreateCtrl PARM((char *));
+void CreateCtrl PARM((const char *));
void SetButtPix PARM((BUTT *, Pixmap, int, int));
Pixmap MakePix1 PARM((Window, byte *, int, int));
@@ -1337,7 +1608,7 @@
void DrawCtrlStr PARM((void));
void ScrollToCurrent PARM((LIST *));
-void LSCreate PARM((LIST *, Window, int, int, int, int, int,
+void LSCreate PARM((LIST *, Window, int, int, int, int, int,
char **, int, u_long, u_long, u_long, u_long,
void (*)(int, SCRL *), int, int));
@@ -1346,20 +1617,56 @@
void LSChangeData PARM((LIST *, char **, int));
void LSNewData PARM((LIST *, char **, int));
void LSKey PARM((LIST *, int));
+int rd_str_cl PARM((const char *, const char *, int));
-/*************************** XVINFO.C ***************************/
-void CreateInfo PARM((char *));
-void InfoBox PARM((int));
-void RedrawInfo PARM((int, int, int, int));
-void SetInfoMode PARM((int));
-char *GetISTR PARM((int));
+/**************************** XVCUT.C ***************************/
+int CutAllowed PARM((void));
+int PasteAllowed PARM((void));
+void DoImgCopy PARM((void));
+void DoImgCut PARM((void));
+void DoImgClear PARM((void));
+void DoImgPaste PARM((void));
-#if defined(__STDC__) && !defined(NOSTDHDRS)
-void SetISTR(int, ...);
-#else
-void SetISTR();
-#endif
+void SaveToClip PARM((byte *));
+void InitSelection PARM((void));
+int HaveSelection PARM((void));
+int GetSelType PARM((void));
+void GetSelRCoords PARM((int *, int *, int *, int *));
+void EnableSelection PARM((int));
+void DrawSelection PARM((int));
+int DoSelection PARM((XButtonEvent *));
+void MoveGrowSelection PARM((int, int, int, int));
+void BlinkSelection PARM((int));
+void FlashSelection PARM((int));
+
+void CropRect2Rect PARM((int*,int*,int*,int*, int,int,int,int));
+void CoordE2C PARM((int, int, int *, int *));
+void CoordC2E PARM((int, int, int *, int *));
+void CoordP2C PARM((int, int, int *, int *));
+void CoordC2P PARM((int, int, int *, int *));
+void CoordP2E PARM((int, int, int *, int *));
+void CoordE2P PARM((int, int, int *, int *));
+
+
+/*************************** XVDFLT.C ***************************/
+void LoadDfltPic PARM((PICINFO *));
+void xbm2pic PARM((byte *, int, int, byte *, int, int, int, int,
+ int));
+void DrawStr2Pic PARM((char *, int, int, byte *, int, int, int));
+
+
+/*************************** XVDIAL.C ***************************/
+void DCreate PARM((DIAL *, Window, int, int, int, int,
+ double, double, double, double, double,
+ u_long, u_long, u_long, u_long,
+ const char *, const char *));
+
+void DSetRange PARM((DIAL *, double,double,double,double,double));
+void DSetVal PARM((DIAL *, double));
+void DSetActive PARM((DIAL *, int));
+void DRedraw PARM((DIAL *));
+int DTrack PARM((DIAL *, int, int));
/**************************** XVDIR.C ***************************/
@@ -1376,15 +1683,15 @@
void TrackDDirW PARM((int,int));
int DirKey PARM((int));
int DoSave PARM((void));
-void SetDirFName PARM((char *));
+void SetDirFName PARM((const char *));
char *GetDirFName PARM((void));
char *GetDirFullName PARM((void));
void SetDirSaveMode PARM((int, int));
int Globify PARM((char *));
-FILE *OpenOutFile PARM((char *));
-int CloseOutFile PARM((FILE *, char *, int));
+FILE *OpenOutFile PARM((const char *));
+int CloseOutFile PARM((FILE *, const char *, int));
-byte *GenSavePic PARM((int*, int*,int*, int*, int*,
+byte *GenSavePic PARM((int*, int*,int*, int*, int*,
byte**, byte**, byte**));
void GetSaveSize PARM((int *, int *));
@@ -1392,47 +1699,30 @@
int CheckPoll PARM((int));
void DIRDeletedFile PARM((char *));
void DIRCreatedFile PARM((char *));
+FILE *pic2_OpenOutFile PARM((char *, int *));
+void pic2_KillNullFile PARM((FILE *));
+int OpenOutFileDesc PARM((char *));
-/*************************** XVBROWSE.C ************************/
-void CreateBrowse PARM((char *, char *, char *, char *, char *));
-void OpenBrowse PARM((void));
-void HideBrowseWindows PARM((void));
-void UnHideBrowseWindows PARM((void));
-void SetBrowseCursor PARM((Cursor));
-void KillBrowseWindows PARM((void));
-int BrowseCheckEvent PARM((XEvent *, int *, int *));
-int BrowseDelWin PARM((Window));
-void SetBrowStr PARM((char *));
-void RegenBrowseIcons PARM((void));
-void BRDeletedFile PARM((char *));
-void BRCreatedFile PARM((char *));
-
-
-/*************************** XVTEXT.C ************************/
-void CreateTextWins PARM((char *, char *));
-void TextView PARM((char *));
-void OpenTextView PARM((char *, int, char *, int));
-
-void OpenCommentText PARM((void));
-void CloseCommentText PARM((void));
-void ChangeCommentText PARM((void));
-
-void ShowLicense PARM((void));
-void ShowKeyHelp PARM((void));
-
-void HideTextWindows PARM((void));
-void UnHideTextWindows PARM((void));
-void RaiseTextWindows PARM((void));
-void SetTextCursor PARM((Cursor));
-void KillTextWindows PARM((void));
-int TextCheckEvent PARM((XEvent *, int *, int *));
-int TextDelWin PARM((Window));
+/****************************** XVEVENT.C ****************************/
+int EventLoop PARM((void));
+int HandleEvent PARM((XEvent *, int *));
+void NewCutBuffer PARM((char *));
+void DrawWindow PARM((int,int,int,int));
+void WResize PARM((int, int));
+void WRotate PARM((void));
+void WCrop PARM((int, int, int, int));
+void WUnCrop PARM((void));
+void GetWindowPos PARM((XWindowAttributes *));
+void SetWindowPos PARM((XWindowAttributes *));
+void SetEpicMode PARM((void));
+int xvErrorHandler PARM((Display *, XErrorEvent *));
/**************************** XVGAM.C **************************/
-void CreateGam PARM((char *, double, double, double, double, int));
+void CreateGam PARM((const char *, double, double, double, double,
+ int));
int GamCheckEvent PARM((XEvent *));
void GamBox PARM((int));
void NewCMap PARM((void));
@@ -1450,173 +1740,344 @@
byte *GammifyPic24 PARM((byte *, int, int));
void GamSetAutoApply PARM((int));
-/*************************** XVSCRL.C ***************************/
-void SCCreate PARM((SCRL *, Window, int, int, int, int,
- int, int, int, int, u_long, u_long,
- u_long, u_long, void (*)(int, SCRL *)));
-void SCChange PARM((SCRL *, int, int, int, int, int,
- int, int, int));
+/**************************** XVGRAB.C ***************************/
+int Grab PARM((void));
+int LoadGrab PARM((PICINFO *));
-void SCSetRange PARM((SCRL *, int, int, int, int));
-int SCSetVal PARM((SCRL *, int));
-void SCRedraw PARM((SCRL *));
-void SCTrack PARM((SCRL *, int, int));
+/**************************** XVGRAF.C ***************************/
+void CreateGraf PARM((GRAF *, Window, int, int,
+ u_long, u_long, const char *));
-/*************************** XVDIAL.C ***************************/
-void DCreate PARM((DIAL *, Window, int, int, int, int, int,
- int, int, int, u_long, u_long, u_long,
- u_long, char *, char *));
+void InitGraf PARM((GRAF *));
+void RedrawGraf PARM((GRAF *, int));
+int ClickGraf PARM((GRAF *, Window, int, int));
+int GrafKey PARM((GRAF *, char *));
+void GenerateGrafFunc PARM((GRAF *, int));
+void Graf2Str PARM((GRAF_STATE *, char *));
+int Str2Graf PARM((GRAF_STATE *, const char *));
+void GetGrafState PARM((GRAF *, GRAF_STATE *));
+int SetGrafState PARM((GRAF *, GRAF_STATE *));
+void InitSpline PARM((int *, int *, int, double *));
+double EvalSpline PARM((int *, int *, double *, int, double));
-void DSetRange PARM((DIAL *, int, int, int, int));
-void DSetVal PARM((DIAL *, int));
-void DSetActive PARM((DIAL *, int));
-void DRedraw PARM((DIAL *));
-int DTrack PARM((DIAL *, int, int));
+/*************************** XVIMAGE.C ***************************/
+void Resize PARM((int, int));
+void GenerateCpic PARM((void));
+void GenerateEpic PARM((int, int));
+void DoZoom PARM((int, int, u_int));
+void Crop PARM((void));
+void UnCrop PARM((void));
+void AutoCrop PARM((void));
+int DoAutoCrop PARM((void));
+void DoCrop PARM((int, int, int, int));
+void Rotate PARM((int));
+void DoRotate PARM((int));
+void RotatePic PARM((byte *, int, int *, int *, int));
+void Flip PARM((int));
+void FlipPic PARM((byte *, int, int, int));
+void InstallNewPic PARM((void));
+void DrawEpic PARM((void));
+void KillOldPics PARM((void));
-/**************************** XVBUTT.C ***************************/
-void BTCreate PARM((BUTT *, Window, int, int, u_int, u_int,
- char *, u_long, u_long, u_long, u_long));
+byte *FSDither PARM((byte *, int, int, int,
+ byte *, byte *, byte *, int, int));
-void BTSetActive PARM((BUTT *, int));
-void BTRedraw PARM((BUTT *));
-int BTTrack PARM((BUTT *));
+void CreateXImage PARM((void));
+XImage *Pic8ToXImage PARM((byte *, u_int, u_int, u_long *,
+ byte *, byte *, byte *));
+XImage *Pic24ToXImage PARM((byte *, u_int, u_int));
-RBUTT *RBCreate PARM((RBUTT *, Window, int, int, char *,
- u_long, u_long, u_long, u_long));
+void Set824Menus PARM((int));
+void Change824Mode PARM((int));
+void FreeEpic PARM((void));
+void InvertPic24 PARM((byte *, int, int));
-void RBRedraw PARM((RBUTT *, int));
-void RBSelect PARM((RBUTT *, int));
-int RBWhich PARM((RBUTT *));
-int RBCount PARM((RBUTT *));
-void RBSetActive PARM((RBUTT *, int, int));
-int RBClick PARM((RBUTT *, int, int));
-int RBTrack PARM((RBUTT *, int));
+byte *XVGetSubImage PARM((byte *, int, int,int, int,int,int,int));
+int DoPad PARM((int, char *, int, int, int, int));
+int LoadPad PARM((PICINFO *, char *));
-void CBCreate PARM((CBUTT *, Window, int, int, char *,
- u_long, u_long, u_long, u_long));
-void CBRedraw PARM((CBUTT *));
-void CBSetActive PARM((CBUTT *, int));
-int CBClick PARM((CBUTT *,int,int));
-int CBTrack PARM((CBUTT *));
+/*************************** XVINFO.C ***************************/
+void CreateInfo PARM((const char *));
+void InfoBox PARM((int));
+void RedrawInfo PARM((int, int, int, int));
+void SetInfoMode PARM((int));
+char *GetISTR PARM((int));
+#if defined(__STDC__) && !defined(NOSTDHDRS)
+void SetISTR(int, ...);
+#else
+void SetISTR();
+#endif
-void MBCreate PARM((MBUTT *, Window, int, int, u_int, u_int,
- char *,
- char **, int,u_long,u_long, u_long, u_long));
-void MBRedraw PARM((MBUTT *));
-void MBSetActive PARM((MBUTT *, int));
-int MBWhich PARM((MBUTT *));
-void MBSelect PARM((MBUTT *, int));
-int MBClick PARM((MBUTT *, int, int));
-int MBTrack PARM((MBUTT *));
+/*************************** XVMISC.C ***************************/
+void StoreDeleteWindowProp PARM((Window));
+Window CreateWindow PARM((const char *, const char *, const char *,
+ int, int, u_long, u_long, int));
+void DrawString PARM((Window, int, int, const char *));
+void CenterString PARM((Window, int, int, const char *));
+void ULineString PARM((Window, int, int, const char *));
+int StringWidth PARM((const char *));
+int CursorKey PARM((KeySym, int, int));
+void FakeButtonPress PARM((BUTT *));
+void FakeKeyPress PARM((Window, KeySym));
+void GenExpose PARM((Window, int, int, u_int, u_int));
+void DimRect PARM((Window, int, int, u_int, u_int, u_long));
+
+void Draw3dRect PARM((Window, int, int, u_int, u_int, int, int,
+ u_long, u_long, u_long));
+
+void RemapKeyCheck PARM((KeySym, char *, int *));
+void xvDestroyImage PARM((XImage *));
+void SetCropString PARM((void));
+void SetSelectionString PARM((void));
+void Warning PARM((void));
+void FatalError PARM((const char *));
+void Quit PARM((int));
+void LoadFishCursors PARM((void));
+void WaitCursor PARM((void));
+void SetCursors PARM((int));
+const char *BaseName PARM((const char *));
+
+void DrawTempGauge PARM((Window, int, int, int, int, double, u_long,
+ u_long, u_long, u_long, const char *));
+void ProgressMeter PARM((int, int, int, const char *));
+void XVDeletedFile PARM((char *));
+void XVCreatedFile PARM((char *));
+void xvbcopy PARM((const char *, char *, size_t));
+int xvbcmp PARM((const char *, const char *, size_t));
+void xvbzero PARM((char *, size_t));
+void xv_getwd PARM((char *, size_t));
+char *xv_strstr PARM((const char *, const char *));
+FILE *xv_fopen PARM((const char *, const char *));
+void xv_mktemp PARM((char *, const char *));
+void Timer PARM((int));
-/**************************** XVGRAF.C ***************************/
-void CreateGraf PARM((GRAF *, Window, int, int,
- u_long, u_long, char *));
+/*************************** XVPOPUP.C ***************************/
+void CenterMapWindow PARM((Window, int, int, int, int));
+int PopUp PARM((const char *, const char **, int));
+void ErrPopUp PARM((const char *, const char *));
+int GetStrPopUp PARM((const char *, const char **, int, char *, int,
+ const char *, int));
+int GrabPopUp PARM((int *, int *));
+int PadPopUp PARM((int *, char **, int *, int *, int *, int *));
+void ClosePopUp PARM((void));
+void OpenAlert PARM((const char *));
+void CloseAlert PARM((void));
+int PUCheckEvent PARM((XEvent *));
-void InitGraf PARM((GRAF *));
-void RedrawGraf PARM((GRAF *, int));
-int ClickGraf PARM((GRAF *, Window, int, int));
-int GrafKey PARM((GRAF *, char *));
-void GenerateGrafFunc PARM((GRAF *, int));
-void Graf2Str PARM((GRAF_STATE *, char *));
-int Str2Graf PARM((GRAF_STATE *, char *));
-void GetGrafState PARM((GRAF *, GRAF_STATE *));
-int SetGrafState PARM((GRAF *, GRAF_STATE *));
-void InitSpline PARM((int *, int *, int, double *));
-double EvalSpline PARM((int *, int *, double *, int, double));
+/**************************** XVROOT.C ****************************/
+void MakeRootPic PARM((void));
+void ClearRoot PARM((void));
+void SaveRootInfo PARM((void));
+void KillOldRootInfo PARM((void));
-/**************************** XVGIF.C ***************************/
-int LoadGIF PARM((char *, PICINFO *));
-/*************************** XVGIFWR.C **************************/
-int WriteGIF PARM((FILE *, byte *, int, int, int,
- byte *, byte *, byte *, int, int, char *));
+/*************************** XVSCRL.C ***************************/
+void SCCreate PARM((SCRL *, Window, int, int, int, int,
+ int, int, int, int, u_long, u_long,
+ u_long, u_long, void (*)(int, SCRL *)));
-/**************************** XVPM.C ****************************/
-int LoadPM PARM((char *, PICINFO *));
-int WritePM PARM((FILE *, byte *, int, int, int, byte *,
- byte *, byte *, int, int, char *));
+void SCChange PARM((SCRL *, int, int, int, int, int,
+ int, int, int));
-/**************************** XVPBM.C ***************************/
-int LoadPBM PARM((char *, PICINFO *));
-int WritePBM PARM((FILE *, byte *, int, int, int, byte *,
- byte *, byte *, int, int, int, char *));
+void SCSetRange PARM((SCRL *, int, int, int, int));
+int SCSetVal PARM((SCRL *, int));
+void SCRedraw PARM((SCRL *));
+void SCTrack PARM((SCRL *, int, int));
-/**************************** XVXBM.C ***************************/
-int LoadXBM PARM((char *, PICINFO *));
-int WriteXBM PARM((FILE *, byte *, int, int, byte *, byte *,
- byte *, char *));
-/**************************** XVSUNRAS.C ***************************/
-int LoadSunRas PARM((char *, PICINFO *));
-int WriteSunRas PARM((FILE *, byte *, int, int, int, byte *,
- byte *, byte*, int, int, int));
+/*************************** XVSMOOTH.C ***************************/
+byte *SmoothResize PARM((byte *, int, int, int, int, byte *, byte *,
+ byte *, byte *, byte *, byte *, int));
-/**************************** XVBMP.C ***************************/
-int LoadBMP PARM((char *, PICINFO *));
-int WriteBMP PARM((FILE *, byte *, int, int, int, byte *,
- byte *, byte *, int, int));
+byte *Smooth24 PARM((byte *, int, int, int, int, int,
+ byte *, byte *, byte *));
-/**************************** XVRLE.C ***************************/
-int LoadRLE PARM((char *, PICINFO *));
+byte *DoColorDither PARM((byte *, byte *, int, int, byte *, byte *,
+ byte *, byte *, byte *, byte *, int));
-/**************************** XVIRIS.C ***************************/
-int LoadIRIS PARM((char *, PICINFO *));
-int WriteIRIS PARM((FILE *, byte *, int, int, int, byte *,
- byte *, byte *, int, int));
+byte *Do332ColorDither PARM((byte *, byte *, int, int, byte *, byte *,
+ byte *, byte *, byte *, byte *, int));
-/**************************** XVPCX.C ***************************/
-int LoadPCX PARM((char *, PICINFO *));
-/**************************** XVIFF.C ***************************/
-int LoadIFF PARM((char *, PICINFO *));
+/*************************** XVTEXT.C ************************/
+void CreateTextWins PARM((const char *, const char *));
+int TextView PARM((const char *));
+void OpenTextView PARM((const char *, int, const char *, int));
-/**************************** XVTARGA.C ***************************/
-int LoadTarga PARM((char *, PICINFO *));
-int WriteTarga PARM((FILE *, byte *, int, int, int, byte *,
- byte *, byte *, int, int));
+void OpenCommentText PARM((void));
+void CloseCommentText PARM((void));
+void ChangeCommentText PARM((void));
-/**************************** XVXPM.C ***************************/
-int LoadXPM PARM((char *, PICINFO *));
-int WriteXPM PARM((FILE *, byte *, int, int, int, byte *,
- byte *, byte *, int, int, char *, char *));
+void ShowLicense PARM((void));
+void ShowKeyHelp PARM((void));
-/**************************** XVXWD.C ***************************/
-int LoadXWD PARM((char *, PICINFO *));
+void HideTextWindows PARM((void));
+void UnHideTextWindows PARM((void));
+void RaiseTextWindows PARM((void));
+void SetTextCursor PARM((Cursor));
+void KillTextWindows PARM((void));
+int TextCheckEvent PARM((XEvent *, int *, int *));
+int TextDelWin PARM((Window));
+
+int CharsetCheckEvent PARM((XEvent *));
+int CharsetDelWin PARM((Window));
+
+
+/**************************** XVVD.C ****************************/
+void Vdinit PARM((void));
+void Vdsettle PARM((void));
+int Chvdir PARM((char *));
+void Dirtovd PARM((char *));
+void Vdtodir PARM((char *));
+void Dirtosubst PARM((char *));
+int Mkvdir PARM((char *));
+void Mkvdir_force PARM((char *));
+int Rmvdir PARM((char *));
+int Movevdir PARM((char *, char *));
+int Isarchive PARM((char *));
+int Isvdir PARM((char *));
+void vd_HUPhandler PARM((void));
+void vd_handler PARM((int));
+int vd_Xhandler PARM((Display *, XErrorEvent *));
+int vd_XIOhandler PARM((Display *));
+void vd_handler_setup PARM((void));
+
+
+
+/*=======================================================================*/
+/* IMAGE FORMATS */
+/*=======================================================================*/
+
+/**************************** XVBMP.C ***************************/
+int LoadBMP PARM((char *, PICINFO *));
+int WriteBMP PARM((FILE *, byte *, int, int, int, byte *,
+ byte *, byte *, int, int));
/**************************** XVFITS.C ***************************/
int LoadFITS PARM((char *, PICINFO *, int));
int WriteFITS PARM((FILE *, byte *, int, int, int, byte *,
byte *, byte *, int, int, char *));
+/**************************** XVGIF.C ***************************/
+int LoadGIF PARM((char *, PICINFO *));
+
+/**************************** XVGIFWR.C **************************/
+int WriteGIF PARM((FILE *, byte *, int, int, int,
+ byte *, byte *, byte *, int, int, char *));
+
+/**************************** XVHIPS.C ***************************/
+int LoadHIPS PARM((char *, PICINFO *));
+
+/**************************** XVIFF.C ***************************/
+int LoadIFF PARM((char *, PICINFO *));
+
+/**************************** XVIRIS.C ***************************/
+int LoadIRIS PARM((char *, PICINFO *));
+int WriteIRIS PARM((FILE *, byte *, int, int, int, byte *,
+ byte *, byte *, int, int));
+
+/**************************** XVJP2K.C ***************************/
+int LoadJPC PARM((char *, register PICINFO *, int));
+int LoadJP2 PARM((char *, register PICINFO *, int));
+void CreateJP2KW PARM((void));
+void JP2KSaveParams PARM((int, char *, int));
+void JP2KDialog PARM((int vis));
+int JP2KCheckEvent PARM((register XEvent *));
+void VersionInfoJP2K PARM((void)); /* GRR 20070304 */
+
/**************************** XVJPEG.C ***************************/
int LoadJFIF PARM((char *, PICINFO *, int));
void CreateJPEGW PARM((void));
void JPEGDialog PARM((int));
int JPEGCheckEvent PARM((XEvent *));
void JPEGSaveParams PARM((char *, int));
+void VersionInfoJPEG PARM((void)); /* GRR 19980605 */
-/**************************** XVTIFF.C ***************************/
-int LoadTIFF PARM((char *, PICINFO *));
-void CreateTIFFW PARM((void));
-void TIFFDialog PARM((int));
-int TIFFCheckEvent PARM((XEvent *));
-void TIFFSaveParams PARM((char *, int));
+/**************************** XVMAG.C ***************************/
+int LoadMAG PARM((char *, PICINFO *));
+int WriteMAG PARM((FILE *, byte *, int, int, int,
+ byte *, byte *, byte *, int, int, char *));
+
+/**************************** XVMAKI.C ***************************/
+int LoadMAKI PARM((char *, PICINFO *));
+int WriteMAKI PARM((FILE *, byte *, int, int, int,
+ byte *, byte *, byte *, int, int));
+
+/**************************** XVMGCSFX.C ***************************/
+int is_mgcsfx PARM((char *, unsigned char *, int));
+char *mgcsfx_auto_input_com PARM((char *));
+int LoadMGCSFX PARM((char *, PICINFO *));
+void CreateMGCSFXW PARM((void));
+void MGCSFXDialog PARM((int));
+int MGCSFXCheckEvent PARM((XEvent *));
+int MGCSFXSaveParams PARM((char *, int));
+
+int getInputCom PARM((void));
+int getOutputCom PARM((void));
+
+/**************************** XVPBM.C ***************************/
+#ifdef HAVE_MGCSFX
+int LoadPBM PARM((char *, PICINFO *, int));
+#else
+int LoadPBM PARM((char *, PICINFO *));
+#endif
+int WritePBM PARM((FILE *, byte *, int, int, int, byte *,
+ byte *, byte *, int, int, int, char *));
+
+/**************************** XVPCD.C ***************************/
+int LoadPCD PARM((char *, PICINFO *, int));
+void CreatePCDW PARM((void));
+void PCDDialog PARM((int));
+int PCDCheckEvent PARM((XEvent *));
+void PCDSetParamOptions PARM((const char *));
+
+/**************************** XVPCX.C ***************************/
+int LoadPCX PARM((char *, PICINFO *));
/**************************** XVPDS.C ***************************/
int LoadPDS PARM((char *, PICINFO *));
-/*************************** XVPS.C ***************************/
+/**************************** XVPI.C ***************************/
+int LoadPi PARM((char *, PICINFO *));
+int WritePi PARM((FILE *, byte *, int, int, int,
+ byte *, byte *, byte *, int, int, char *));
+
+/**************************** XVPIC.C ***************************/
+int LoadPIC PARM((char *, PICINFO *));
+int WritePIC PARM((FILE *, byte *, int, int, int,
+ byte *, byte *, byte *, int, int, char *));
+
+/**************************** XVPIC2.C ***************************/
+int LoadPIC2 PARM((char *, PICINFO *, int));
+void CreatePIC2W PARM((void));
+void PIC2Dialog PARM((int));
+int PIC2CheckEvent PARM((XEvent *));
+int PIC2SetParamOptions PARM((char *));
+
+/**************************** XVPM.C ****************************/
+int LoadPM PARM((char *, PICINFO *));
+int WritePM PARM((FILE *, byte *, int, int, int, byte *,
+ byte *, byte *, int, int, char *));
+
+/**************************** XVPNG.C ***************************/
+int LoadPNG PARM((char *, PICINFO *));
+void CreatePNGW PARM((void));
+void PNGDialog PARM((int));
+int PNGCheckEvent PARM((XEvent *));
+void PNGSaveParams PARM((char *, int));
+void VersionInfoPNG PARM((void)); /* GRR 19980605 */
+
+/**************************** XVPS.C ****************************/
void CreatePSD PARM((char *));
void PSDialog PARM((int));
int PSCheckEvent PARM((XEvent *));
@@ -1624,56 +2085,46 @@
void PSResize PARM((void));
int LoadPS PARM((char *, PICINFO *, int));
-/*************************** XVPOPUP.C ***************************/
-void CenterMapWindow PARM((Window, int, int, int, int));
-int PopUp PARM((char *, char **, int));
-void ErrPopUp PARM((char *, char *));
-int GetStrPopUp PARM((char *, char **, int, char *, int,
- char *, int));
-int GrabPopUp PARM((int *, int *));
-int PadPopUp PARM((int *, char **, int *, int *, int *, int *));
-void ClosePopUp PARM((void));
-void OpenAlert PARM((char *));
-void CloseAlert PARM((void));
-int PUCheckEvent PARM((XEvent *));
-void TextRect PARM((Window, char *, int, int, int, int, u_long));
+/**************************** XVRLE.C ***************************/
+int LoadRLE PARM((char *, PICINFO *));
-/*************************** XVDFLT.C ***************************/
-void LoadDfltPic PARM((PICINFO *));
-void xbm2pic PARM((byte *, int, int, byte *, int, int, int, int,
- int));
-void DrawStr2Pic PARM((char *, int, int, byte *, int, int, int));
+/**************************** XVSUNRAS.C ***************************/
+int LoadSunRas PARM((char *, PICINFO *));
+int WriteSunRas PARM((FILE *, byte *, int, int, int, byte *,
+ byte *, byte*, int, int, int));
-/**************************** XVGRAB.C ***************************/
-int Grab PARM((void));
-int LoadGrab PARM((PICINFO *));
+/**************************** XVTARGA.C ***************************/
+int LoadTarga PARM((char *, PICINFO *));
+int WriteTarga PARM((FILE *, byte *, int, int, int, byte *,
+ byte *, byte *, int, int));
+/**************************** XVTIFF.C ***************************/
+int LoadTIFF PARM((char *, PICINFO *, int));
+void CreateTIFFW PARM((void));
+void TIFFDialog PARM((int));
+int TIFFCheckEvent PARM((XEvent *));
+void TIFFSaveParams PARM((char *, int));
+void VersionInfoTIFF PARM((void)); /* GRR 19980605 */
-/**************************** XVCUT.C ***************************/
-int CutAllowed PARM((void));
-int PasteAllowed PARM((void));
-void DoImgCopy PARM((void));
-void DoImgCut PARM((void));
-void DoImgClear PARM((void));
-void DoImgPaste PARM((void));
+/**************************** XVWBMP.C ***************************/
+int LoadWBMP PARM((char *, PICINFO *));
+int WriteWBMP PARM((FILE *, byte *, int, int, int, byte *,
+ byte *, byte *, int, int));
-void SaveToClip PARM((byte *));
-void InitSelection PARM((void));
-int HaveSelection PARM((void));
-int GetSelType PARM((void));
-void GetSelRCoords PARM((int *, int *, int *, int *));
-void EnableSelection PARM((int));
-void DrawSelection PARM((int));
-int DoSelection PARM((XButtonEvent *));
-void MoveGrowSelection PARM((int, int, int, int));
-void BlinkSelection PARM((int));
-void FlashSelection PARM((int));
+/**************************** XVXBM.C ***************************/
+int LoadXBM PARM((char *, PICINFO *));
+int WriteXBM PARM((FILE *, byte *, int, int, byte *, byte *,
+ byte *, char *));
-void CropRect2Rect PARM((int*,int*,int*,int*, int,int,int,int));
-void CoordE2C PARM((int, int, int *, int *));
-void CoordC2E PARM((int, int, int *, int *));
-void CoordP2C PARM((int, int, int *, int *));
-void CoordC2P PARM((int, int, int *, int *));
-void CoordP2E PARM((int, int, int *, int *));
-void CoordE2P PARM((int, int, int *, int *));
+/**************************** XVXPM.C ***************************/
+int LoadXPM PARM((char *, PICINFO *));
+int WriteXPM PARM((FILE *, byte *, int, int, int, byte *,
+ byte *, byte *, int, int, char *, char *));
+/**************************** XVXWD.C ***************************/
+int LoadXWD PARM((char *, PICINFO *));
+
+/**************************** XVZX.C [JCE] **********************/
+int LoadZX PARM((char *, PICINFO *));
+int WriteZX PARM((FILE *, byte *, int, int, int, byte *,
+ byte *, byte *, int, int, char *));
diff -ru xv-3.10a/xv24to8.c xv-3.10a-enhancements/xv24to8.c
--- xv-3.10a/xv24to8.c 1995-01-13 11:49:21.000000000 -0800
+++ xv-3.10a-enhancements/xv24to8.c 2007-05-12 13:56:44.000000000 -0700
@@ -14,15 +14,15 @@
*
* The Conv24to8 procedure will set up the following: it will allocate, make
* & return 'pic8', a 'w' by 'h' (passed in values) 8-bit picture.
- * it will load up the rmap, gmap and bmap colormap arrays. it will NOT
+ * it will load up the rmap, gmap and bmap colormap arrays. it will NOT
* calculate numcols, since the cmap sort procedure has to be called anyway
*
- * Conv24to8 returns 'pic8' if successful, 'NULL' on failure (presumably on a
+ * Conv24to8 returns 'pic8' if successful, 'NULL' on failure (presumably on a
* malloc())
*
- * The 'slow' code, while still based on Heckbert's Median Cut algorithm,
+ * The 'slow' code, while still based on Heckbert's Median Cut algorithm,
* has been shamelessly lifted from the Independent JPEG Group's software
- * (jquant2.c), as (for a variety of reasons) theirs was far better than
+ * (jquant2.c), as (for a variety of reasons) theirs was far better than
* the version I was previously using. Thanks guys!
*
* Also, as is my way, I've stripped out most of the IJG's well-written
@@ -65,10 +65,10 @@
{
/* returns pointer to new 8-bit-per-pixel image (w*h) if successful, or
NULL if unsuccessful */
-
+
int i;
byte *pic8;
-
+
if (!pic24) return NULL;
pic8 = (byte *) malloc((size_t) (w * h));
@@ -79,9 +79,9 @@
if (nc<=0) nc = 255; /* 'nc == 0' breaks code */
- if (!noqcheck && quick_check(pic24, w,h, pic8, rm,gm,bm, nc)) {
+ if (!noqcheck && quick_check(pic24, w,h, pic8, rm,gm,bm, nc)) {
SetISTR(ISTR_INFO,"No color compression was necessary.\n");
- return pic8;
+ return pic8;
}
switch (conv24) {
@@ -89,19 +89,19 @@
SetISTR(ISTR_INFO,"Doing 'quick' 24-bit to 8-bit conversion.");
i = quick_quant(pic24, w, h, pic8, rm, gm, bm, nc);
break;
-
+
case CONV24_BEST:
SetISTR(ISTR_INFO,"Doing 'best' 24-bit to 8-bit conversion.");
i = ppm_quant(pic24, w, h, pic8, rm, gm, bm, nc);
break;
-
+
case CONV24_SLOW:
default:
SetISTR(ISTR_INFO,"Doing 'slow' 24-bit to 8-bit conversion.");
i = slow_quant(pic24, w, h, pic8, rm, gm, bm, nc);
break;
}
-
+
if (i) { free(pic8); pic8 = NULL; }
return pic8;
}
@@ -134,7 +134,7 @@
return pic24;
}
-
+
/****************************/
static int quick_check(pic24, w,h, pic8, rmap,gmap,bmap, maxcol)
@@ -154,10 +154,10 @@
if (maxcol>256) maxcol = 256;
/* put the first color in the table by hand */
- nc = 0; mid = 0;
+ nc = 0; mid = 0;
for (i=w*h,p=pic24; i; i--) {
- col = (((u_long) *p++) << 16);
+ col = (((u_long) *p++) << 16);
col += (((u_long) *p++) << 8);
col += *p++;
@@ -184,7 +184,7 @@
pic24 into colormap offsets into 'colors' */
for (i=w*h,p=pic24, pix=pic8; i; i--,pix++) {
- col = (((u_long) *p++) << 16);
+ col = (((u_long) *p++) << 16);
col += (((u_long) *p++) << 8);
col += *p++;
@@ -206,7 +206,7 @@
/* and load up the 'desired colormap' */
for (i=0; i>16;
+ rmap[i] = colors[i]>>16;
gmap[i] = (colors[i]>>8) & 0xff;
bmap[i] = colors[i] & 0xff;
}
@@ -224,7 +224,7 @@
{
/* called after 'pic8' has been alloced, pWIDE,pHIGH set up, mono/1-bit
checked already */
-
+
/* up to 256 colors: 3 bits R, 3 bits G, 2 bits B (RRRGGGBB) */
#define RMASK 0xe0
#define RSHIFT 0
@@ -252,7 +252,7 @@
gmap[i] = (((i<>RSHIFT) | ((g1&GMASK)>>GSHIFT) |
+ val = (((r1&RMASK)>>RSHIFT) | ((g1&GMASK)>>GSHIFT) |
((b1&BMASK)>>BSHIFT));
*pp = val;
-
+
/* compute color errors */
r1 -= rmap[val];
g1 -= gmap[val];
b1 -= bmap[val];
-
+
/* Add fractions of errors to adjacent pixels */
if (j!=jmax) { /* adjust RIGHT pixel */
thisptr[0] += (r1*7) / 16;
thisptr[1] += (g1*7) / 16;
thisptr[2] += (b1*7) / 16;
}
-
+
if (i!=imax) { /* do BOTTOM pixel */
nextptr[0] += (r1*5) / 16;
nextptr[1] += (g1*5) / 16;
@@ -316,7 +316,7 @@
}
}
}
-
+
free(thisline);
free(nextline);
return 0;
@@ -329,7 +329,7 @@
#undef BMASK
#undef BSHIFT
}
-
+
@@ -381,7 +381,7 @@
/* Luminance macro. */
-/*
+/*
* #define PPM_LUMIN(p) \
* ( 0.299 * PPM_GETR(p) + 0.587 * PPM_GETG(p) + 0.114 * PPM_GETB(p) )
*/
@@ -449,18 +449,18 @@
byte *pic24, *pic8, *rmap, *gmap, *bmap;
int cols, rows, newcolors;
{
- pixel** pixels;
- register pixel* pP;
- int row;
- register int col, limitcol;
- pixval maxval, newmaxval;
- int colors;
- register int index;
- chist_vec chv, colormap;
- chash_table cht;
- int i;
- unsigned char *picptr;
- static char *fn = "ppmquant()";
+ pixel** pixels;
+ register pixel* pP;
+ int row;
+ register int col, limitcol;
+ pixval maxval, newmaxval;
+ int colors;
+ register int index;
+ chist_vec chv, colormap;
+ chash_table cht;
+ int i;
+ unsigned char *picptr;
+ static const char *fn = "ppmquant()";
index = 0;
maxval = 255;
@@ -472,7 +472,7 @@
if (DEBUG) fprintf(stderr,"%s: remapping to ppm-style internal fmt\n", fn);
WaitCursor();
-
+
pixels = (pixel **) malloc(rows * sizeof(pixel *));
if (!pixels) FatalError("couldn't allocate 'pixels' array");
for (row=0; row= bl)
qsort((char*) &(chv[indx]), (size_t) clrs, sizeof(struct chist_item),
greencompare );
- else
+ else
qsort((char*) &(chv[indx]), (size_t) clrs, sizeof(struct chist_item),
bluecompare );
}
@@ -750,7 +750,7 @@
++boxes;
qsort((char*) bv, (size_t) boxes, sizeof(struct box), sumcompare);
} /* while (boxes ... */
-
+
/*
** Ok, we've got enough boxes. Now choose a representative color for
** each box. There are a number of possible ways to make this choice.
@@ -761,7 +761,7 @@
** method is used by switching the commenting on the REP_ defines at
** the beginning of this source file.
*/
-
+
for (bi=0; bicolor ) -
+ return (int) PPM_GETR( ((chist_vec)p1)->color ) -
(int) PPM_GETR( ((chist_vec)p2)->color );
}
@@ -799,7 +799,7 @@
static int greencompare(p1, p2)
const void *p1, *p2;
{
- return (int) PPM_GETG( ((chist_vec)p1)->color ) -
+ return (int) PPM_GETG( ((chist_vec)p1)->color ) -
(int) PPM_GETG( ((chist_vec)p2)->color );
}
@@ -807,7 +807,7 @@
static int bluecompare(p1, p2)
const void *p1, *p2;
{
- return (int) PPM_GETB( ((chist_vec)p1)->color ) -
+ return (int) PPM_GETB( ((chist_vec)p1)->color ) -
(int) PPM_GETB( ((chist_vec)p2)->color );
}
@@ -821,7 +821,7 @@
/****************************************************************************/
-static chist_vec
+static chist_vec
ppm_computechist(pixels, cols, rows, maxcolors, colorsP)
pixel** pixels;
int cols, rows, maxcolors;
@@ -840,7 +840,7 @@
/****************************************************************************/
-static chash_table ppm_computechash(pixels, cols, rows,
+static chash_table ppm_computechash(pixels, cols, rows,
maxcolors, colorsP )
pixel** pixels;
int cols, rows, maxcolors;
@@ -861,14 +861,14 @@
for (chl = cht[hash]; chl != (chist_list) 0; chl = chl->next)
if (PPM_EQUAL(chl->ch.color, *pP)) break;
-
+
if (chl != (chist_list) 0) ++(chl->ch.value);
else {
if ((*colorsP)++ > maxcolors) {
ppm_freechash(cht);
return (chash_table) 0;
}
-
+
chl = (chist_list) malloc(sizeof(struct chist_list_item));
if (!chl) FatalError("ran out of memory computing hash table");
@@ -878,7 +878,7 @@
cht[hash] = chl;
}
}
-
+
return cht;
}
@@ -1114,7 +1114,7 @@
register int i;
register long maxc = 0;
boxptr which = NULL;
-
+
for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
if (boxp->colorcount > maxc && boxp->volume > 0) {
which = boxp;
@@ -1133,7 +1133,7 @@
register int i;
register INT32 maxv = 0;
boxptr which = NULL;
-
+
for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
if (boxp->volume > maxv) {
which = boxp;
@@ -1153,11 +1153,11 @@
int c0min,c0max,c1min,c1max,c2min,c2max;
INT32 dist0,dist1,dist2;
long ccount;
-
+
c0min = boxp->c0min; c0max = boxp->c0max;
c1min = boxp->c1min; c1max = boxp->c1max;
c2min = boxp->c2min; c2max = boxp->c2max;
-
+
if (c0max > c0min)
for (c0 = c0min; c0 <= c0max; c0++)
for (c1 = c1min; c1 <= c1max; c1++) {
@@ -1229,7 +1229,7 @@
dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE;
dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE;
boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2;
-
+
ccount = 0;
for (c0 = c0min; c0 <= c0max; c0++)
for (c1 = c1min; c1 <= c1max; c1++) {
@@ -1315,11 +1315,11 @@
long c0total = 0;
long c1total = 0;
long c2total = 0;
-
+
c0min = boxp->c0min; c0max = boxp->c0max;
c1min = boxp->c1min; c1max = boxp->c1max;
c2min = boxp->c2min; c2max = boxp->c2max;
-
+
for (c0 = c0min; c0 <= c0max; c0++)
for (c1 = c1min; c1 <= c1max; c1++) {
histp = & histogram[c0][c1][c2min];
@@ -1332,7 +1332,7 @@
}
}
}
-
+
sl_colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total);
sl_colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total);
sl_colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total);
@@ -1505,12 +1505,12 @@
bptr = bestdist;
for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--)
*bptr++ = 0x7FFFFFFFL;
-
+
/* Nominal steps between cell centers ("x" in Thomas article) */
#define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE)
#define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE)
#define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE)
-
+
for (i = 0; i < numcolors; i++) {
icolor = colorlist[i];
/* Compute (square of) distance from minc0/c1/c2 to this color */
@@ -1576,7 +1576,7 @@
minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1);
minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1);
minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1);
-
+
numcolors = find_nearby_colors(minc0, minc1, minc2, colorlist);
/* Determine the actually nearest colors. */
diff -ru xv-3.10a/xvalg.c xv-3.10a-enhancements/xvalg.c
--- xv-3.10a/xvalg.c 1994-12-22 14:34:47.000000000 -0800
+++ xv-3.10a-enhancements/xvalg.c 2007-05-12 16:07:37.000000000 -0700
@@ -38,7 +38,7 @@
double, int));
static void doPixel PARM((byte *,int,int,byte *, int,int,int,int,
int, int));
-static void doSpread PARM((byte *,int,int,byte *, int,int,int,int,
+static void doSpread PARM((byte *,int,int,byte *, int,int,int,int,
int, int));
static void doMedianFilter PARM((byte *,int,int,byte *, int,int,int,int, int));
@@ -53,7 +53,7 @@
static int start24bitAlg PARM((byte **, byte **));
static void end24bitAlg PARM((byte *, byte *));
-static void printUTime PARM((char *));
+static void printUTime PARM((const char *));
static byte *origPic = (byte *) NULL;
static int origPicType;
@@ -70,10 +70,11 @@
/***************************/
static void printUTime(str)
- char *str;
+ const char *str;
{
#ifdef TIMING_TEST
- int i; struct rusage ru;
+ int i;
+ struct rusage ru;
i = getrusage(RUSAGE_SELF, &ru);
fprintf(stderr,"%s: utime = %d.%d seconds\n",
@@ -89,7 +90,7 @@
/************************************************************/
void AlgInit()
{
- /* called whenver an image file is loaded. disposes of origPic
+ /* called whenver an image file is loaded. disposes of origPic
if neccessary, and points it to null */
if (origPic) free(origPic);
@@ -160,16 +161,16 @@
{
/* runs a n*n convolution mask (all 1's) over 'pic',
producing a 24-bit version. Then calls 24to8 to generate a new 8-bit
- image, and installs it.
+ image, and installs it.
Note that 'n' must be odd for things to work properly */
- byte *pic24, *tmpPic;
- int i, sx,sy,sw,sh, n;
- static char *labels[] = { "\nOk", "\033Cancel" };
- char txt[256];
- static char buf[64] = { '3', '\0' };
-
+ byte *pic24, *tmpPic;
+ int i, sx,sy,sw,sh, n;
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char txt[256];
+ static char buf[64] = { '3', '\0' };
+
sprintf(txt, "Blur: \n\n%s",
"Enter mask size (ex. 3, 5, 7, ...)");
@@ -178,7 +179,7 @@
n = atoi(buf);
if (n < 1 || (n&1)!=1) {
- ErrPopUp("Error: The value entered must be odd and greater than zero.",
+ ErrPopUp("Error: The value entered must be odd and greater than zero.",
"\nOh!");
return;
}
@@ -194,7 +195,7 @@
if (start24bitAlg(&pic24, &tmpPic)) return;
xvbcopy((char *) pic24, (char *) tmpPic, (size_t) (pWIDE*pHIGH*3));
-
+
doBlurConvolv(pic24, pWIDE,pHIGH, tmpPic, sx,sy,sw,sh, n);
end24bitAlg(pic24, tmpPic);
@@ -207,12 +208,12 @@
{
/* runs an edge-enhancment algorithm */
- byte *pic24, *tmpPic;
- int i, sx,sy,sw,sh, n;
- static char *labels[] = { "\nOk", "\033Cancel" };
- char txt[256];
- static char buf[64] = { '7', '5', '\0' };
-
+ byte *pic24, *tmpPic;
+ int i, sx,sy,sw,sh, n;
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char txt[256];
+ static char buf[64] = { '7', '5', '\0' };
+
sprintf(txt, "Sharpen: \n\n%s",
"Enter enhancement factor (0-99%)");
@@ -236,7 +237,7 @@
if (start24bitAlg(&pic24, &tmpPic)) return;
xvbcopy((char *) pic24, (char *) tmpPic, (size_t) (pWIDE*pHIGH*3));
-
+
doSharpConvolv(pic24, pWIDE,pHIGH, tmpPic, sx,sy,sw,sh, n);
end24bitAlg(pic24, tmpPic);
@@ -248,7 +249,7 @@
static void EdgeDetect()
{
byte *pic24, *p24, *tmpPic, *tlp;
- char *str;
+ const char *str;
int i, j, v, maxv, sx,sy,sw,sh;
WaitCursor();
@@ -264,7 +265,7 @@
xvbcopy((char *) pic24, (char *) tmpPic, (size_t) (pWIDE*pHIGH*3));
doEdgeConvolv(pic24, pWIDE, pHIGH, tmpPic, sx,sy,sw,sh);
-
+
SetISTR(ISTR_INFO, "%snormalizing...", str);
/* Normalize results */
@@ -292,19 +293,19 @@
/************************/
static void TinFoil()
{
- byte *pic24, *p24, *tmpPic, *tp, *tlp;
- char *str;
- int i, j, v, maxv,sx,sy,sw,sh;
-
+ byte *pic24, *tmpPic, *tp, *tlp;
+ const char *str;
+ int i, j, v, sx,sy,sw,sh;
+
WaitCursor();
-
+
str = "Doing cheesy embossing effect...";
SetISTR(ISTR_INFO, str);
-
+
if (HaveSelection()) GetSelRCoords(&sx,&sy,&sw,&sh);
else { sx = 0; sy = 0; sw = pWIDE; sh = pHIGH; }
CropRect2Rect(&sx,&sy,&sw,&sh, 0,0,pWIDE,pHIGH);
-
+
if (start24bitAlg(&pic24, &tmpPic)) return;
xvbcopy((char *) pic24, (char *) tmpPic, (size_t) (pWIDE*pHIGH*3));
@@ -315,9 +316,9 @@
*tp++ = 128; *tp++ = 128; *tp++ = 128;
}
}
-
+
doAngleConvolv(pic24, pWIDE, pHIGH, tmpPic, sx,sy,sw,sh);
-
+
/* mono-ify selected area of tmpPic */
for (i=sy; i0 = CCW)",
(clr ? "Clear" : "Copy"));
@@ -396,12 +397,12 @@
rotval = atof(buf);
if (rotval == 0.0) return;
-
+
if (HaveSelection()) GetSelRCoords(&sx,&sy,&sw,&sh);
else { sx = 0; sy = 0; sw = pWIDE; sh = pHIGH; }
CropRect2Rect(&sx,&sy,&sw,&sh, 0,0,pWIDE,pHIGH);
-
+
WaitCursor();
if (start24bitAlg(&pic24, &tmpPic)) return;
@@ -416,11 +417,11 @@
/************************/
static void Pixelize()
{
- byte *pic24, *tmpPic;
- int i,sx,sy,sw,sh, pixX,pixY,err;
- static char *labels[] = { "\nOk", "\033Cancel" };
- char txt[256];
- static char buf[64] = { '4', '\0' };
+ byte *pic24, *tmpPic;
+ int i,sx,sy,sw,sh, pixX,pixY,err;
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char txt[256];
+ static char buf[64] = { '4', '\0' };
sprintf(txt, "Pixelize:\n\nEnter new pixel size, in image pixels: %s",
"(ex. '3', '5x8')");
@@ -443,11 +444,11 @@
return;
}
-
+
if (HaveSelection()) GetSelRCoords(&sx,&sy,&sw,&sh);
else { sx = 0; sy = 0; sw = pWIDE; sh = pHIGH; }
CropRect2Rect(&sx,&sy,&sw,&sh, 0,0,pWIDE,pHIGH);
-
+
WaitCursor();
if (start24bitAlg(&pic24, &tmpPic)) return;
@@ -463,11 +464,11 @@
/************************/
static void Spread()
{
- byte *pic24, *tmpPic;
- int i,sx,sy,sw,sh, pixX,pixY,err;
- static char *labels[] = { "\nOk", "\033Cancel" };
- char txt[256];
- static char buf[64] = { '5', '\0' };
+ byte *pic24, *tmpPic;
+ int i,sx,sy,sw,sh, pixX,pixY,err;
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char txt[256];
+ static char buf[64] = { '5', '\0' };
sprintf(txt, "Spread:\n\nEnter spread factor (or x,y factors): %s",
"(ex. '10', '1x5')");
@@ -493,11 +494,11 @@
return;
}
-
+
if (HaveSelection()) GetSelRCoords(&sx,&sy,&sw,&sh);
else { sx = 0; sy = 0; sw = pWIDE; sh = pHIGH; }
CropRect2Rect(&sx,&sy,&sw,&sh, 0,0,pWIDE,pHIGH);
-
+
WaitCursor();
if (start24bitAlg(&pic24, &tmpPic)) return;
@@ -516,12 +517,12 @@
/* runs median filter algorithm (for n*n rect centered around each pixel,
replace with median value */
- byte *pic24, *tmpPic;
- int i, sx,sy,sw,sh, n;
- static char *labels[] = { "\nOk", "\033Cancel" };
- char txt[256];
- static char buf[64] = { '3', '\0' };
-
+ byte *pic24, *tmpPic;
+ int i, sx,sy,sw,sh, n;
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char txt[256];
+ static char buf[64] = { '3', '\0' };
+
sprintf(txt, "DeSpeckle (median filter): \n\n%s",
"Enter mask size (ex. 3, 5, 7, ...)");
@@ -530,7 +531,7 @@
n = atoi(buf);
if (n < 1 || (n&1)!=1) {
- ErrPopUp("Error: The value entered must be odd and greater than zero.",
+ ErrPopUp("Error: The value entered must be odd and greater than zero.",
"\nOh!");
return;
}
@@ -546,7 +547,7 @@
if (start24bitAlg(&pic24, &tmpPic)) return;
xvbcopy((char *) pic24, (char *) tmpPic, (size_t) (pWIDE*pHIGH*3));
-
+
doMedianFilter(pic24, pWIDE,pHIGH, tmpPic, sx,sy,sw,sh, n);
end24bitAlg(pic24, tmpPic);
@@ -560,7 +561,7 @@
int w,h, selx,sely,selw,selh, n;
{
- /* convolves with an n*n array, consisting of only 1's.
+ /* convolves with an n*n array, consisting of only 1's.
Operates on rectangular region 'selx,sely,selw,selh' (in pic coords)
Region is guaranteed to be completely within pic boundaries
'n' must be odd */
@@ -568,7 +569,7 @@
register byte *p24;
register int rsum,gsum,bsum;
byte *rp;
- int i,j,k,x,y,x1,y1,count,n2;
+ int x,y,x1,y1,count,n2;
printUTime("start of blurConvolv");
@@ -589,7 +590,7 @@
for (y1=y-n2; y1<=y+n2; y1++) {
if (y1>=sely && y1=selx && x1=sely && i=selx && j=sely && i=selx && j fabs(dslope)) { /* y axis is major */
ey = (dy<0) ? sely : sely+selh-1;
@@ -1092,7 +1093,7 @@
printUTime("end of blend");
}
-
+
/************************/
static void doRotate(pic24, w, h, results, selx,sely,selw,selh, rotval, clear)
@@ -1104,7 +1105,7 @@
by the amount specified in degrees (rotval), and stores the result in
'results', which is also a w*h 24-bit image. The rotated bits are
clipped to fit in 'results'. If 'clear', the (unrotated) rectangular
- region is cleared (in results) first.
+ region is cleared (in results) first.
sel[x,y,w,h] is guaranteed to be within image bounds */
byte *pp, *dp;
@@ -1118,7 +1119,7 @@
printUTime("start of rotate");
/*
- * cfx,cfy - center point of sel rectangle (double)
+ * cfx,cfy - center point of sel rectangle (double)
* rx1,ry1 - top-left of sel, rotated
* rx2,ry2 - bot-left of sel, rotated
* rx3,ry3 - top-right of sel, rotated
@@ -1174,7 +1175,7 @@
/* now, for each pixel in rb[x,y,w,h], do the inverse rotation to see if
it would be in the original unrotated selection rectangle. if it *is*,
compute and store an appropriate color, otherwise skip it */
-
+
for (y=rby; y %7.2f %7.2f (d=%f ang=%f)\n",
+ fprintf(stderr,"(%4d,%4d) -> %7.2f %7.2f (d=%f ang=%f)\n",
cx,cy, *rx,*ry, d, ang);
#endif
}
-
+
/************************/
@@ -1323,29 +1324,29 @@
byte *pic24, *results;
int w, h, selx,sely,selw,selh, pixX,pixY;
{
- /* runs 'pixelization' algorithm. replaces each pixX-by-pixY region
+ /* runs 'pixelization' algorithm. replaces each pixX-by-pixY region
(smaller on edges) with the average color within that region */
-
+
byte *pp;
int nwide, nhigh, i,j, x,y, x1,y1, stx,sty;
int nsum, rsum, gsum, bsum;
-
+
printUTime("start of pixelize");
-
+
/* center grid on selection */
nwide = (selw + pixX-1) / pixX;
nhigh = (selh + pixY-1) / pixY;
-
+
stx = selx - (nwide*pixX - selw)/2;
sty = sely - (nhigh*pixY - selh)/2;
-
+
y = sty;
for (i=0; i0) { /* just to be safe... */
rsum /= nsum; gsum /= nsum; bsum /= nsum;
RANGE(rsum,0,255); RANGE(gsum,0,255); RANGE(bsum,0,255);
}
-
-
+
+
/* STORE color in rect:[x,y,pixX,pixY] */
for (y1=y; y1=sely && y1=selx && x10; d=d/2) {
for (i=d; i=0 && rtab[j]>rtab[j+d]; j-=d) {
@@ -1531,14 +1532,14 @@
}
}
}
-
+
c2 = count/2;
*rp++ = (byte) ( (count&1) ? rtab[c2] : (rtab[c2] + rtab[c2-1])/2);
*rp++ = (byte) ( (count&1) ? gtab[c2] : (gtab[c2] + gtab[c2-1])/2);
*rp++ = (byte) ( (count&1) ? btab[c2] : (btab[c2] + btab[c2-1])/2);
}
}
-
+
free(rtab); free(gtab); free(btab);
printUTime("end of doMedianFilter");
}
@@ -1549,7 +1550,7 @@
static void intsort(a, n)
int *a, n;
{
- /* uses the shell-sort algorithm. for the relatively small data sets
+ /* uses the shell-sort algorithm. for the relatively small data sets
we'll be using, should be quicker than qsort() because of all the
function calling overhead associated with qsort(). */
@@ -1571,7 +1572,7 @@
byte **pic24, **tmpPic;
{
/* generates a 24-bit version of 'pic', if neccessary, and also mallocs
- * a pWIDE*pHIGH*3 24-bit output pic.
+ * a pWIDE*pHIGH*3 24-bit output pic.
*
* Returns '1' if there's some sort of screwup, '0' if cool
*/
@@ -1588,7 +1589,7 @@
*tmpPic = (byte *) calloc((size_t) (pWIDE * pHIGH * 3), (size_t) 1);
if (!(*tmpPic)) {
SetCursors(-1);
- ErrPopUp("Unable to malloc() tmp 24-bit image in start24bitAlg()",
+ ErrPopUp("Unable to malloc() tmp 24-bit image in start24bitAlg()",
"\nTough!");
if (picType == PIC8) free(*pic24);
return 1;
@@ -1609,16 +1610,16 @@
saveOrigPic(); /* also kills pic/cpic/epic/egampic/theImage, NOT pic24 */
/* copy results to pic24 */
- xvbcopy((char *) outPic, (char *) pic24, (size_t) (pWIDE*pHIGH*3));
+ xvbcopy((char *) outPic, (char *) pic24, (size_t) (pWIDE*pHIGH*3));
free(outPic);
if (picType == PIC8) {
pic = Conv24to8(pic24, pWIDE, pHIGH, ncols, rMap,gMap,bMap);
free(pic24);
- if (!pic) {
+ if (!pic) {
SetCursors(-1);
ErrPopUp("Some sort of failure occured in 24to8 conversion\n","\nDamn!");
- NoAlg();
+ NoAlg();
return;
}
}
@@ -1632,7 +1633,7 @@
static void saveOrigPic()
{
/* saves original picture into origPic, if it hasn't already been done.
- This allows us to undo algorithms...
+ This allows us to undo algorithms...
Also, frees all pics, (except 'pic', if we're in PIC24 mode) */
@@ -1649,7 +1650,7 @@
/* make a backup copy of 'pic' */
origPic = (byte *) malloc((size_t)(pWIDE*pHIGH*((picType==PIC8) ? 1 : 3)));
if (!origPic) FatalError("out of memory in 'saveOrigPic()'");
- xvbcopy((char *) pic, (char *) origPic,
+ xvbcopy((char *) pic, (char *) origPic,
(size_t) (pWIDE * pHIGH * ((picType==PIC8) ? 1 : 3)));
origPicType = picType;
diff -ru xv-3.10a/xvbmp.c xv-3.10a-enhancements/xvbmp.c
--- xv-3.10a/xvbmp.c 1994-12-22 14:34:42.000000000 -0800
+++ xv-3.10a-enhancements/xvbmp.c 2007-05-13 17:46:16.000000000 -0700
@@ -1,5 +1,5 @@
/*
- * xvbmp.c - i/o routines for .BMP files (MS Windows 3.x)
+ * xvbmp.c - I/O routines for .BMP files (MS Windows 3.x and later; OS/2)
*
* LoadBMP(fname, numcols)
* WriteBMP(fp, pic, ptype, w, h, r, g, b, numcols, style);
@@ -9,30 +9,39 @@
#include "xv.h"
-/* comments on error handling:
- a truncated file is not considered a Major Error. The file is loaded, the
- rest of the pic is filled with 0's.
-
- a file with garbage characters in it is an unloadable file. All allocated
- stuff is tossed, and LoadPBM returns non-zero
-
- not being able to malloc is a Fatal Error. The program is aborted. */
-
-
-#define BI_RGB 0
-#define BI_RLE8 1
-#define BI_RLE4 2
+/* Comments on error-handling:
+ A truncated file is not considered a Major Error. The file is loaded,
+ and the rest of the pic is filled with 0's.
+
+ A file with garbage characters in it is an unloadable file. All allocated
+ stuff is tossed, and LoadBMP returns non-zero.
+
+ Not being able to malloc is a Fatal Error. The program is aborted. */
+
+
+#define BI_RGB 0 /* a.k.a. uncompressed */
+#define BI_RLE8 1
+#define BI_RLE4 2
+#define BI_BITFIELDS 3 /* BMP version 4 */
+#define BI_JPEG 4 /* BMP version 5 (not yet supported) */
+#define BI_PNG 5 /* BMP version 5 (not yet supported) */
#define WIN_OS2_OLD 12
#define WIN_NEW 40
#define OS2_NEW 64
+#if (defined(UINT_MAX) && UINT_MAX != 0xffffffffU)
+# error XV's BMP code requires 32-bit unsigned integer type, but u_int isn't
+#endif
+
static long filesize;
static int loadBMP1 PARM((FILE *, byte *, u_int, u_int));
static int loadBMP4 PARM((FILE *, byte *, u_int, u_int, u_int));
static int loadBMP8 PARM((FILE *, byte *, u_int, u_int, u_int));
-static int loadBMP24 PARM((FILE *, byte *, u_int, u_int));
+static int loadBMP16 PARM((FILE *, byte *, u_int, u_int, u_int *));
+static int loadBMP24 PARM((FILE *, byte *, u_int, u_int, u_int));
+static int loadBMP32 PARM((FILE *, byte *, u_int, u_int, u_int *));
static u_int getshort PARM((FILE *));
static u_int getint PARM((FILE *));
static void putshort PARM((FILE *, int));
@@ -41,7 +50,7 @@
static void writeBMP4 PARM((FILE *, byte *, int, int));
static void writeBMP8 PARM((FILE *, byte *, int, int));
static void writeBMP24 PARM((FILE *, byte *, int, int));
-static int bmpError PARM((char *, char *));
+static int bmpError PARM((const char *, const char *));
#define FERROR(fp) (ferror(fp) || feof(fp))
@@ -52,15 +61,15 @@
PICINFO *pinfo;
/*******************************************/
{
- FILE *fp;
- int i, c, c1, rv;
- unsigned int bfSize, bfOffBits, biSize, biWidth, biHeight, biPlanes;
- unsigned int biBitCount, biCompression, biSizeImage, biXPelsPerMeter;
- unsigned int biYPelsPerMeter, biClrUsed, biClrImportant;
- int bPad;
- char *cmpstr;
- byte *pic24, *pic8;
- char buf[512], *bname;
+ FILE *fp;
+ int i, c, c1, rv, bPad;
+ u_int bfSize, bfOffBits, biSize, biWidth, biHeight, biPlanes;
+ u_int biBitCount, biCompression, biSizeImage, biXPelsPerMeter;
+ u_int biYPelsPerMeter, biClrUsed, biClrImportant;
+ u_int colormask[3];
+ char buf[512], rgb_bits[16];
+ const char *cmpstr, *bname;
+ byte *pic24, *pic8;
/* returns '1' on success */
@@ -69,7 +78,7 @@
fp = xv_fopen(fname,"r");
if (!fp) return (bmpError(bname, "couldn't open file"));
-
+
fseek(fp, 0L, 2); /* figure out the file size */
filesize = ftell(fp);
fseek(fp, 0L, 0);
@@ -98,17 +107,16 @@
biClrUsed = getint(fp);
biClrImportant = getint(fp);
}
-
else { /* old bitmap format */
biWidth = getshort(fp); /* Types have changed ! */
biHeight = getshort(fp);
biPlanes = getshort(fp);
biBitCount = getshort(fp);
-
- /* Not in old versions so have to compute them*/
+
+ /* not in old versions, so have to compute them */
biSizeImage = (((biPlanes * biBitCount*biWidth)+31)/32)*4*biHeight;
-
- biCompression = BI_RGB;
+
+ biCompression = BI_RGB;
biXPelsPerMeter = biYPelsPerMeter = 0;
biClrUsed = biClrImportant = 0;
}
@@ -126,22 +134,39 @@
if (FERROR(fp)) { bmpError(bname,"EOF reached in file header"); goto ERROR; }
- /* error checking */
- if ((biBitCount!=1 && biBitCount!=4 && biBitCount!=8 && biBitCount!=24) ||
- biPlanes!=1 || biCompression>BI_RLE4) {
+ /* error-checking */
+ if ((biBitCount!=1 && biBitCount!=4 && biBitCount!=8 &&
+ biBitCount!=16 && biBitCount!=24 && biBitCount!=32) ||
+ biPlanes!=1 || biCompression>BI_PNG ||
+ biWidth<=0 || biHeight<=0 ||
+ (biClrUsed && biClrUsed > (1 << biBitCount))) {
+
+ sprintf(buf,
+ "Unsupported BMP type (%dx%d, Bits=%d, Colors=%d, Planes=%d, "
+ "Compr=%d)",
+ biWidth, biHeight, biBitCount, biClrUsed, biPlanes, biCompression);
- sprintf(buf,"Bogus BMP File! (bitCount=%d, Planes=%d, Compression=%d)",
- biBitCount, biPlanes, biCompression);
+ bmpError(bname, buf);
+ goto ERROR;
+ }
+
+ if (biCompression>BI_BITFIELDS) {
+ sprintf(buf, "Unsupported BMP compression method (%s)",
+ biCompression == BI_JPEG? "JPEG" :
+ biCompression == BI_PNG? "PNG" :
+ "unknown/newer than v5");
bmpError(bname, buf);
goto ERROR;
}
if (((biBitCount==1 || biBitCount==24) && biCompression != BI_RGB) ||
- (biBitCount==4 && biCompression==BI_RLE8) ||
- (biBitCount==8 && biCompression==BI_RLE4)) {
+ (biBitCount==4 && biCompression!=BI_RGB && biCompression!=BI_RLE4) ||
+ (biBitCount==8 && biCompression!=BI_RGB && biCompression!=BI_RLE8) ||
+ ((biBitCount==16 || biBitCount==32) &&
+ biCompression!=BI_RGB && biCompression!=BI_BITFIELDS)) {
- sprintf(buf,"Bogus BMP File! (bitCount=%d, Compression=%d)",
+ sprintf(buf,"Unsupported BMP type (bitCount=%d, Compression=%d)",
biBitCount, biCompression);
bmpError(bname, buf);
@@ -153,13 +178,21 @@
if (biSize != WIN_OS2_OLD) {
/* skip ahead to colormap, using biSize */
c = biSize - 40; /* 40 bytes read from biSize to biClrImportant */
- for (i=0; i1) {
@@ -188,7 +221,7 @@
if (biSize != WIN_OS2_OLD) {
/* Waste any unused bytes between the colour map (if present)
and the start of the actual bitmap data. */
-
+
while (bPad > 0) {
(void) getc(fp);
bPad--;
@@ -197,31 +230,57 @@
/* create pic8 or pic24 */
- if (biBitCount==24) {
- pic24 = (byte *) calloc((size_t) biWidth * biHeight * 3, (size_t) 1);
+ if (biBitCount==16 || biBitCount==24 || biBitCount==32) {
+ u_int npixels = biWidth * biHeight;
+ u_int count = 3 * npixels;
+
+ if (biWidth == 0 || biHeight == 0 || npixels/biWidth != biHeight ||
+ count/3 != npixels)
+ return (bmpError(bname, "image dimensions too large"));
+ pic24 = (byte *) calloc((size_t) count, (size_t) 1);
if (!pic24) return (bmpError(bname, "couldn't malloc 'pic24'"));
}
else {
- pic8 = (byte *) calloc((size_t) biWidth * biHeight, (size_t) 1);
+ u_int npixels = biWidth * biHeight;
+
+ if (biWidth == 0 || biHeight == 0 || npixels/biWidth != biHeight)
+ return (bmpError(bname, "image dimensions too large"));
+ pic8 = (byte *) calloc((size_t) npixels, (size_t) 1);
if (!pic8) return(bmpError(bname, "couldn't malloc 'pic8'"));
}
WaitCursor();
/* load up the image */
- if (biBitCount == 1) rv = loadBMP1(fp,pic8,biWidth,biHeight);
- else if (biBitCount == 4) rv = loadBMP4(fp,pic8,biWidth,biHeight,
- biCompression);
- else if (biBitCount == 8) rv = loadBMP8(fp,pic8,biWidth,biHeight,
- biCompression);
- else rv = loadBMP24(fp,pic24,biWidth,biHeight);
+ switch (biBitCount) {
+ case 1:
+ rv = loadBMP1(fp, pic8, biWidth, biHeight);
+ break;
+ case 4:
+ rv = loadBMP4(fp, pic8, biWidth, biHeight, biCompression);
+ break;
+ case 8:
+ rv = loadBMP8(fp, pic8, biWidth, biHeight, biCompression);
+ break;
+ case 16:
+ rv = loadBMP16(fp, pic24, biWidth, biHeight, /* v-- BI_RGB */
+ biCompression == BI_BITFIELDS? colormask : NULL);
+ break;
+ default:
+ if (biBitCount == 32 && biCompression == BI_BITFIELDS)
+ rv = loadBMP32(fp, pic24, biWidth, biHeight, colormask);
+ else /* 24 or (32 and BI_RGB) */
+ rv = loadBMP24(fp, pic24, biWidth, biHeight, biBitCount);
+ break;
+ }
+
+ if (rv) bmpError(bname, "File appears truncated. Winging it.");
- if (rv) bmpError(bname, "File appears truncated. Winging it.\n");
fclose(fp);
- if (biBitCount == 24) {
+ if (biBitCount > 8) {
pinfo->pic = pic24;
pinfo->type = PIC24;
}
@@ -233,6 +292,22 @@
cmpstr = "";
if (biCompression == BI_RLE4) cmpstr = ", RLE4 compressed";
else if (biCompression == BI_RLE8) cmpstr = ", RLE8 compressed";
+ else if (biCompression == BI_BITFIELDS) {
+ int bit, c[3], i;
+ u_int mask;
+
+ for (i = 0; i < 3; ++i) {
+ mask = colormask[i];
+ c[i] = 0;
+ for (bit = 0; bit < 32; ++bit) {
+ if (mask & 1)
+ ++c[i];
+ mask >>= 1;
+ }
+ }
+ sprintf(rgb_bits, ", RGB%d%d%d", c[0], c[1], c[2]);
+ cmpstr = rgb_bits;
+ }
pinfo->w = biWidth; pinfo->h = biHeight;
pinfo->normw = pinfo->w; pinfo->normh = pinfo->h;
@@ -254,7 +329,7 @@
ERROR:
fclose(fp);
return 0;
-}
+}
/*******************************************/
@@ -264,12 +339,13 @@
u_int w,h;
{
int i,j,c,bitnum,padw;
- byte *pp;
+ byte *pp = pic8 + ((h - 1) * w);
+ size_t l = w*h;
c = 0;
padw = ((w + 31)/32) * 32; /* 'w', padded to be a multiple of 32 */
- for (i=h-1; i>=0; i--) {
+ for (i=h-1; i>=0 && (pp - pic8 <= l); i--) {
pp = pic8 + (i * w);
if ((i&0x3f)==0) WaitCursor();
for (j=bitnum=0; j=0; i--) {
+
+ for (i=h-1; i>=0 && (pp - pic8 <= l); i--) {
pp = pic8 + (i * w);
if ((i&0x3f)==0) WaitCursor();
-
+
for (j=nybnum=0; j> 4;
c <<= 4;
@@ -325,55 +401,55 @@
if (FERROR(fp)) break;
}
}
-
+
else if (comp == BI_RLE4) { /* read RLE4 compressed data */
- x = y = 0;
+ x = y = 0;
pp = pic8 + x + (h-y-1)*w;
-
+
while (y>4)&0x0f);
}
-
+
else { /* c==0x00 : escape codes */
c = getc(fp); if (c == EOF) { rv = 1; break; }
-
+
if (c == 0x00) { /* end of line */
x=0; y++; pp = pic8 + x + (h-y-1)*w;
- }
-
+ }
+
else if (c == 0x01) break; /* end of pic8 */
-
+
else if (c == 0x02) { /* delta */
c = getc(fp); x += c;
c = getc(fp); y += c;
pp = pic8 + x + (h-y-1)*w;
}
-
+
else { /* absolute mode */
- for (i=0; i>4)&0x0f);
}
-
+
if (((c&3)==1) || ((c&3)==2)) getc(fp); /* read pad byte */
}
} /* escape processing */
if (FERROR(fp)) break;
} /* while */
}
-
+
else {
fprintf(stderr,"unknown BMP compression type 0x%0x\n", comp);
}
-
+
if (FERROR(fp)) rv = 1;
return rv;
-}
+}
@@ -384,14 +460,18 @@
u_int w,h,comp;
{
int i,j,c,c1,padw,x,y,rv;
- byte *pp;
-
+ byte *pp = pic8 + ((h - 1) * w);
+ size_t l = w*h;
+ byte *pend;
+
rv = 0;
+ pend = pic8 + w * h;
+
if (comp == BI_RGB) { /* read uncompressed data */
padw = ((w + 3)/4) * 4; /* 'w' padded to a multiple of 4pix (32 bits) */
- for (i=h-1; i>=0; i--) {
+ for (i=h-1; i>=0 && (pp - pic8 <= l); i--) {
pp = pic8 + (i * w);
if ((i&0x3f)==0) WaitCursor();
@@ -404,15 +484,15 @@
}
else if (comp == BI_RLE8) { /* read RLE8 compressed data */
- x = y = 0;
+ x = y = 0;
pp = pic8 + x + (h-y-1)*w;
- while (y>= 1;
+ }
+ bitshift[i+3] = bitshift[i] + 16;
+
+ colorbits[i] = 0;
+ for (; bit < 32; ++bit) {
+ if (buf & 1)
+ ++colorbits[i];
+ else
+ break;
+ buf >>= 1;
+ }
+ if (colorbits[i] > 8) { /* over 8-bit depth */
+ bitshift[i] += (colorbits[i] - 8);
+ bitshift[i+3] = bitshift[i] + 16;
+ bitshift2[i] = bitshift2[i+3] = 0;
+ } else
+ bitshift2[i] = bitshift2[i+3] = 8 - colorbits[i];
+ }
+ }
+
+ if (DEBUG > 1)
+ fprintf(stderr, "loadBMP16: bitfields\n"
+ "\tR: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n"
+ "\t (mask = %08x, shift >>%2d, <<%2d)\n"
+ "\tG: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n"
+ "\t (mask = %08x, shift >>%2d, <<%2d)\n"
+ "\tB: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n"
+ "\t (mask = %08x, shift >>%2d, <<%2d)\n",
+ colorbits[0], colormask[0], bitshift[0], bitshift2[0],
+ colormask[3], bitshift[3], bitshift2[3],
+ colorbits[1], colormask[1], bitshift[1], bitshift2[1],
+ colormask[4], bitshift[4], bitshift2[4],
+ colorbits[2], colormask[2], bitshift[2], bitshift2[2],
+ colormask[5], bitshift[5], bitshift2[5]);
+
+ for (y = h-1; y >= 0 && (pp - pic24 <= l); y--) {
+ pp = pic24 + (3 * w * y);
+ if ((y&0x3f)==0) WaitCursor();
+
+ for (x = w; x > 1; x -= 2) {
+ buf = getint(fp);
+ *(pp++) = (buf & colormask[0]) >> bitshift[0] << bitshift2[0];
+ *(pp++) = (buf & colormask[1]) >> bitshift[1] << bitshift2[1];
+ *(pp++) = (buf & colormask[2]) >> bitshift[2] << bitshift2[2];
+ *(pp++) = (buf & colormask[3]) >> bitshift[3] << bitshift2[3];
+ *(pp++) = (buf & colormask[4]) >> bitshift[4] << bitshift2[4];
+ *(pp++) = (buf & colormask[5]) >> bitshift[5] << bitshift2[5];
+ }
+ if (w & 1) { /* padded to 2 pix */
+ buf = getint(fp);
+ *(pp++) = (buf & colormask[0]) >> bitshift[0];
+ *(pp++) = (buf & colormask[1]) >> bitshift[1];
+ *(pp++) = (buf & colormask[2]) >> bitshift[2];
+ }
+ }
+
+ return FERROR(fp)? 1 : 0;
+}
+
+
+
+/*******************************************/
+static int loadBMP24(fp, pic24, w, h, bits) /* also handles 32-bit BI_RGB */
FILE *fp;
byte *pic24;
- u_int w,h;
+ u_int w,h, bits;
{
int i,j,padb,rv;
- byte *pp;
+ byte *pp = pic24 + ((h - 1) * w * 3);
+ size_t l = w*h*3;
rv = 0;
padb = (4 - ((w*3) % 4)) & 0x03; /* # of pad bytes to read at EOscanline */
+ if (bits==32) padb = 0;
for (i=h-1; i>=0; i--) {
pp = pic24 + (i * w * 3);
if ((i&0x3f)==0) WaitCursor();
-
- for (j=0; j>= 1;
+ }
+
+ colorbits[i] = 0;
+ for (; bit < 32; ++bit) {
+ if (buf & 1)
+ ++colorbits[i];
+ else
+ break;
+ buf >>= 1;
+ }
+ if (colorbits[i] > 8) { /* over 8-bit depth */
+ bitshift[i] += (colorbits[i] - 8);
+ bitshift2[i] = 0;
+ } else
+ bitshift2[i] = 8 - colorbits[i];
+ }
+
+ if (DEBUG > 1)
+ fprintf(stderr, "loadBMP32: bitfields\n"
+ "\tR: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n"
+ "\tG: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n"
+ "\tB: bits = %2d, mask = %08x, shift >>%2d, <<%2d\n",
+ colorbits[0], colormask[0], bitshift[0], bitshift2[0],
+ colorbits[1], colormask[1], bitshift[1], bitshift2[1],
+ colorbits[2], colormask[2], bitshift[2], bitshift2[2]);
+
+ for (y = h-1; y >= 0; y--) {
+ pp = pic24 + (3 * w * y);
+ if ((y&0x3f)==0) WaitCursor();
+
+ for(x = w; x > 0; x --) {
+ buf = getint(fp);
+ *(pp++) = (buf & colormask[0]) >> bitshift[0] << bitshift2[0];
+ *(pp++) = (buf & colormask[1]) >> bitshift[1] << bitshift2[1];
+ *(pp++) = (buf & colormask[2]) >> bitshift[2] << bitshift2[2];
+ }
+ }
+
+ return FERROR(fp)? 1 : 0;
+}
/*******************************************/
-static unsigned int getshort(fp)
+static u_int getshort(fp)
FILE *fp;
{
int c, c1;
c = getc(fp); c1 = getc(fp);
- return ((unsigned int) c) + (((unsigned int) c1) << 8);
+ return ((u_int) c) + (((u_int) c1) << 8);
}
/*******************************************/
-static unsigned int getint(fp)
+static u_int getint(fp)
FILE *fp;
{
int c, c1, c2, c3;
c = getc(fp); c1 = getc(fp); c2 = getc(fp); c3 = getc(fp);
- return ((unsigned int) c) +
- (((unsigned int) c1) << 8) +
- (((unsigned int) c2) << 16) +
- (((unsigned int) c3) << 24);
+ return ((u_int) c) +
+ (((u_int) c1) << 8) +
+ (((u_int) c2) << 16) +
+ (((u_int) c3) << 24);
}
@@ -518,7 +769,7 @@
{
int c, c1;
- c = ((unsigned int ) i) & 0xff; c1 = (((unsigned int) i)>>8) & 0xff;
+ c = ((u_int) i) & 0xff; c1 = (((u_int) i)>>8) & 0xff;
putc(c, fp); putc(c1,fp);
}
@@ -529,10 +780,10 @@
int i;
{
int c, c1, c2, c3;
- c = ((unsigned int ) i) & 0xff;
- c1 = (((unsigned int) i)>>8) & 0xff;
- c2 = (((unsigned int) i)>>16) & 0xff;
- c3 = (((unsigned int) i)>>24) & 0xff;
+ c = ((u_int) i) & 0xff;
+ c1 = (((u_int) i)>>8) & 0xff;
+ c2 = (((u_int) i)>>16) & 0xff;
+ c3 = (((u_int) i)>>24) & 0xff;
putc(c, fp); putc(c1,fp); putc(c2,fp); putc(c3,fp);
}
@@ -562,11 +813,11 @@
* 8-bit image
* note that PIC24 and F_BWDITHER/F_REDUCED won't happen
*
- * if colorstyle == F_BWDITHER, it writes a 1-bit image
+ * if colorstyle == F_BWDITHER, it writes a 1-bit image
*
*/
- int i,j, nc, nbits, bperlin, cmaplen;
+ int i,j, nc, nbits, bperlin, cmaplen, npixels;
byte *graypic, *sp, *dp, graymap[256];
nc = nbits = cmaplen = 0;
@@ -576,10 +827,16 @@
/* generate a faked 8-bit per pixel image with a grayscale cmap,
so that it can just fall through existing 8-bit code */
- graypic = (byte *) malloc((size_t) w*h);
+ npixels = w * h;
+ if (w <= 0 || h <= 0 || npixels/w != h) {
+ SetISTR(ISTR_WARNING, "image dimensions too large");
+ return -1;
+ }
+
+ graypic = (byte *) malloc((size_t) npixels);
if (!graypic) FatalError("unable to malloc in WriteBMP()");
- for (i=0,sp=pic824,dp=graypic; i=0; i--) {
- pp = pic8 + (i * w);
+ pp = pic8 + (i * w);
if ((i&0x3f)==0) WaitCursor();
for (j=bitnum=c=0; j<=padw; j++,bitnum++) {
@@ -716,7 +973,7 @@
putc(c,fp);
bitnum = c = 0;
}
-
+
c <<= 1;
if (j /* access() */
#if defined(VMS) || defined(isc)
typedef unsigned int mode_t; /* file mode bits */
#endif
+#ifndef MAX
+# define MAX(a,b) (((a)>(b))?(a):(b)) /* used only for wheelmouse support */
+#endif
+
/* load up built-in icons */
#include "bits/br_file"
@@ -34,27 +39,40 @@
#include "bits/br_sock"
#include "bits/br_fifo"
#include "bits/br_error"
-#include "bits/br_unknown"
+/* #include "bits/br_unknown" commented out (near line 492) */
+
#include "bits/br_cmpres"
+#include "bits/br_bzip2"
-#include "bits/br_gif"
-#include "bits/br_pm"
-#include "bits/br_pbm"
-#include "bits/br_xbm"
-#include "bits/br_sunras"
#include "bits/br_bmp"
-#include "bits/br_utah"
+#include "bits/br_fits"
+#include "bits/br_gif"
+#include "bits/br_iff"
#include "bits/br_iris"
-#include "bits/br_pcx"
#include "bits/br_jfif"
-#include "bits/br_tiff"
+#include "bits/br_jp2"
+#include "bits/br_jpc"
+#include "bits/br_mag"
+#include "bits/br_maki"
+#include "bits/br_mgcsfx"
+#include "bits/br_pbm"
+#include "bits/br_pcd"
+#include "bits/br_pcx"
#include "bits/br_pds"
+#include "bits/br_pi"
+#include "bits/br_pic"
+#include "bits/br_pic2"
+#include "bits/br_pm"
+#include "bits/br_png"
#include "bits/br_ps"
-#include "bits/br_iff"
+#include "bits/br_sunras"
#include "bits/br_targa"
+#include "bits/br_tiff"
+#include "bits/br_utah"
+#include "bits/br_xbm"
#include "bits/br_xpm"
#include "bits/br_xwd"
-#include "bits/br_fits"
+#include "bits/br_zx" /* [JCE] The Spectrum+3 icon */
#include "bits/br_trash"
#include "bits/fcurs"
@@ -90,17 +108,28 @@
#define BF_COMPRESS 21
#define BF_PS 22
#define BF_IFF 23
-#define BF_TARGA 24
+#define BF_TGA 24
#define BF_XPM 25
#define BF_XWD 26
#define BF_FITS 27
-#define BF_MAX 28 /* # of built-in icons */
+#define BF_PNG 28
+#define BF_ZX 29 /* [JCE] Spectrum SCREEN$ */
+#define BF_PCD 30
+#define BF_BZIP2 31
+#define BF_JP2 32
+#define BF_JPC 33
+#define JP_EXT_BF (BF_JPC)
+#define BF_MAG (JP_EXT_BF + 1)
+#define BF_MAKI (JP_EXT_BF + 2)
+#define BF_PIC (JP_EXT_BF + 3)
+#define BF_PI (JP_EXT_BF + 4)
+#define BF_PIC2 (JP_EXT_BF + 5)
+#define BF_MGCSFX (JP_EXT_BF + 6)
+#define JP_EXT_BF_END (BF_MGCSFX)
+#define BF_MAX (JP_EXT_BF_END + 1) /* # of built-in icons */
#define ISLOADABLE(ftyp) (ftyp!=BF_DIR && ftyp!=BF_CHR && ftyp!=BF_BLK && \
- ftyp!=BF_SOCK && ftyp!=BF_FIFO)
-
-#define DEF_BROWWIDE 615 /* default size of window */
-#define DEF_BROWHIGH 356
+ ftyp!=BF_SOCK && ftyp!=BF_FIFO)
#define SCROLLVERT 8 /* height of scroll region at top/bottom of iconw */
#define PAGEVERT 40 /* during rect drag, if further than this, page */
@@ -113,59 +142,93 @@
#define BOTMARGIN 58 /* room for a row of buttons and a line of text */
#define LRMARGINS 5 /* left and right margins */
-#define ISIZE_WIDE 80 /* maximum size of an icon */
-#define ISIZE_HIGH 60
+/* some people like bigger icons; 4:3 aspect ratio is recommended
+ * (NOTE: standard XV binaries will not be able to read larger icons!) */
+#ifndef ISIZE_WIDE
+# define ISIZE_WIDE 80 /* maximum size of an icon */
+#endif
+#ifndef ISIZE_HIGH
+# define ISIZE_HIGH 60
+#endif
+
+#ifndef ISIZE_WPAD
+# define ISIZE_WPAD 16 /* extra horizontal padding between icons */
+#endif
+
+#ifndef INUM_WIDE
+# define INUM_WIDE 6 /* size initial window to hold this many icons */
+#endif
+#ifndef INUM_HIGH
+# define INUM_HIGH 3
+#endif
-#define ISPACE_WIDE (ISIZE_WIDE+16) /* icon spacing */
+#define ISPACE_WIDE (ISIZE_WIDE+ISIZE_WPAD) /* icon spacing */
#define ISPACE_TOP 4 /* dist btwn top of ISPACE and ISIZE */
#define ISPACE_TTOP 4 /* dist btwn bot of icon and title */
#define ISPACE_HIGH (ISIZE_HIGH+ISPACE_TOP+ISPACE_TTOP+16+4)
#define DBLCLICKTIME 300 /* milliseconds */
-/* button/menu indicies */
-#define BR_CHDIR 0
-#define BR_DELETE 1
-#define BR_MKDIR 2
-#define BR_RENAME 3
-#define BR_RESCAN 4
-#define BR_UPDATE 5
-#define BR_NEWWIN 6
-#define BR_GENICON 7
-#define BR_SELALL 8
-#define BR_TEXTVIEW 9
-#define BR_RECURSUP 10
-#define BR_QUIT 11
-#define BR_CLOSE 12
-#define BR_NBUTTS 13 /* # of command buttons */
-#define BR_SEP1 13 /* separator */
-#define BR_HIDDEN 14
-#define BR_SELFILES 15
-#define BR_NCMDS 16 /* # of menu commands */
+#define COUNT(x) (sizeof (x) / sizeof (x)[0])
+
+/* button/menu indices */
+#define BR_CHDIR 0
+#define BR_DELETE 1
+#define BR_MKDIR 2
+#define BR_RENAME 3
+#define BR_RESCAN 4
+#define BR_UPDATE 5
+#define BR_NEWWIN 6
+#define BR_GENICON 7
+#define BR_SELALL 8
+#define BR_TEXTVIEW 9
+#define BR_RECURSUP 10
+#define BR_QUIT 11
+#define BR_CLOSE 12
+#define BR_NBUTTS 13 /* # of command buttons */
+#define BR_SEP1 13 /* separator */
+#define BR_HIDDEN 14
+#define BR_SELFILES 15
+#define BR_CLIPBRD 16
+#ifdef AUTO_EXPAND
+# define BR_CLEARVD 17
+# define BR_NCMDS 18 /* # of menu commands */
+#else
+# define BR_NCMDS 17 /* # of menu commands */
+#endif
#define BUTTW 80
#define BUTTH 24
-static char *showHstr = "Show hidden files";
-static char *hideHstr = "Hide 'hidden' files";
-
-static char *cmdMList[] = { "Change directory...\t^c",
- "Delete file(s)\t^d",
- "New directory...\t^n",
- "Rename file...\t^r",
- "Rescan directory\t^s",
- "Update icons\t^u",
- "Open new window\t^w",
- "Generate icon(s)\t^g",
- "Select all files\t^a",
- "Text view\t^t",
- "Recursive Update\t^e",
- "Quit xv\t^q",
- "Close window\t^c",
- MBSEP,
- "Show hidden files", /* no equiv */
- "Select files...\t^f"
- };
+/* original size of window was 615 x 356 (for 80x60 thumbnails in 6x3 array) */
+#define DEF_BROWWIDE (ISPACE_WIDE * INUM_WIDE + LRMARGINS * 2 + 29)
+#define DEF_BROWHIGH (ISPACE_HIGH * INUM_HIGH + BUTTH * 2 + 16 + 28)
+/* last number is a fudge--e.g., extra spaces, borders, etc. -----^ */
+
+static const char *showHstr = "Show hidden files";
+static const char *hideHstr = "Hide 'hidden' files";
+
+static const char *cmdMList[] = { "Change directory...\t^c",
+ "Delete file(s)\t^d",
+ "New directory...\t^n",
+ "Rename file...\t^r",
+ "Rescan directory\t^s",
+ "Update icons\t^u",
+ "Open new window\t^w",
+ "Generate icon(s)\t^g",
+ "Select all files\t^a",
+ "Text view\t^t",
+ "Recursive Update\t^e",
+ "Quit xv\t^q",
+ "Close window\t^c",
+ MBSEP,
+ "Show hidden files", /* no equiv */
+ "Select files...\t^f",
+ "Clipboard\t^x"
+#ifdef AUTO_EXPAND
+ , "Clear virtual directory"
+#endif
+ };
#define MAXDEEP 30 /* maximum directory depth */
@@ -183,32 +246,43 @@
} BFIL;
/* data needed per schnauzer window */
-typedef struct { Window win, iconW;
- int vis, wasvis;
+typedef struct { Window win, iconW;
+ int vis, wasvis;
- int wide, high;
- int iwWide, iwHigh;
- int numWide, numHigh, visHigh;
-
- SCRL scrl;
- BUTT but[BR_NBUTTS];
- MBUTT dirMB, cmdMB;
- char dispstr[256];
- int numbutshown;
- int showhidden;
-
- int numlit;
- BFIL *bfList;
- int bfLen;
- int lastIconClicked;
+ int wide, high;
+ int iwWide, iwHigh;
+ int numWide, numHigh, visHigh;
+
+ SCRL scrl;
+ BUTT but[BR_NBUTTS];
+ MBUTT dirMB, cmdMB;
+ char dispstr[256];
+ int numbutshown;
+ int showhidden;
+
+ int numlit;
+ BFIL *bfList;
+ int bfLen;
+ int lastIconClicked;
unsigned long lastClickTime;
- int ndirs;
- char *mblist[MAXDEEP];
- char path[MAXPATHLEN+2]; /* '/' terminated */
+ int ndirs;
+ const char *mblist[MAXDEEP];
+ char path[MAXPATHLEN+2]; /* '/' terminated */
+
+ char *str;
+ int siz, len;
+ time_t lst;
} BROWINFO;
+/* keep track of last icon visible in each path */
+typedef struct IVIS IVIS;
+ struct IVIS { IVIS *next;
+ char *name;
+ int icon;
+ };
+
static Cursor movecurs, copycurs, delcurs;
static BROWINFO binfo[MAXBRWIN];
static Pixmap bfIcons[BF_MAX], trashPix;
@@ -220,7 +294,7 @@
static void closeBrowse PARM((BROWINFO *));
static int brChkEvent PARM((BROWINFO *, XEvent *));
static void resizeBrowse PARM((BROWINFO *, int, int));
-static void setBrowStr PARM((BROWINFO *, char *));
+static void setBrowStr PARM((BROWINFO *, const char *));
static void doCmd PARM((BROWINFO *, int));
static void drawBrow PARM((BROWINFO *));
static void drawNumfiles PARM((BROWINFO *));
@@ -255,12 +329,12 @@
static void rescanDir PARM((BROWINFO *));
static int namcmp PARM((const void *, const void *));
static void freeBfList PARM((BROWINFO *br));
-static char **getDirEntries PARM((char *, int *, int));
+static char **getDirEntries PARM((const char *, int *, int));
static void computeScrlVals PARM((BROWINFO *, int *, int *));
static void genSelectedIcons PARM((BROWINFO *));
static void genIcon PARM((BROWINFO *, BFIL *));
static void loadThumbFile PARM((BROWINFO *, BFIL *));
-static void writeThumbFile PARM((BROWINFO *, BFIL *, byte *, int,
+static void writeThumbFile PARM((BROWINFO *, BFIL *, byte *, int,
int, char *));
static void makeThumbDir PARM((BROWINFO *));
@@ -278,14 +352,14 @@
static void doSelFilesCmd PARM((BROWINFO *));
static void doRecurseCmd PARM((BROWINFO *));
-static void recurseUpdate PARM((BROWINFO *, char *));
+static void recurseUpdate PARM((BROWINFO *, const char *));
static void rm_file PARM((BROWINFO *, char *));
static void rm_dir PARM((BROWINFO *, char *));
static void rm_dir1 PARM((BROWINFO *));
-static void dragFiles PARM((BROWINFO *, BROWINFO *, char *, char *,
- char *, char **, int, int));
+static void dragFiles PARM((BROWINFO *, BROWINFO *, char *, char *,
+ const char *, char **, int, int));
static int moveFile PARM((char *, char *));
static int copyFile PARM((char *, char *));
static void cp PARM((void));
@@ -294,16 +368,25 @@
static void cp_special PARM((struct stat *, int));
static void cp_fifo PARM((struct stat *, int));
+#ifdef AUTO_EXPAND
+static int stat2bf PARM((u_int, char *));
+#else
static int stat2bf PARM((u_int));
+#endif
static int selmatch PARM((char *, char *));
static int selmatch1 PARM((char *, char *));
+static void recIconVisible PARM((char *, int));
+static void restIconVisible PARM((BROWINFO *));
+
+static void clipChanges PARM((BROWINFO *));
/***************************************************************/
void CreateBrowse(geom, fgstr, bgstr, histr, lostr)
- char *geom, *fgstr, *bgstr, *histr, *lostr;
+ const char *geom;
+ const char *fgstr, *bgstr, *histr, *lostr;
{
int i;
XSizeHints hints;
@@ -369,8 +452,8 @@
if (gset & YNegative) gy1 = gy - i * 20;
else gy1 = gy + i * 20;
- if ((gset & WidthValue) && (gset & HeightValue))
- sprintf(wgeom, "%dx%d%s%d%s%d", gw, gh,
+ if ((gset & WidthValue) && (gset & HeightValue))
+ sprintf(wgeom, "%dx%d%s%d%s%d", gw, gh,
(gset & XNegative) ? "-" : "+", abs(gx1),
(gset & YNegative) ? "-" : "+", abs(gy1));
else
@@ -402,11 +485,11 @@
/* note: everything is sized and positioned in ResizeBrowse() */
- br->iconW = XCreateSimpleWindow(theDisp, br->win, 1,1, 100,100,
+ br->iconW = XCreateSimpleWindow(theDisp, br->win, 1,1, 100,100,
1,browfg,browbg);
if (!br->iconW) FatalError("can't create schnauzer icon window!");
- SCCreate(&(br->scrl), br->win, 0,0, 1,100, 0,0,0,0,
+ SCCreate(&(br->scrl), br->win, 0,0, 1,100, 0,0,0,0,
browfg, browbg, browhi, browlo, drawIconWin);
@@ -448,10 +531,12 @@
"Text view",browfg,browbg,browhi,browlo);
BTCreate(&(br->but[BR_RECURSUP]), br->win, 0,0,BUTTW,BUTTH,
"RecursUpd",browfg,browbg,browhi,browlo);
- BTCreate(&(br->but[BR_QUIT]), br->win, 0,0,BUTTW,BUTTH,
+ BTCreate(&(br->but[BR_QUIT]), br->win, 0,0,BUTTW,BUTTH,
"Quit xv",browfg,browbg,browhi,browlo);
- BTCreate(&(br->but[BR_CLOSE]), br->win, 0,0,BUTTW,BUTTH,
+ BTCreate(&(br->but[BR_CLOSE]), br->win, 0,0,BUTTW,BUTTH,
"Close",browfg,browbg,browhi,browlo);
+ BTCreate(&(br->but[BR_CLIPBRD]), br->win, 0,0,BUTTW,BUTTH,
+ "Clipboard",browfg,browbg,browhi,browlo);
XMapSubwindows(theDisp, br->win);
@@ -486,55 +571,62 @@
bfIcons[BF_SOCK]=MakePix1(br->win,br_sock_bits,br_sock_width,br_sock_height);
bfIcons[BF_FIFO]=MakePix1(br->win,br_fifo_bits,br_fifo_width,br_fifo_height);
- bfIcons[BF_ERROR] = MakePix1(br->win, br_error_bits,
+ bfIcons[BF_ERROR] = MakePix1(br->win, br_error_bits,
br_error_width, br_error_height);
/* bfIcons[BF_UNKNOWN] = MakePix1(br->win, br_unknown_bits,
br_unknown_width, br_unknown_height); */
-
bfIcons[BF_UNKNOWN] = bfIcons[BF_FILE];
- bfIcons[BF_GIF] =MakePix1(br->win,br_gif_bits, br_gif_width, br_gif_height);
- bfIcons[BF_PM] =MakePix1(br->win,br_pm_bits, br_pm_width, br_pm_height);
- bfIcons[BF_PBM] =MakePix1(br->win,br_pbm_bits, br_pbm_width, br_pbm_height);
- bfIcons[BF_XBM] =MakePix1(br->win,br_xbm_bits, br_xbm_width, br_xbm_height);
-
- bfIcons[BF_SUNRAS] = MakePix1(br->win, br_sunras_bits,
- br_sunras_width, br_sunras_height);
- bfIcons[BF_BMP] = MakePix1(br->win,br_bmp_bits,
- br_bmp_width, br_bmp_height);
- bfIcons[BF_UTAHRLE] = MakePix1(br->win, br_utahrle_bits,
- br_utahrle_width, br_utahrle_height);
+ bfIcons[BF_COMPRESS] = MakePix1(br->win, br_cmpres_bits,
+ br_cmpres_width, br_cmpres_height);
+ bfIcons[BF_BZIP2] = MakePix1(br->win, br_bzip2_bits,
+ br_bzip2_width, br_bzip2_height);
+ bfIcons[BF_BMP] =MakePix1(br->win,br_bmp_bits, br_bmp_width, br_bmp_height);
+ bfIcons[BF_FITS]=MakePix1(br->win,br_fits_bits,br_fits_width,br_fits_height);
+ bfIcons[BF_GIF] =MakePix1(br->win,br_gif_bits, br_gif_width, br_gif_height);
+ bfIcons[BF_IFF] =MakePix1(br->win,br_iff_bits, br_iff_width, br_iff_height);
bfIcons[BF_IRIS]=MakePix1(br->win,br_iris_bits,br_iris_width,br_iris_height);
- bfIcons[BF_PCX] =MakePix1(br->win,br_pcx_bits, br_pcx_width, br_pcx_height);
bfIcons[BF_JFIF]=MakePix1(br->win,br_jfif_bits,br_jfif_width,br_jfif_height);
- bfIcons[BF_TIFF]=MakePix1(br->win,br_tiff_bits,br_tiff_width,br_tiff_height);
+ bfIcons[BF_JP2] =MakePix1(br->win,br_jp2_bits, br_jp2_width, br_jp2_height);
+ bfIcons[BF_JPC] =MakePix1(br->win,br_jpc_bits, br_jpc_width, br_jpc_height);
+ bfIcons[BF_MAG] =MakePix1(br->win,br_mag_bits, br_mag_width, br_mag_height);
+ bfIcons[BF_MAKI]=MakePix1(br->win,br_maki_bits,br_maki_width,br_maki_height);
+ bfIcons[BF_PBM] =MakePix1(br->win,br_pbm_bits, br_pbm_width, br_pbm_height);
+ bfIcons[BF_PCD] =MakePix1(br->win,br_pcd_bits, br_pcd_width, br_pcd_height);
+ bfIcons[BF_PCX] =MakePix1(br->win,br_pcx_bits, br_pcx_width, br_pcx_height);
bfIcons[BF_PDS] =MakePix1(br->win,br_pds_bits, br_pds_width, br_pds_height);
-
- bfIcons[BF_COMPRESS]= MakePix1(br->win, br_cmpres_bits,
- br_cmpres_width, br_cmpres_height);
-
+ bfIcons[BF_PIC2]=MakePix1(br->win,br_pic2_bits,br_pic2_width,br_pic2_height);
+ bfIcons[BF_PIC] =MakePix1(br->win,br_pic_bits, br_pic_width, br_pic_height);
+ bfIcons[BF_PI] =MakePix1(br->win,br_pi_bits, br_pi_width, br_pi_height);
+ bfIcons[BF_PM] =MakePix1(br->win,br_pm_bits, br_pm_width, br_pm_height);
+ bfIcons[BF_PNG] =MakePix1(br->win,br_png_bits, br_png_width, br_png_height);
bfIcons[BF_PS] =MakePix1(br->win,br_ps_bits, br_ps_width, br_ps_height);
- bfIcons[BF_IFF] =MakePix1(br->win,br_iff_bits, br_iff_width, br_iff_height);
-
- bfIcons[BF_TARGA] = MakePix1(br->win, br_targa_bits,
- br_targa_width, br_targa_height);
-
+ bfIcons[BF_TGA] =MakePix1(br->win,br_tga_bits, br_tga_width, br_tga_height);
+ bfIcons[BF_TIFF]=MakePix1(br->win,br_tiff_bits,br_tiff_width,br_tiff_height);
+ bfIcons[BF_XBM] =MakePix1(br->win,br_xbm_bits, br_xbm_width, br_xbm_height);
bfIcons[BF_XPM] =MakePix1(br->win,br_xpm_bits, br_xpm_width, br_xpm_height);
bfIcons[BF_XWD] =MakePix1(br->win,br_xwd_bits, br_xwd_width, br_xwd_height);
- bfIcons[BF_FITS]=MakePix1(br->win,br_fits_bits,br_fits_width,br_fits_height);
+ bfIcons[BF_ZX] =MakePix1(br->win,br_zx_bits, br_zx_width, br_zx_height);
+
+ bfIcons[BF_SUNRAS] = MakePix1(br->win, br_sunras_bits,
+ br_sunras_width, br_sunras_height);
+ bfIcons[BF_UTAHRLE] = MakePix1(br->win, br_utahrle_bits,
+ br_utahrle_width, br_utahrle_height);
+ bfIcons[BF_MGCSFX] = MakePix1(br->win, br_mgcsfx_bits,
+ br_mgcsfx_width, br_mgcsfx_height);
/* check that they all got built */
for (i=0; ivis) break;
}
if (i==MAXBRWIN) return; /* full up: shouldn't happen */
-
+
anyBrowUp = 1;
XMapRaised(theDisp, br->win);
br->vis = 1;
-
+
freeBfList(br);
/* see if some browser is pointing to the same path as CWD. If so,
@@ -645,7 +738,7 @@
/* free all info for this browse window */
freeBfList(br);
sprintf(br->path, BOGUSPATH);
-
+
/* turn on 'open new window' command doodads */
windowMB.dim[WMB_BROWSE] = 0;
for (i=0; itype == Expose) {
int x,y,w,h;
XExposeEvent *e = (XExposeEvent *) xev;
x = e->x; y = e->y; w = e->width; h = e->height;
/* throw away excess redraws for 'dumb' windows */
- if (e->count > 0 && (e->window == br->scrl.win)) {}
+ if (e->count > 0 && (e->window == br->scrl.win))
+ ;
- else if (e->window == br->scrl.win) SCRedraw(&(br->scrl));
+ else if (e->window == br->scrl.win)
+ SCRedraw(&(br->scrl));
else if (e->window == br->win || e->window == br->iconW) { /* smart wins */
/* group individual expose rects into a single expose region */
@@ -788,7 +897,7 @@
fprintf(stderr,"grouped %d expose events into %d,%d %dx%d rect\n",
count, rect.x, rect.y, rect.width, rect.height);
}
-
+
if (e->window == br->win) drawBrow(br);
else if (e->window == br->iconW)
@@ -807,13 +916,55 @@
int i,x,y;
x = e->x; y = e->y;
+#ifdef VS_RESCMAP
+ if (browCmap && browPerfect && (_IfTempOut!=0)) {
+ XSetWindowAttributes xswa;
+ _IfTempOut--;
+ xswa.colormap = browCmap;
+ for(i=0;ibutton == Button1) {
if (e->window == br->win) clickBrow(br,x,y);
else if (e->window == br->scrl.win) SCTrack(&(br->scrl),x,y);
else if (e->window == br->iconW) {
- i = clickIconWin(br, x,y,(unsigned long) e->time,
+ i = clickIconWin(br, x,y,(unsigned long) e->time,
(e->state&ControlMask) || (e->state&ShiftMask));
-
+ }
+ else rv = 0;
+ }
+ else if (e->button == Button4) { /* note min vs. max, + vs. - */
+ /* scroll regardless of where we are in the browser window */
+ if (e->window == br->win ||
+ e->window == br->scrl.win ||
+ e->window == br->iconW)
+ {
+ SCRL *sp=&(br->scrl);
+ int halfpage=MAX(1,sp->page/2); /* user resize to 1 line? */
+
+ if (sp->val > sp->min+halfpage)
+ SCSetVal(sp,sp->val-halfpage);
+ else
+ SCSetVal(sp,sp->min);
+ }
+ else rv = 0;
+ }
+ else if (e->button == Button5) { /* note max vs. min, - vs. + */
+ /* scroll regardless of where we are in the browser window */
+ if (e->window == br->win ||
+ e->window == br->scrl.win ||
+ e->window == br->iconW)
+ {
+ SCRL *sp=&(br->scrl);
+ int halfpage=MAX(1,sp->page/2); /* user resize to 1 line? */
+
+ if (sp->val < sp->max-halfpage)
+ SCSetVal(sp,sp->val+halfpage);
+ else
+ SCSetVal(sp,sp->max);
}
else rv = 0;
}
@@ -837,7 +988,7 @@
if (br->wide != e->width || br->high != e->height) {
if (DEBUG) fprintf(stderr,"Forcing a redraw! (from configure)\n");
- XClearArea(theDisp, br->win, 0, 0,
+ XClearArea(theDisp, br->win, 0, 0,
(u_int) e->width, (u_int) e->height, True);
resizeBrowse(br, e->width, e->height);
}
@@ -877,7 +1028,7 @@
int w,h;
{
XSizeHints hints;
- int i, minv, maxv, curv, page, maxh;
+ int i, maxv, page, maxh;
if (br->wide == w && br->high == h) return; /* no change in size */
@@ -895,7 +1046,7 @@
br->iwHigh = (maxh / ISPACE_HIGH) * ISPACE_HIGH;
if (br->iwHigh < ISPACE_HIGH) br->iwHigh = ISPACE_HIGH;
- XMoveResizeWindow(theDisp, br->iconW, LRMARGINS, TOPMARGIN,
+ XMoveResizeWindow(theDisp, br->iconW, LRMARGINS, TOPMARGIN,
(u_int) br->iwWide, (u_int) br->iwHigh);
@@ -907,11 +1058,11 @@
for (i=0; inumbutshown)
+ if (inumbutshown)
br->but[i].x = br->wide - (1+br->numbutshown-i) * (BUTTW+5);
else if (i==BR_CLOSE)
br->but[i].x = br->wide - (BUTTW+5);
- else
+ else
br->but[i].x = br->wide + 10; /* offscreen */
br->but[i].y = br->high - BUTTH - 5;
@@ -928,11 +1079,11 @@
br->numWide = br->iwWide / ISPACE_WIDE;
br->visHigh = br->iwHigh / ISPACE_HIGH;
- /* compute minv,maxv,curv,page values based on new current size */
+ /* compute maxv,page values based on new current size */
computeScrlVals(br, &maxv, &page);
if (br->scrl.val>maxv) br->scrl.val = maxv;
-
- SCChange(&br->scrl, LRMARGINS+br->iwWide+1, TOPMARGIN,
+
+ SCChange(&br->scrl, LRMARGINS+br->iwWide+1, TOPMARGIN,
1, br->iwHigh, 0, maxv, br->scrl.val, page);
}
@@ -940,12 +1091,12 @@
/***************************************************************/
void SetBrowStr(str)
- char *str;
+ const char *str;
{
/* put string in *all* browse windows */
int i;
- for (i=0; idispstr, str, (size_t) 256);
+ br->dispstr[255] = '\0';
drawBrowStr(br);
XFlush(theDisp);
}
@@ -992,7 +1144,7 @@
char tmp[64];
- sprintf(tmp, "Re-coloring icons: processed %d out of %d...",
+ sprintf(tmp, "Re-coloring icons: processed %d out of %d...",
i+1, br->bfLen);
setBrowStr(br, tmp);
}
@@ -1011,14 +1163,14 @@
{
/* called when file 'name' has been deleted. If any of the browsers
were showing the directory that the file was in, does a rescan() */
-
+
int i;
char buf[MAXPATHLEN + 2], *tmp;
strcpy(buf, name);
- tmp = BaseName(buf);
+ tmp = (char *) BaseName(buf); /* intentionally losing constness */
*tmp = '\0'; /* truncate after last '/' */
-
+
for (i=0; ilst = 0;
+
switch (cmd) {
case BR_CHDIR: doChdirCmd(br);
break;
@@ -1070,9 +1224,9 @@
case BR_GENICON: genSelectedIcons(br); break;
case BR_SELALL: {
- int i; char buf[128];
+ int i;
- for (i=0; ibfLen; i++)
+ for (i=0; ibfLen; i++)
br->bfList[i].lit = 1;
br->numlit = br->bfLen;
@@ -1087,20 +1241,25 @@
break;
case BR_TEXTVIEW: doTextCmd(br); break;
-
+
case BR_QUIT: Quit(0); break;
case BR_CLOSE: closeBrowse(br); break;
case BR_HIDDEN: br->showhidden = !br->showhidden;
- br->cmdMB.list[cmd] = (br->showhidden)
- ? hideHstr : showHstr;
+ br->cmdMB.list[cmd] = br->showhidden ? hideHstr : showHstr;
rescanDir(br);
break;
case BR_SELFILES: doSelFilesCmd(br); break;
case BR_RECURSUP: doRecurseCmd(br); break;
+
+ case BR_CLIPBRD: clipChanges(br); break;
+
+#ifdef AUTO_EXPAND
+ case BR_CLEARVD: Vdsettle(); break;
+#endif
}
}
@@ -1137,16 +1296,16 @@
if (br->bfLen != 1) sprintf(foo, "%d files", br->bfLen);
else strcpy(foo, "1 file");
-
+
XSetForeground(theDisp, theGC, browbg);
- XFillRectangle(theDisp,br->win, theGC, x+1,y+1,
+ XFillRectangle(theDisp,br->win, theGC, x+1,y+1,
(u_int) StringWidth(foo)+6, (u_int) br->dirMB.h-1);
XSetForeground(theDisp,theGC,browfg);
XDrawRectangle(theDisp,br->win, theGC, x,y,
(u_int) StringWidth(foo)+7, (u_int) br->dirMB.h);
- Draw3dRect(br->win, x+1, y+1, (u_int) StringWidth(foo)+5,
+ Draw3dRect(br->win, x+1, y+1, (u_int) StringWidth(foo)+5,
(u_int) br->dirMB.h-2, R3D_IN, 2, browhi, browlo, browbg);
XSetForeground(theDisp,theGC,browfg);
@@ -1163,7 +1322,7 @@
if (nf != 1) sprintf(foo,"%d files",nf);
else strcpy(foo,"1 file");
-
+
XClearArea(theDisp,br->win, 30, br->dirMB.y,
(u_int) StringWidth(foo)+8, (u_int) br->dirMB.h+1, False);
}
@@ -1185,13 +1344,13 @@
XSetForeground(theDisp,theGC,browfg);
XDrawRectangle(theDisp,br->win, theGC, x,y, (u_int) w, (u_int) h);
- Draw3dRect(br->win, x+1, y+1, (u_int) w-2, (u_int) h-2,
+ Draw3dRect(br->win, x+1, y+1, (u_int) w-2, (u_int) h-2,
R3D_IN, 2, browhi, browlo, browbg);
XSetForeground(theDisp,theGC,browfg);
XSetBackground(theDisp,theGC,browbg);
- XCopyPlane(theDisp, trashPix, br->win, theGC,
- 0,0,(u_int) br_trash_width, (u_int) br_trash_height,
+ XCopyPlane(theDisp, trashPix, br->win, theGC,
+ 0,0,(u_int) br_trash_width, (u_int) br_trash_height,
x+(w-br_trash_width)/2, y+(h-br_trash_height)/2,
1L);
}
@@ -1222,7 +1381,7 @@
y = br->high - (BUTTH+10) - (CHIGH + 6);
XSetForeground(theDisp, theGC, browbg);
- XFillRectangle(theDisp, br->win, theGC, 0, y+3,
+ XFillRectangle(theDisp, br->win, theGC, 0, y+3,
(u_int) br->wide, (u_int) CHIGH+1);
XSetForeground(theDisp, theGC, browfg);
@@ -1250,6 +1409,19 @@
int i, allowtext;
if (!nostr) setSelInfoStr(br, sel);
+#ifdef AUTO_EXPAND
+ if (Isvdir(br->path)) {
+ BTSetActive(&br->but[BR_DELETE], 0);
+ br->cmdMB.dim[BR_DELETE] = 1;
+
+ BTSetActive(&br->but[BR_RENAME], 0);
+ br->cmdMB.dim[BR_RENAME] = 1;
+
+ BTSetActive(&br->but[BR_MKDIR], 0);
+ br->cmdMB.dim[BR_MKDIR] = 1;
+ }
+ else {
+#endif
BTSetActive(&br->but[BR_DELETE], br->numlit>0);
br->cmdMB.dim[BR_DELETE] = !(br->numlit>0);
@@ -1258,6 +1430,11 @@
BTSetActive(&br->but[BR_GENICON], br->numlit>0);
br->cmdMB.dim[BR_GENICON] = !(br->numlit>0);
+#ifdef AUTO_EXPAND
+ BTSetActive(&br->but[BR_MKDIR], 1);
+ br->cmdMB.dim[BR_MKDIR] = 0;
+ }
+#endif
/* turn on 'text view' cmd if exactly one non-dir is lit */
allowtext = 0;
@@ -1277,7 +1454,7 @@
{
/* sets the '# files selected' string in the brow window appropriately */
- /* criteria:
+ /* criteria:
* if no files are lit, display ''
* if 1 file is lit, pretend it was selected, fall through...
* if 1 or more files are lit
@@ -1316,10 +1493,13 @@
else if (bf->ftype != BF_DIR) { /* no info. display file size */
struct stat st;
-
+
sprintf(buf, "%s%s", br->path, bf->name); /* build filename */
+#ifdef AUTO_EXPAND
+ Dirtovd(buf);
+#endif
if (stat(buf, &st) == 0) {
- sprintf(buf, "%s: %ld bytes", bf->name, st.st_size);
+ sprintf(buf, "%s: %ld bytes", bf->name, (long)st.st_size);
strcat(buf, buf1);
}
}
@@ -1360,8 +1540,8 @@
if (j>=0 && j < br->bfLen) drawIcon(br,j);
}
}
-
- Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1,
+
+ Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1,
R3D_IN, 2, browhi, browlo, browbg);
}
@@ -1371,10 +1551,8 @@
int delta;
SCRL *sptr;
{
- int i,indx, x,y, ix,iy, num;
- BFIL *bf;
+ int i,indx, num;
BROWINFO *br;
- char tmpstr[64], *nstr;
/* figure out BROWINFO pointer from SCRL pointer */
for (i=0; i br->iwHigh-4) h = (br->iwHigh-4)-y + 2;
}
XFillRectangle(theDisp, br->iconW, theGC, x, y, ISPACE_WIDE, (u_int) h);
-
+
if (indx>=0 && indx < br->bfLen) drawIcon(br, indx);
}
}
- Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1,
+ Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1,
R3D_IN, 2, browhi, browlo, browbg);
}
@@ -1431,7 +1609,11 @@
{
int i,x,y,ix,iy,sw,sh,sx,sy;
BFIL *bf;
- char tmpstr[64], fixedname[64], *nstr, *str;
+ const char *nstr, *cstr;
+ char tmpstr[64];
+#ifdef VMS
+ char fixedname[64];
+#endif
if (num<0 || num >= br->bfLen) return;
@@ -1463,49 +1645,51 @@
}
else if (bf->ftype == BF_HAVEIMG && bf->ximage) {
- XPutImage(theDisp, br->iconW, theGC, bf->ximage, 0,0, ix,iy,
+ XPutImage(theDisp, br->iconW, theGC, bf->ximage, 0,0, ix,iy,
(u_int) bf->w, (u_int) bf->h);
}
else { /* shouldn't happen */
- XDrawRectangle(theDisp, br->iconW, theGC, ix, iy,
+ XDrawRectangle(theDisp, br->iconW, theGC, ix, iy,
(u_int) bf->w, (u_int) bf->h);
}
- str = bf->name;
+ cstr = bf->name;
#ifdef VMS
if (bf->ftype == BF_DIR) {
+ char *vstr;
strcpy(fixedname, bf->name);
- str = rindex(fixedname, '.'); /* lop off '.DIR' suffix, if any */
- if (str) *str = '\0';
- str = fixedname;
+ vstr = rindex(fixedname, '.'); /* lop off '.DIR' suffix, if any */
+ if (vstr) *vstr = '\0';
+ cstr = fixedname;
}
#endif /* VMS */
- if (!strcmp(bf->name,"..")) str = "";
+ if (!strcmp(bf->name,"..")) cstr = "";
/* decide if the title is too big, and shorten if neccesary */
- if (StringWidth(str) > ISPACE_WIDE-6) {
- int dotpos;
- strncpy(tmpstr, str, (size_t) 56);
+ if (StringWidth(cstr) > ISPACE_WIDE-6) {
+ int dotpos;
+ strncpy(tmpstr, cstr, (size_t) 56);
+ tmpstr[56] = '\0'; /* MR: otherwise it dies on long file names */
dotpos = strlen(tmpstr);
strcat(tmpstr,"...");
while(StringWidth(tmpstr) > ISPACE_WIDE-6 && dotpos>0) {
/* change last non-dot char in tmpstr to a dot, and lop off
last dot */
-
+
dotpos--;
tmpstr[dotpos] = '.';
tmpstr[dotpos+3] = '\0';
}
-
+
nstr = tmpstr;
}
- else nstr = str;
-
+ else nstr = cstr;
+
/* draw the title */
sw = StringWidth(nstr);
@@ -1516,12 +1700,12 @@
XSetForeground(theDisp, theGC,
(bf->lit && bf->lit!=ICON_ONLY) ? browfg : browbg);
- XFillRectangle(theDisp, br->iconW, theGC, sx, sy,
+ XFillRectangle(theDisp, br->iconW, theGC, sx, sy,
(u_int) sw + 4, (u_int) sh + 2);
XSetForeground(theDisp, theGC,
(bf->lit && bf->lit!=ICON_ONLY) ? browbg : browfg);
- CenterString(br->iconW, x + ISPACE_WIDE/2,
+ CenterString(br->iconW, x + ISPACE_WIDE/2,
y + ISPACE_TOP + ISIZE_HIGH + ISPACE_TTOP + CHIGH/2, nstr);
}
@@ -1535,7 +1719,6 @@
int i,x,y,ix,iy,w,h;
BFIL *bf;
- char tmpstr[64], *nstr;
if (num<0 || num >= br->bfLen) return;
bf = &(br->bfList[num]);
@@ -1579,12 +1762,12 @@
y = (i / br->numWide) * ISPACE_HIGH;
XSetForeground(theDisp, theGC, browbg);
- XFillRectangle(theDisp, br->iconW, theGC,
+ XFillRectangle(theDisp, br->iconW, theGC,
x, y + ISPACE_TOP + ISIZE_HIGH + ISPACE_TTOP - 1,
(u_int) ISPACE_WIDE, (u_int) LINEHIGH);
- if (ctrlColor)
- Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1,
+ if (ctrlColor)
+ Draw3dRect(br->iconW, 0, 0, (u_int) br->iwWide-1, (u_int) br->iwHigh-1,
R3D_IN, 2, browhi, browlo, browbg);
}
@@ -1597,6 +1780,10 @@
{
int sval, first, numvis;
+ /* if we know what path we have, remember last visible icon for this path */
+ if (br->path)
+ recIconVisible(br->path, num);
+
/* if icon #i isn't visible, adjust scrollbar so it *is* */
sval = br->scrl.val;
@@ -1648,29 +1835,14 @@
return;
}
-
/***************************************************************/
-static int clickIconWin(br, mx, my, mtime, multi)
- BROWINFO *br;
- int mx,my,multi;
- unsigned long mtime;
+static int updateSel(br, sel, multi, mtime)
+ BROWINFO *br;
+ int sel, multi;
+ unsigned long mtime;
{
- /* returns '-1' normally, returns an index into bfList[] if the user
- double-clicks an icon */
-
- int i,j, base, num, x,y,ix,iy, rv, sel, cpymode, dodel;
- BROWINFO *destBr;
- BFIL *bf;
- char buf[256], *destFolderName;
-
- rv = -1; /* default return value */
- if (!br->bfList || !br->bfLen) return rv;
-
- destBr = br; destFolderName = ".";
-
- sel = mouseInWhichIcon(br, mx, my);
-
- dodel = 0;
+ int i;
+ BFIL *bf;
if (sel == -1) { /* clicked on nothing */
if (!multi) { /* deselect all */
@@ -1681,7 +1853,7 @@
}
changedNumLit(br, sel, 0);
- br->lastIconClicked = -1;
+ br->lastIconClicked = -1;
}
@@ -1725,14 +1897,14 @@
changedNumLit(br, sel, 0);
-
+
/* see if we've double-clicked something */
- if (sel==br->lastIconClicked && mtime-br->lastClickTime < DBLCLICKTIME) {
- int k;
+ if (mtime &&
+ sel==br->lastIconClicked && mtime-br->lastClickTime < DBLCLICKTIME) {
br->lastIconClicked = -1; /* YES */
doubleClick(br, sel);
- return rv;
+ return -1;
}
else {
@@ -1741,9 +1913,37 @@
}
}
-
changedNumLit(br, -1, 0);
+ return 0;
+}
+
+
+/***************************************************************/
+static int clickIconWin(br, mx, my, mtime, multi)
+ BROWINFO *br;
+ int mx,my,multi;
+ unsigned long mtime;
+{
+ /* returns '-1' normally, returns an index into bfList[] if the user
+ double-clicks an icon */
+
+ int i,j, sel, cpymode, dodel;
+ BROWINFO *destBr;
+ BFIL *bf;
+ char buf[256];
+ const char *destFolderName;
+
+ if (!br->bfList || !br->bfLen) return -1;
+
+ destBr = br; destFolderName = ".";
+ sel = mouseInWhichIcon(br, mx, my);
+ dodel = 0;
+
+ recIconVisible(br->path, sel);
+
+ if (updateSel(br, sel, multi, mtime))
+ return -1;
{ /* track mouse until button1 is released */
@@ -1759,10 +1959,10 @@
first = 1; hasrect = 0; cpymode = 0;
origsval = br->scrl.val;
- if ( (sel>=0 && !multi) || sel==-1) {
+ if ( (sel>=0 && !multi) || sel==-1) {
/* clicked on an icon, or clicked on nothing... */
- while (!XQueryPointer(theDisp, rootW, &rW, &cW, &rootx, &rooty,
+ while (!XQueryPointer(theDisp, rootW, &rW, &cW, &rootx, &rooty,
&x,&y,&mask));
if (mask & Button1Mask) { /* still held down */
@@ -1773,7 +1973,7 @@
else curs = movecurs;
/* change cursors */
- for (i=0; i=0) { /* see if changed copy/move status (and cursor) */
int cmod;
-
+
cmod = (mask&ControlMask || mask&ShiftMask) ? 1 : 0;
if (cmod != cpymode && !dodel) {
curs = (cmod) ? copycurs : movecurs;
- for (i=0; iiconW, rootx,rooty,
+ XTranslateCoordinates(theDisp, rW, br->iconW, rootx,rooty,
&iwx,&iwy, &cW);
/* find deepest child that the mouse is in */
@@ -1837,12 +2037,12 @@
/* if it's in any icon window, and we're doing icon-dragging
OR we're doing a rectangle-drag */
- if (i=0 && (oldx!=x || oldy!=y || oldbrnum!=i)) { /* moved */
@@ -1873,7 +2073,7 @@
}
}
-
+
/* if we clicked on an icon (originally), and therefore are
showing the 'move files' cursor, see if the cursor is within
the icon region of any folders. If so, light up *the icon
@@ -1904,9 +2104,9 @@
/* Dragging a selection rectangle. */
- else {
+ else {
static int prevx, prevy, prevcnt;
- int origy, top, left, wide, high, cnt;
+ int origy, cnt;
if (first) { prevx = mx; prevy = my; first=0; prevcnt = -1; }
@@ -1922,18 +2122,18 @@
rx = (mx < x) ? mx : x;
ry = (origy < y) ? origy : y;
- rw = abs(mx - x);
+ rw = abs(mx - x);
rh = abs(origy - y);
/* figure out which icons need to be lit/unlit. Only
redraw those that have changed state */
-
+
for (i=0,cnt=0, bf=br->bfList; ibfLen; i++,bf++) {
- int ix, iy, isin, light;
+ int ix, iy, isin;
- ix = ((i%br->numWide) * ISPACE_WIDE)
+ ix = ((i%br->numWide) * ISPACE_WIDE)
+ ISPACE_WIDE/2 - bf->w/2;
- iy = ((i/br->numWide) * ISPACE_HIGH)
+ iy = ((i/br->numWide) * ISPACE_HIGH)
+ ISPACE_TOP + ISIZE_HIGH - bf->h;
iy = iy - br->scrl.val * ISPACE_HIGH;
@@ -1994,7 +2194,7 @@
}
/* RELEASED BUTTON: back to normal arrow cursor */
- for (i=0; ilit == TEMP_LIT || bf->lit == TEMP_LIT1) {
bf->lit = 1; drawIcon(br, i);
}
-
+
if (bf->lit) br->numlit++;
}
@@ -2020,7 +2220,6 @@
/* if doing a copy or a move, do the thing to the files */
if (sel >= 0) {
- char *destFolder;
if (DEBUG) {
fprintf(stderr,"---------------\n");
@@ -2029,7 +2228,7 @@
fprintf(stderr,"Dest Folder: '%s'\n", destFolderName);
}
-
+
if (!br->numlit) {
if (DEBUG) fprintf(stderr, "no selected files. Nothing to do!\n");
}
@@ -2042,7 +2241,7 @@
if (DEBUG) fprintf(stderr, "no destination. Nothing to do!\n");
}
- else if (strcmp(destFolderName,".") == 0 &&
+ else if (strcmp(destFolderName,".") == 0 &&
strcmp(br->path, destBr->path) == 0) {
if (DEBUG) fprintf(stderr,"source == destination. Nothing to do!\n");
}
@@ -2067,20 +2266,20 @@
}
}
if (DEBUG) fprintf(stderr,"\n\n");
-
+
#ifdef VMS
/*
- * For VMS, our directory file names are identifed by the
- * special filename extension, ".DIR". Unfortunately, this
- * needs to be stripped before we ever actually use the name
+ * For VMS, our directory file names are identifed by the
+ * special filename extension, ".DIR". Unfortunately, this
+ * needs to be stripped before we ever actually use the name
* in a copy command... :( RLD 26-FEB-1993
*/
- *rindex ( destFolderName, '.' ) = '\0';
+ *rindex ( destFolderName, '.' ) = '\0'; /* FIXME: potentially writing into static strings! */
#endif
- dragFiles(br, destBr, br->path, destBr->path, destFolderName, nlist,
+ dragFiles(br, destBr, br->path, destBr->path, destFolderName, nlist,
ncnt, cpymode);
/* free namelist */
@@ -2099,7 +2298,7 @@
}
} /* end of 'tracking' sub-function */
- return rv;
+ return -1;
}
/*******************************************/
@@ -2113,6 +2312,8 @@
/* called to 'open' icon #sel, which could be a file or a dir */
+ br->lst = 0;
+
/* if sel == -1, then called via RETURN key. just use first lit item
as thing that was double clicked on */
@@ -2155,7 +2356,7 @@
}
-
+
/* double-clicked something. We should do something about it */
if (br->bfList[sel].ftype == BF_DIR) { /* try to cd */
#ifndef VMS
@@ -2165,15 +2366,36 @@
else sprintf(buf, "%s%s", br->path, br->bfList[sel].name);
#endif
+#ifdef AUTO_EXPAND
+ if (Chvdir(buf)) {
+#else
if (chdir(buf)) {
+#endif
char str[512];
sprintf(str,"Unable to cd to '%s'\n", br->bfList[sel].name);
setBrowStr(br, str);
XBell(theDisp, 50);
}
else {
+#ifdef AUTO_EXPAND
+ if (Isvdir(buf)) {
+ BTSetActive(&br->but[BR_DELETE], 0);
+ br->cmdMB.dim[BR_DELETE] = 1;
+
+ BTSetActive(&br->but[BR_RENAME], 0);
+ br->cmdMB.dim[BR_RENAME] = 1;
+
+ BTSetActive(&br->but[BR_MKDIR], 0);
+ br->cmdMB.dim[BR_MKDIR] = 1;
+ }
+ else {
+ BTSetActive(&br->but[BR_MKDIR], 1);
+ br->cmdMB.dim[BR_MKDIR] = 0;
+ }
+#endif
scanDir(br);
SCSetVal(&(br->scrl), 0); /* reset to top on a chdir */
+ restIconVisible(br);
}
}
@@ -2193,7 +2415,26 @@
*event_retP = THISNEXT;
}
else { *event_retP = LOADPIC; SetDirFName(buf); }
-
+
+#ifdef VS_RESCMAP
+ /* Change Colormap for browser */
+ if (browPerfect && browCmap) {
+ int i;
+ XSetWindowAttributes xswa;
+ if(LocalCmap) {
+ xswa.colormap = LocalCmap;
+ _IfTempOut=2;
+ }
+ else {
+ xswa.colormap = theCmap;
+ _IfTempOut=2;
+ }
+ for(i=0;istate & ShiftMask;
ck = CursorKey(ks, shift, 1);
- dealt = 1;
+ dealt = 1;
RemapKeyCheck(ks, buf, &stlen);
@@ -2289,6 +2530,7 @@
case '\021': doCmd(br, BR_QUIT); break; /* ^Q = Quit xv */
case '\006': doCmd(br, BR_SELFILES); break; /* ^F = Select Files */
+ case '\030': doCmd(br, BR_CLIPBRD); break; /* ^X = Copy to clipboard */
/* case '\003': FakeButtonPress(&but[BCMTVIEW]); break; */ /* ^C */
@@ -2299,6 +2541,9 @@
case '\n': doubleClick(br, -1); break; /* RETURN = load selected */
case ' ':
+ if (br->lst && (time(NULL) <= br->lst + incrementalSearchTimeout))
+ goto do_default;
+ /* else fall through... */
case '\010':
case '\177': /* SPACE = load next, BS/DEL = load prev */
if (br->bfLen && br->numlit >= 1) {
@@ -2306,7 +2551,7 @@
char fname[MAXPATHLEN];
/* if 'shift-space' find last lit icon, select the next one after it,
- and load it. If 'space' do the same, but lose prior lit. These
+ and load it. If 'space' do the same, but lose prior lit. These
are the only cases where br->numlit >1 allowed */
if (br->numlit>1 && buf[0] != ' ') return;
@@ -2314,7 +2559,7 @@
if (buf[0]==' ' && (br->numlit>1 || (br->numlit==1 && shift))) {
for (i=br->bfLen-1; i>=0 && !br->bfList[i].lit; i--); /* i=last lit */
if (i==br->bfLen-1) return;
-
+
i++;
if (!shift) {
for (j=0; jbfLen; j++) {
@@ -2348,6 +2593,9 @@
/* try to open this file */
sprintf(foo, "%s%s", br->path, br->bfList[i].name);
+#ifdef AUTO_EXPAND
+ Dirtovd(foo);
+#endif
for (j=0; jbfLen && !br->bfList[i].lit; i++); /* find lit one */
sprintf(fname, "%s%s", br->path, br->bfList[i].name);
+#ifdef AUTO_EXPAND
+ Dirtovd(fname);
+#endif
viewsel = !(strcmp(fname, fullfname));
-
+
if (viewsel) {
if (buf[0]==' ') browKey(br, CK_RIGHT);
else browKey(br, CK_LEFT);
@@ -2372,7 +2623,7 @@
if (!br->bfList[i].lit || !viewsel) { /* changed selection */
for (i=0; ibfLen && !br->bfList[i].lit; i++); /* find it */
- if (br->bfList[i].ftype != BF_DIR)
+ if (br->bfList[i].ftype != BF_DIR)
doubleClick(br, -1);
}
}
@@ -2381,7 +2632,8 @@
default: /* unknown character. Take it as an alpha accelerator */
- if (buf[0] > 32) browAlpha(br, buf[0]);
+ do_default: /* (goto-label, not switch-label) */
+ if (buf[0] >= 32) browAlpha(br, buf[0]);
else XBell(theDisp, 0);
break;
}
@@ -2401,6 +2653,8 @@
/* an arrow key (or something like that) was pressed in icon window.
change selection/scrollbar accordingly */
+ br->lst = 0;
+
/* handle easy keys */
if (key == CK_PAGEUP) SCSetVal(&br->scrl, br->scrl.val - br->scrl.page);
if (key == CK_PAGEDOWN) SCSetVal(&br->scrl, br->scrl.val + br->scrl.page);
@@ -2410,10 +2664,10 @@
/* handle up/down/left/right keys
*
* if precisely *one* item is lit, than the up/down/left/right keys move
- * the selection.
+ * the selection.
*
* if NO items are lit, then left/right select the first/last fully-displayed
- * icon, and up/down simply scroll window up or down, without selecting
+ * icon, and up/down simply scroll window up or down, without selecting
* anything
*
* if more than one item is lit, up/down/left/right keys BEEP
@@ -2443,8 +2697,8 @@
if (key == CK_DOWN) j = i + br->numWide;
if (key == CK_LEFT) j = i - 1;
if (key == CK_RIGHT) j = i + 1;
-
- if (j >= 0 && j < br->bfLen) {
+
+ if (j >= 0 && j < br->bfLen) {
br->bfList[i].lit = 0;
br->bfList[j].lit = 1;
makeIconVisible(br,j);
@@ -2455,7 +2709,7 @@
}
}
-
+
if (br->numlit == 0) { /* no current selection */
if (key == CK_UP) SCSetVal(&br->scrl, br->scrl.val - 1);
if (key == CK_DOWN) SCSetVal(&br->scrl, br->scrl.val + 1);
@@ -2482,15 +2736,28 @@
/* find first 'plain' file that is lexically >= than the given ch */
int i,j;
+ time_t now = time(NULL);
if (!br->bfLen) return;
- if (ch <= ' ' || ch > '\177') return; /* ignore 'funny' keys */
+ if (ch < ' ' || ch > '\177') return; /* ignore 'funny' keys */
for (i=0; ibfLen && br->bfList[i].ftype==BF_DIR; i++);
if (i==br->bfLen) return; /* only directories in this dir */
+ if (!br->lst || (br->lst + incrementalSearchTimeout < now)) br->len = 0;
+ br->lst = now;
+
+ if (br->len + 2 > br->siz)
+ if ((br->str = (char *)realloc(br->str, (br->siz = br->len + 32))) == NULL)
+ br->siz = br->len = 0;
+
+ if (br->len + 2 <= br->siz) {
+ br->str[br->len++] = ch;
+ br->str[br->len] = '\0';
+ }
+
for ( ; ibfLen; i++) {
- if (br->bfList[i].name[0] >= ch) break;
+ if (strncmp(br->bfList[i].name, br->str, br->len) >= 0) break;
}
if (i==br->bfLen) i--;
@@ -2541,20 +2808,24 @@
* The VMS chdir always needs 2 components (device and directory),
* so convert "/device" to "/device/000000" and convert
* "/" to "/XV_Root_Device/000000" (XV_RootDevice will need to be
- * a special concealed device setup to provide list of available
+ * a special concealed device setup to provide list of available
* disks).
*
* End 'tmppath' by changing trailing '/' (of dir name) to a '\0'
*/
*rindex ( tmppath, '/') = '\0';
- if ( ((br->ndirs-sel) == 2) && (strlen(tmppath) > 1) )
+ if ( ((br->ndirs-sel) == 2) && (strlen(tmppath) > 1) )
strcat ( tmppath, "/000000" ); /* add root dir for device */
else if ((br->ndirs-sel) == 1 )
strcpy ( tmppath, "/XV_Root_Device/000000" ); /* fake top level */
}
#endif
+#ifdef AUTO_EXPAND
+ if (Chvdir(tmppath)) {
+#else
if (chdir(tmppath)) {
+#endif
char str[512];
sprintf(str,"Unable to cd to '%s'\n", tmppath);
MBRedraw(&(br->dirMB));
@@ -2562,8 +2833,25 @@
XBell(theDisp, 50);
}
else {
+#ifdef AUTO_EXPAND
+ if (Isvdir(tmppath)) {
+ BTSetActive(&br->but[BR_DELETE], 0);
+ br->cmdMB.dim[BR_DELETE] = 1;
+
+ BTSetActive(&br->but[BR_RENAME], 0);
+ br->cmdMB.dim[BR_RENAME] = 1;
+
+ BTSetActive(&br->but[BR_MKDIR], 0);
+ br->cmdMB.dim[BR_MKDIR] = 1;
+ }
+ else {
+ BTSetActive(&br->but[BR_MKDIR], 1);
+ br->cmdMB.dim[BR_MKDIR] = 0;
+ }
+#endif
scanDir(br);
SCSetVal(&br->scrl, 0); /* reset to top of window on a chdir */
+ restIconVisible(br);
}
}
}
@@ -2582,7 +2870,11 @@
if ((strlen(br->path) > (size_t) 2) && br->path[strlen(br->path)-1] == '/')
br->path[strlen(br->path)-1] = '\0';
+#ifdef AUTO_EXPAND
+ rv = Chvdir(br->path);
+#else
rv = chdir(br->path);
+#endif
if (rv) {
char str[512];
sprintf(str, "Unable to cd to '%s'\n", br->path);
@@ -2590,6 +2882,24 @@
XBell(theDisp, 50);
}
+#ifdef AUTO_EXPAND
+ if (Isvdir(br->path)) {
+ BTSetActive(&br->but[BR_DELETE], 0);
+ br->cmdMB.dim[BR_DELETE] = 1;
+
+ BTSetActive(&br->but[BR_RENAME], 0);
+ br->cmdMB.dim[BR_RENAME] = 1;
+
+ BTSetActive(&br->but[BR_MKDIR], 0);
+ br->cmdMB.dim[BR_MKDIR] = 1;
+ }
+ else {
+ BTSetActive(&br->but[BR_MKDIR], 1);
+ br->cmdMB.dim[BR_MKDIR] = 0;
+ }
+#endif
+
+ restIconVisible(br);
strcat(br->path, "/"); /* put trailing '/' back on */
return rv;
}
@@ -2599,7 +2909,7 @@
static void copyDirInfo(srcbr, dstbr)
BROWINFO *srcbr, *dstbr;
{
- /* copies br info from an already existing browser window
+ /* copies br info from an already existing browser window
(ie, one that is already showing the same directory) */
int i, oldnum, maxv, page;
@@ -2611,15 +2921,19 @@
/* copy mblist */
dstbr->ndirs = srcbr->ndirs;
for (i=0; indirs; i++) {
- dstbr->mblist[i] = (char *) malloc(strlen(srcbr->mblist[i]) + 1);
+ dstbr->mblist[i] = strdup(srcbr->mblist[i]);
if (!dstbr->mblist[i]) FatalError("unable to malloc brMBlist[]");
- strcpy(dstbr->mblist[i], srcbr->mblist[i]);
}
- dstbr->dirMB.list = srcbr->mblist;
+#if 0
+ dstbr->dirMB.list = srcbr->mblist; /* original bug..? */
dstbr->dirMB.nlist = srcbr->ndirs;
+#else
+ dstbr->dirMB.list = dstbr->mblist; /* fixed by */
+ dstbr->dirMB.nlist = dstbr->ndirs; /* jp-extension. */
+#endif
- XClearArea(theDisp, dstbr->dirMB.win, dstbr->dirMB.x, dstbr->dirMB.y,
+ XClearArea(theDisp, dstbr->dirMB.win, dstbr->dirMB.x, dstbr->dirMB.y,
dstbr->dirMB.w+3, dstbr->dirMB.h+3, False);
i = StringWidth(dstbr->mblist[0]) + 10;
@@ -2644,7 +2958,7 @@
if ((i&0x03) == 0) drawTemp(dstbr, i, dstbr->bfLen);
if ((i & 0x3f) == 0) WaitCursor();
-
+
sbf = &(srcbr->bfList[i]);
dbf = &(dstbr->bfList[i]);
@@ -2670,7 +2984,7 @@
if (sbf->pimage) {
dbf->pimage = (byte *) malloc((size_t) dbf->w * dbf->h);
if (!dbf->pimage) FatalError("ran out of memory for dbf->pimage");
- xvbcopy((char *) sbf->pimage, (char *) dbf->pimage,
+ xvbcopy((char *) sbf->pimage, (char *) dbf->pimage,
(size_t) (dbf->w * dbf->h));
}
else dbf->pimage = (byte *) NULL;
@@ -2681,10 +2995,10 @@
xvbcopy((char *) sbf->ximage, (char *) dbf->ximage, sizeof(XImage));
if (sbf->ximage->data) {
- dbf->ximage->data = (char *) malloc((size_t) dbf->ximage->height *
+ dbf->ximage->data = (char *) malloc((size_t) dbf->ximage->height *
dbf->ximage->bytes_per_line);
if (!dbf->ximage->data) FatalError("ran out of memory for ximg data");
- xvbcopy((char *) sbf->ximage->data, (char *) dbf->ximage->data,
+ xvbcopy((char *) sbf->ximage->data, (char *) dbf->ximage->data,
(size_t) dbf->ximage->height * dbf->ximage->bytes_per_line);
}
}
@@ -2701,15 +3015,15 @@
computeScrlVals(dstbr, &maxv, &page);
if (dstbr->scrl.val > maxv) dstbr->scrl.val = maxv;
- XClearArea(theDisp, dstbr->iconW, 0, 0, (u_int) dstbr->iwWide,
+ XClearArea(theDisp, dstbr->iconW, 0, 0, (u_int) dstbr->iwWide,
(u_int) dstbr->iwHigh, True);
SCSetRange(&dstbr->scrl, 0, maxv, dstbr->scrl.val, page);
SetCursors(-1);
}
-
-
+
+
/***************************************************************/
static void scanDir(br)
@@ -2726,7 +3040,7 @@
* and it's reasonable to expect folks to want to add their own bitmaps
*/
- int i,j,k,oldbflen,vmsparent;
+ int i,j,oldbflen,vmsparent;
BFIL *bf;
DIR *dirp;
@@ -2753,7 +3067,7 @@
xv_getwd(path, sizeof(path));
if (path[strlen(path)-1] != '/') strcat(path,"/"); /* add trailing '/' */
- for (i=0; indirs; i++) free(br->mblist[i]); /* clear old dir names */
+ for (i=0; indirs; i++) free((char *) br->mblist[i]); /* clear old dir names */
/* path will be something like: "/u3/bradley/src/weiner/whatever/" */
@@ -2775,22 +3089,24 @@
/* build brMBlist */
for (i = br->ndirs-1,j=0; i>=0; i--,j++) {
- size_t stlen = (i<(br->ndirs-1)) ? dirnames[i+1] - dirnames[i]
+ size_t stlen = (i<(br->ndirs-1)) ? dirnames[i+1] - dirnames[i]
: strlen(dirnames[i]);
+ char *copy;
- br->mblist[j] = (char *) malloc(stlen+1);
- if (!br->mblist[j]) FatalError("unable to malloc brMBlist[]");
+ copy = malloc(stlen+1);
+ if (!copy) FatalError("unable to malloc brMBlist[]");
- strncpy(br->mblist[j], dirnames[i], stlen);
- br->mblist[j][stlen] = '\0';
+ strncpy(copy, dirnames[i], stlen);
+ copy[stlen] = '\0';
+ br->mblist[j] = copy;
}
-
+
/* refresh the brdirMB button */
br->dirMB.list = br->mblist;
br->dirMB.nlist = br->ndirs;
- XClearArea(theDisp, br->dirMB.win, br->dirMB.x, br->dirMB.y,
+ XClearArea(theDisp, br->dirMB.win, br->dirMB.x, br->dirMB.y,
br->dirMB.w+3, br->dirMB.h+3, False);
i = StringWidth(br->mblist[0]) + 10;
@@ -2815,7 +3131,7 @@
/* count how many files are in the list */
dirp = opendir(".");
- if (!dirp) {
+ if (!dirp) {
endScan(br, oldbflen);
setBrowStr(br, "Couldn't read current directory.");
SetCursors(-1);
@@ -2827,11 +3143,11 @@
#endif
while ( (dp = readdir(dirp)) != NULL) {
- if (strcmp(dp->d_name, ".") &&
+ if (strcmp(dp->d_name, ".") &&
strcmp(dp->d_name, THUMBDIR)) {
- if (!br->showhidden && dp->d_name[0] == '.' &&
+ if (!br->showhidden && dp->d_name[0] == '.' &&
strcmp(dp->d_name,"..")!=0) continue;
- else
+ else
br->bfLen++;
}
if ((br->bfLen & 0x3f) == 0) WaitCursor();
@@ -2877,13 +3193,13 @@
}
else {
do { dp = readdir(dirp); }
- while (dp && (strcmp(dp->d_name, ".")==0 ||
+ while (dp && (strcmp(dp->d_name, ".")==0 ||
strcmp(dp->d_name, THUMBDIR)==0 ||
strcmp(dp->d_name, THUMBDIRNAME)==0 ||
(br->ndirs==1 && strcmp(dp->d_name,"..")==0) ||
- (!br->showhidden && dp->d_name[0] == '.' &&
+ (!br->showhidden && dp->d_name[0] == '.' &&
strcmp(dp->d_name,"..")!=0)));
-
+
if (!dp) { br->bfLen = i; break; } /* dir got shorter... */
}
@@ -2940,11 +3256,11 @@
if (w<1) w = 1;
if (h<1) h = 1;
- XClearArea(theDisp, br->iconW, (ctrlColor) ? 2 : 0, (ctrlColor) ? 2 : 0,
+ XClearArea(theDisp, br->iconW, (ctrlColor) ? 2 : 0, (ctrlColor) ? 2 : 0,
(u_int) w, (u_int) h, False);
SCSetRange(&br->scrl, 0, maxv, br->scrl.val, page);
-
+
SetCursors(-1);
}
@@ -2972,10 +3288,14 @@
bf->pimage = (byte *) NULL;
bf->ximage = (XImage *) NULL;
bf->lit = 0;
-
+
if (stat(bf->name, &st)==0) {
+#ifdef AUTO_EXPAND
+ bf->ftype = stat2bf((u_int) st.st_mode , bf->name);
+#else
bf->ftype = stat2bf((u_int) st.st_mode);
+#endif
if (bf->ftype == BF_FILE && (st.st_mode & 0111)) bf->ftype = BF_EXE;
switch (bf->ftype) {
@@ -3007,6 +3327,7 @@
case RFT_XBM: bf->ftype = BF_XBM; break;
case RFT_SUNRAS: bf->ftype = BF_SUNRAS; break;
case RFT_BMP: bf->ftype = BF_BMP; break;
+ case RFT_WBMP: bf->ftype = BF_BMP; break;
case RFT_UTAHRLE: bf->ftype = BF_UTAHRLE; break;
case RFT_IRIS: bf->ftype = BF_IRIS; break;
case RFT_PCX: bf->ftype = BF_PCX; break;
@@ -3014,12 +3335,22 @@
case RFT_TIFF: bf->ftype = BF_TIFF; break;
case RFT_PDSVICAR: bf->ftype = BF_PDS; break;
case RFT_COMPRESS: bf->ftype = BF_COMPRESS; break;
+ case RFT_BZIP2: bf->ftype = BF_BZIP2; break;
case RFT_PS: bf->ftype = BF_PS; break;
case RFT_IFF: bf->ftype = BF_IFF; break;
- case RFT_TARGA: bf->ftype = BF_TARGA; break;
+ case RFT_TARGA: bf->ftype = BF_TGA; break;
case RFT_XPM: bf->ftype = BF_XPM; break;
case RFT_XWD: bf->ftype = BF_XWD; break;
case RFT_FITS: bf->ftype = BF_FITS; break;
+ case RFT_PNG: bf->ftype = BF_PNG; break;
+ case RFT_ZX: bf->ftype = BF_ZX; break; /* [JCE] */
+ case RFT_PCD: bf->ftype = BF_PCD; break;
+ case RFT_MAG: bf->ftype = BF_MAG; break;
+ case RFT_MAKI: bf->ftype = BF_MAKI; break;
+ case RFT_PIC: bf->ftype = BF_PIC; break;
+ case RFT_PI: bf->ftype = BF_PI; break;
+ case RFT_PIC2: bf->ftype = BF_PIC2; break;
+ case RFT_MGCSFX: bf->ftype = BF_MGCSFX; break;
}
}
}
@@ -3048,11 +3379,11 @@
bfcompares++;
if ((bfcompares & 0x7f)==0) WaitCursor();
- /* sort critera: directories first, in alphabetical order,
+ /* sort critera: directories first, in alphabetical order,
followed by everything else, in alphabetical order */
-
+
if ((b1->ftype == BF_DIR && b2->ftype == BF_DIR) ||
- (b1->ftype != BF_DIR && b2->ftype != BF_DIR))
+ (b1->ftype != BF_DIR && b2->ftype != BF_DIR))
return strcmp(b1->name, b2->name);
else if (b1->ftype == BF_DIR && b2->ftype != BF_DIR) return -1;
@@ -3108,7 +3439,7 @@
for (i=0; ibfList[i].name) + 1);
if (!bfnames[i]) FatalError("couldn't alloc bfnames in rescanDir()");
-
+
strcpy(bfnames[i], br->bfList[i].name);
}
}
@@ -3121,7 +3452,7 @@
/* note, either (or both) dirnames/bfnames can be NULL, in which case
their respective 'len's will be zero */
-
+
/* sort the two name lists */
if (bflen) qsort((char *) bfnames, (size_t) bflen, sizeof(char *),namcmp);
if (dirlen) qsort((char *) dirnames, (size_t) dirlen,sizeof(char *),namcmp);
@@ -3153,7 +3484,7 @@
}
}
bflen = j;
-
+
for (i=j=0; ibfLen - bflen + dirlen; /* oldlen - #del'd + #created */
if (newlen>0) {
@@ -3241,7 +3572,7 @@
if (bf->pimage) free(bf->pimage);
if (bf->ximage) xvDestroyImage(bf->ximage);
}
-
+
free(br->bfList);
}
@@ -3263,17 +3594,17 @@
/***************************************************************/
static char **getDirEntries(dir, lenP, dohidden)
- char *dir;
+ const char *dir;
int *lenP;
int dohidden;
{
- /* loads up all directory entries into an array. This *isn't* a great
- way to do it, but I can't count on 'scandir()' existing on
+ /* loads up all directory entries into an array. This *isn't* a great
+ way to do it, but I can't count on 'scandir()' existing on
every system. Returns 'NULL' on failure, or pointer to array of
'lenP' strings on success. '.' and '..' ARE included in list
if !dohidden, all '.*' files are skipped (except . and ..) */
- int i, j, dirlen;
+ int i, dirlen;
DIR *dirp;
char **names;
#ifdef NODIRENT
@@ -3294,9 +3625,9 @@
/* count # of entries in dir (worst case) */
for (dirlen=0; (dp = readdir(dirp)) != NULL; dirlen++);
if (!dirlen) {
- closedir(dirp);
+ closedir(dirp);
*lenP = dirlen;
- return (char **) NULL;
+ return (char **) NULL;
}
@@ -3312,7 +3643,7 @@
if (!dohidden) {
#ifndef VMS
- if (dp->d_name[0] == '.' &&
+ if (dp->d_name[0] == '.' &&
strcmp(dp->d_name,"." )!=0 &&
strcmp(dp->d_name,"..")!=0) continue;
#endif
@@ -3324,7 +3655,7 @@
strcpy(names[i], dp->d_name);
i++;
}
-
+
if (iname || bf->name[0] == '\0') return; /* shouldn't happen */
str[0] = '\0';
basefname[0] = '\0';
pinfo.pic = (byte *) NULL;
pinfo.comment = (char *) NULL;
- readname = bf->name;
-
+ strncpy(readname, bf->name, sizeof(readname) - 1);
+
/* free any old info in 'bf' */
if (bf->imginfo) free (bf->imginfo);
if (bf->pimage) free (bf->pimage);
if (bf->ximage) xvDestroyImage(bf->ximage);
-
+
bf->imginfo = (char *) NULL;
bf->pimage = (byte *) NULL;
bf->ximage = (XImage *) NULL;
@@ -3429,10 +3760,10 @@
/* skip all 'special' files */
if (!ISLOADABLE(bf->ftype)) return;
-
+
filetype = ReadFileType(bf->name);
-
- if (filetype == RFT_COMPRESS) {
+
+ if ((filetype == RFT_COMPRESS) || (filetype == RFT_BZIP2)) {
#if (defined(VMS) && !defined(GUNZIP))
/* VMS decompress doesn't like the file to have a trailing .Z in fname
however, GUnZip is OK with it, which we are calling UnCompress */
@@ -3442,10 +3773,10 @@
#else
uncName = bf->name;
#endif
-
- if (UncompressFile(uncName, uncompname)) {
+
+ if (UncompressFile(uncName, uncompname, filetype)) {
filetype = ReadFileType(uncompname);
- readname = uncompname;
+ strncpy(readname, uncompname, sizeof(readname) - 1);
}
else {
sprintf(str, "Couldn't uncompress file '%s'", bf->name);
@@ -3453,71 +3784,139 @@
bf->ftype = BF_ERROR;
}
}
-
+
+#ifdef MACBINARY
+ if (handlemacb && macb_file == True && bf->ftype != BF_ERROR) {
+ if (RemoveMacbinary(readname, uncompname)) {
+ if (strcmp(readname, bf->name)!=0) unlink(readname);
+ strncpy(readname, uncompname, sizeof(readname) - 1);
+ }
+ else {
+ sprintf(str, "Unable to remove a InfoFile header form '%s'.", bf->name);
+ setBrowStr(br, str);
+ bf->ftype = BF_ERROR;
+ }
+ }
+#endif
+
+#ifdef HAVE_MGCSFX_AUTO
+ if (bf->ftype != BF_ERROR) {
+ if(filetype == RFT_MGCSFX){
+ char tmpname[128];
+ char *icom;
+
+ if((icom = mgcsfx_auto_input_com(bf->name)) != NULL){
+ sprintf(tmpname, "%s/xvmsautoXXXXXX", tmpdir);
+#ifdef USE_MKSTEMP
+ close(mkstemp(tmpname));
+#else
+ mktemp(tmpname);
+#endif
+ SetISTR(ISTR_INFO, "Converting to known format by MgcSfx auto...");
+ sprintf(str,"%s >%s", icom, tmpname);
+ }else goto ms_auto_no;
+
+#ifndef VMS
+ if (system(str))
+#else
+ if (!system(str))
+#endif
+ {
+ sprintf(str, "Unable to convert '%s' by MgcSfx auto.", bf->name);
+ setBrowStr(br, str);
+ bf->ftype = BF_ERROR;
+ }
+ else {
+ filetype = ReadFileType(tmpname);
+ if (strcmp(readname, bf->name)!=0) unlink(readname);
+ strncpy(readname, tmpname, sizeof(readname) - 1);
+ }
+ }
+ }
+ms_auto_no:
+#endif /* HAVE_MGCSFX_AUTO */
+
/* get rid of comments. don't need 'em */
if (pinfo.comment) free(pinfo.comment); pinfo.comment = (char *) NULL;
-
- if (filetype == RFT_ERROR) {
+
+ if (filetype == RFT_ERROR) {
sprintf(str,"Couldn't open file '%s'", bf->name);
setBrowStr(br, str);
bf->ftype = BF_ERROR;
}
-
+
else if (filetype == RFT_UNKNOWN) {
/* if it *was* an 'exe', leave it that way */
if (bf->ftype != BF_EXE) bf->ftype = BF_UNKNOWN;
}
-
+
else {
/* otherwise it's a known filetype... do the *hard* part now... */
-
+
+#ifdef VS_ADJUST
+ normaspect = defaspect;
+#endif
i = ReadPicFile(readname, filetype, &pinfo, 1);
KillPageFiles(pinfo.pagebname, pinfo.numpages);
-
+
if (!i) bf->ftype = BF_ERROR;
-
+
if (i && (pinfo.w<=0 || pinfo.h<=0)) { /* bogus size */
bf->ftype = BF_ERROR;
free(pinfo.pic); pinfo.pic = (byte *) NULL;
}
-
+
if (bf->ftype==BF_ERROR && filetype==RFT_XBM) bf->ftype = BF_UNKNOWN;
}
-
+
/* get rid of comment, as we don't need it */
- if (pinfo.comment) {
+ if (pinfo.comment) {
free(pinfo.comment); pinfo.comment = (char *) NULL;
}
-
+
/* if we made an uncompressed file, we can rm it now */
- if (readname != bf->name) unlink(readname);
-
-
+ if (strcmp(readname, bf->name)!=0) unlink(readname);
+
+
/* at this point either BF_ERROR, BF_UNKNOWN, BF_EXE or pic */
-
+
if (!pinfo.pic) {
if (bf->ftype == BF_EXE) return; /* don't write thumbfiles for exe's */
-
+
bf->w = br_file_width; bf->h = br_file_height;
writeThumbFile(br, bf, NULL, 0, 0, NULL); /* BF_ERROR, BF_UNKNOWN */
return;
}
-
+
/* at this point, we have a pic, so it must be an image file */
-
-
+
+
/* compute size of icon (iwide,ihigh) */
-
+
+#ifdef VS_ADJUST
+ if (!vsadjust) normaspect = 1;
+
+ wexpand = (double) (pinfo.w * normaspect) / (double) ISIZE_WIDE;
+#else
wexpand = (double) pinfo.w / (double) ISIZE_WIDE;
+#endif /* VS_ADJUST */
hexpand = (double) pinfo.h / (double) ISIZE_HIGH;
if (wexpand >= 1.0 || hexpand >= 1.0) { /* don't expand small icons */
if (wexpand>hexpand) {
+#ifdef VS_ADJUST
+ iwide = (int) ((pinfo.w * normaspect) / wexpand + 0.5);
+#else
iwide = (int) (pinfo.w / wexpand + 0.5);
+#endif
ihigh = (int) (pinfo.h / wexpand + 0.5);
}
else {
+#ifdef VS_ADJUST
+ iwide = (int) ((pinfo.w * normaspect) / hexpand + 0.5);
+#else
iwide = (int) (pinfo.w / hexpand + 0.5);
+#endif
ihigh = (int) (pinfo.h / hexpand + 0.5);
}
}
@@ -3527,13 +3926,13 @@
/* generate icon */
- icon24 = Smooth24(pinfo.pic, pinfo.type==PIC24, pinfo.w, pinfo.h,
+ icon24 = Smooth24(pinfo.pic, pinfo.type==PIC24, pinfo.w, pinfo.h,
iwide, ihigh, pinfo.r,pinfo.g,pinfo.b);
if (!icon24) { bf->ftype = BF_FILE; free(pinfo.pic); return; }
sprintf(str, "%dx%d ", pinfo.normw, pinfo.normh);
switch (filetype) {
- case RFT_GIF: if (xv_strstr(pinfo.shrtInfo, "GIF89"))
+ case RFT_GIF: if (xv_strstr(pinfo.shrtInfo, "GIF89"))
strcat(str,"GIF89 file");
else
strcat(str,"GIF87 file");
@@ -3543,12 +3942,12 @@
case RFT_PBM: if (xv_strstr(pinfo.fullInfo, "raw")) strcat(str,"Raw ");
else strcat(str,"Ascii ");
-
+
for (i=0; i<3 && (strlen(pinfo.fullInfo)>(size_t)3); i++){
str1[0] = pinfo.fullInfo[i]; str1[1] = '\0';
strcat(str, str1);
}
-
+
strcat(str," file");
break;
@@ -3567,21 +3966,30 @@
case RFT_XPM: strcat(str,"XPM file"); break;
case RFT_XWD: strcat(str,"XWD file"); break;
case RFT_FITS: strcat(str,"FITS file"); break;
+ case RFT_PNG: strcat(str,"PNG file"); break;
+ case RFT_ZX: strcat(str,"Spectrum SCREEN$"); break; /* [JCE] */
+ case RFT_PCD: strcat(str,"PhotoCD file"); break;
+ case RFT_MAG: strcat(str,"MAG file"); break;
+ case RFT_MAKI: strcat(str,"MAKI file"); break;
+ case RFT_PIC: strcat(str,"PIC file"); break;
+ case RFT_PI: strcat(str,"PI file"); break;
+ case RFT_PIC2: strcat(str,"PIC2 file"); break;
+ case RFT_MGCSFX: strcat(str,"Magic Suffix file"); break;
default: strcat(str,"file of unknown type"); break;
}
-
-
+
+
/* find out length of original file */
{ FILE *fp;
long filesize;
char buf[64];
-
+
fp = fopen(bf->name, "r");
if (fp) {
fseek(fp, 0L, 2);
filesize = ftell(fp);
fclose(fp);
-
+
sprintf(buf," (%ld bytes)", filesize);
strcat(str, buf);
}
@@ -3609,17 +4017,17 @@
bf->w = iwide;
bf->h = ihigh;
bf->ftype = BF_HAVEIMG;
-
+
bf->ximage = Pic8ToXImage(icon8, (u_int) iwide, (u_int) ihigh, browcols,
browR, browG, browB);
-
+
free(icon24);
free(pinfo.pic);
}
-
+
/*
@@ -3670,6 +4078,10 @@
sprintf(thFname, "%s%s/%s", br->path, THUMBDIR, bf->name);
+#ifdef AUTO_EXPAND
+ Dirtovd(thFname);
+#endif
+
fp = fopen(thFname, "r");
if (!fp) return; /* nope, it doesn't have one */
@@ -3682,7 +4094,7 @@
/* read comments until we see '#END_OF_COMMENTS', or hit EOF */
while (1) {
if (!fgets(buf, 256, fp)) goto errexit;
-
+
if (!strncmp(buf, "#END_OF_COMMENTS", strlen("#END_OF_COMMENTS")))
break;
@@ -3714,7 +4126,7 @@
/* read width, height, maxval */
- if (!fgets(buf, 256, fp) || sscanf(buf, "%d %d %d", &w, &h, &mv) != 3)
+ if (!fgets(buf, 256, fp) || sscanf(buf, "%d %d %d", &w, &h, &mv) != 3)
goto errexit;
@@ -3738,14 +4150,14 @@
bf->h = h;
bf->ftype = BF_HAVEIMG;
bf->imginfo = info;
-
- bf->ximage = Pic8ToXImage(icon8, (u_int) w, (u_int) h, browcols,
+
+ bf->ximage = Pic8ToXImage(icon8, (u_int) w, (u_int) h, browcols,
browR, browG, browB);
}
else {
if (info) free(info);
}
-
+
fclose(fp);
return;
@@ -3757,7 +4169,7 @@
}
-
+
/***************************************************************/
static void writeThumbFile(br, bf, icon8, w, h, info)
BROWINFO *br;
@@ -3785,9 +4197,14 @@
sprintf(thFname, "%s%s/%s", br->path, THUMBDIR, bf->name);
+#ifdef AUTO_EXPAND
+ Dirtovd(thFname);
+#endif
+
+ unlink(thFname); /* just in case there's already an unwritable one */
fp = fopen(thFname, "w");
if (!fp) {
- sprintf(buf, "Can't create thumbnail file '%s': %s", thFname,
+ sprintf(buf, "Can't create thumbnail file '%s': %s", thFname,
ERRSTR(errno));
setBrowStr(br, buf);
return; /* can't write... */
@@ -3829,9 +4246,9 @@
setBrowStr(br, buf);
return; /* can't write... */
}
-
+
fclose(fp);
-
+
chmod(thFname, (mode_t) perm);
}
@@ -3849,15 +4266,29 @@
sprintf(thFname, "%s%s", br->path, THUMBDIRNAME);
+#ifdef AUTO_EXPAND
+ Dirtovd(thFname);
+#endif
+
i = stat(thFname, &st);
if (i) { /* failed, let's create it */
sprintf(thFname, "%s.", br->path);
+#ifdef AUTO_EXPAND
+ Dirtovd(thFname);
+#endif
i = stat(thFname, &st); /* get permissions of parent dir */
if (!i) perm = st.st_mode & 07777;
else perm = 0755;
sprintf(thFname, "%s%s", br->path, THUMBDIRNAME);
- mkdir(thFname, (mode_t) perm);
+#ifdef AUTO_EXPAND
+ Dirtovd(thFname);
+#endif
+ i = mkdir(thFname, (mode_t) perm);
+#ifdef VIRTUAL_TD
+ if (i < 0)
+ Mkvdir_force(thFname);
+#endif
}
}
@@ -3899,7 +4330,7 @@
for (i=0, bf=br->bfList; ibfLen; i++, bf++) {
if (bf->ftype <= BF_FILE || bf->ftype >= BF_ERROR || bf->ftype==BF_EXE) {
- /* ie, not a 'special' file */
+ /* i.e., not a 'special' file */
int s1, s2;
char thfname[256];
@@ -3913,10 +4344,9 @@
sprintf(thfname, "%s/%s", THUMBDIR, bf->name);
s2 = stat(thfname, &thumbst);
- if (s1 || s2 || filest.st_mtime > thumbst.st_mtime ||
- filest.st_ctime > thumbst.st_ctime) {
- /* either stat'ing the file or the thumbfile failed, or
- both stat's succeeded and the file has a newer mod or creation
+ if (s1 || s2 || filest.st_mtime > thumbst.st_mtime) {
+ /* either stat'ing the file or the thumbfile failed, or
+ both stat's succeeded and the file has a newer mod
time than the thumbnail file */
makeIconVisible(br, i);
@@ -3926,11 +4356,16 @@
if (bf->ftype != BF_EXE) {
iconsBuilt++;
- if (DEBUG)
- fprintf(stderr,"icon made:fname='%s' thfname='%s' %d,%d,%d,%d\n",
- bf->name, thfname, s1,s2,filest.st_mtime,thumbst.st_mtime);
+ if (DEBUG)
+ fprintf(stderr,"icon made:fname='%s' thfname='%s' %d,%d,%ld,%ld\n",
+ bf->name, thfname, s1, s2,
+ (long)filest.st_mtime, (long)thumbst.st_mtime);
}
}
+ else if (filest.st_ctime > thumbst.st_ctime) {
+ /* update protections */
+ chmod(thfname, (mode_t) (filest.st_mode & 07777));
+ }
}
statcount++;
@@ -3964,7 +4399,11 @@
sprintf(thfname, "%s/%s", THUMBDIR, dp->d_name);
if (stat(thfname, &thumbst)==0) { /* success */
int tmp;
+#ifdef AUTO_EXPAND
+ tmp = stat2bf((u_int) thumbst.st_mode , thfname);
+#else
tmp = stat2bf((u_int) thumbst.st_mode);
+#endif
if (tmp == BF_FILE) { /* a plain file */
/* see if this thumbfile has an associated pic file */
@@ -3974,7 +4413,7 @@
}
}
statcount++;
-
+
if ((statcount % 30)==0) WaitCursor();
}
closedir(dirp);
@@ -3998,16 +4437,16 @@
{
if (maxcnt<1) return; /* none of that naughty ol' divide by zero stuff */
- DrawTempGauge(br->win, 5, br->dirMB.y,
+ DrawTempGauge(br->win, 5, br->dirMB.y,
(int) br->dirMB.x-10, (int) br->dirMB.h,
(double) cnt / (double) maxcnt,
browfg, browbg, browhi, browlo, "");
}
-
+
static void clearTemp(br)
BROWINFO *br;
{
- XClearArea(theDisp, br->win, 5, br->dirMB.y,
+ XClearArea(theDisp, br->win, 5, br->dirMB.y,
(u_int) br->dirMB.x-10+1, (u_int) br->dirMB.h + 1, True);
}
@@ -4038,17 +4477,26 @@
pops up a 'what do you want to rename it to' box, and attempts to
do the trick... */
- int i, num;
- char buf[128], txt[256], *origname, txt1[256];
- static char *labels[] = { "\nOk", "\033Cancel" };
- struct stat st;
+ int i, num;
+ char buf[128], txt[256], *origname, txt1[256];
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ struct stat st;
+
+#ifdef AUTO_EXPAND
+ if (Isvdir(br->path)) {
+ sprintf(buf,"Sorry, you can't rename file in the virtual directory, '%s'",
+ br->path);
+ ErrPopUp(buf, "\nBummer!");
+ return;
+ }
+#endif
if (cdBrow(br)) return;
/* find the selected file */
for (i=0; ibfLen && !br->bfList[i].lit; i++);
if (i==br->bfLen) return; /* shouldn't happen */
-
+
origname = br->bfList[i].name; num = i;
if (strcmp(origname, "..")==0) {
@@ -4058,7 +4506,7 @@
return;
}
- sprintf(txt, "Enter a new name for the %s '%s':",
+ sprintf(txt, "Enter a new name for the %s '%s':",
(br->bfList[i].ftype==BF_DIR) ? "directory" : "file",
origname);
@@ -4107,7 +4555,7 @@
drawIcon(br, num);
for (i=0; ipath)==0)
+ if (&binfo[i] != br && strcmp(binfo[i].path, br->path)==0)
rescanDir(&binfo[i]);
}
@@ -4125,15 +4573,24 @@
pops up a 'what do you want to call it' box, and attempts to
do the trick... */
- int i;
- char buf[128], txt[256];
- static char *labels[] = { "\nOk", "\033Cancel" };
- struct stat st;
+ int i;
+ char buf[128], txt[256];
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ struct stat st;
+
+#ifdef AUTO_EXPAND
+ if (Isvdir(br->path)) {
+ sprintf(buf,"Sorry, you can't mkdir in the virtual directory, '%s'",
+ br->path);
+ ErrPopUp(buf, "\nBummer!");
+ return;
+ }
+#endif
if (cdBrow(br)) return;
buf[0] = '\0';
- i = GetStrPopUp("Enter name for new directory:", labels, 2,
+ i = GetStrPopUp("Enter name for new directory:", labels, 2,
buf, 128, "/ |\'\"<>,", 0);
if (i) return; /* cancelled */
@@ -4161,7 +4618,7 @@
/* rescan current br, and all other br's pointing to same directory */
for (i=0; ipath)==0)
+ if (strcmp(binfo[i].path, br->path)==0)
rescanDir(&binfo[i]);
}
@@ -4176,10 +4633,10 @@
static void doChdirCmd(br)
BROWINFO *br;
{
- int i;
- static char buf[MAXPATHLEN+100];
- static char *labels[] = { "\nOk", "\033Cancel" };
- char str[512];
+ int i;
+ static char buf[MAXPATHLEN+100];
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char str[512];
buf[0] = '\0';
i = GetStrPopUp("Change to directory:", labels, 2, buf, MAXPATHLEN, " ", 0);
@@ -4198,14 +4655,35 @@
if (cdBrow(br)) return; /* prints its own error message */
}
+#ifdef AUTO_EXPAND
+ if (Chvdir(buf)) {
+#else
if (chdir(buf)) {
+#endif
sprintf(str,"Unable to cd to '%s'\n", buf);
setBrowStr(br, str);
XBell(theDisp, 50);
}
else {
+#ifdef AUTO_EXPAND
+ if (Isvdir(buf)) {
+ BTSetActive(&br->but[BR_DELETE], 0);
+ br->cmdMB.dim[BR_DELETE] = 1;
+
+ BTSetActive(&br->but[BR_RENAME], 0);
+ br->cmdMB.dim[BR_RENAME] = 1;
+
+ BTSetActive(&br->but[BR_MKDIR], 0);
+ br->cmdMB.dim[BR_MKDIR] = 1;
+ }
+ else {
+ BTSetActive(&br->but[BR_MKDIR], 1);
+ br->cmdMB.dim[BR_MKDIR] = 0;
+ }
+#endif
scanDir(br);
SCSetVal(&(br->scrl), 0); /* reset to top on a chdir */
+ restIconVisible(br);
}
}
@@ -4225,10 +4703,19 @@
* call 'rm_dir()' for each of the directories
*/
- BFIL *bf;
- int i, j, numdirs, numfiles, slen, firstdel;
- char buf[512];
- static char *yesno[] = { "\004Delete", "\033Cancel" };
+ BFIL *bf;
+ int i, numdirs, numfiles, slen, firstdel;
+ char buf[512];
+ static const char *yesno[] = { "\004Delete", "\033Cancel" };
+
+#ifdef AUTO_EXPAND
+ if (Isvdir(br->path)) {
+ sprintf(buf,"Sorry, you can't delete file at the virtual directory, '%s'",
+ br->path);
+ ErrPopUp(buf, "\nBummer!");
+ return;
+ }
+#endif
if (!br->bfLen || !br->bfList || !br->numlit) return;
@@ -4252,13 +4739,17 @@
for (i=0, bf=br->bfList; ibfLen; i++,bf++) {
if (bf->lit) {
if (firstdel == -1) firstdel = i;
- if (bf->ftype == BF_DIR) numdirs++;
+ if (bf->ftype == BF_DIR
+#ifdef AUTO_EXPAND
+ && (!Isarchive(bf->name))
+#endif
+ ) numdirs++;
else numfiles++;
}
}
- /* if any plain files are being toasted, bring up the low-key
+ /* if any plain files are being toasted, bring up the low-key
confirmation box */
if (numfiles) {
@@ -4266,7 +4757,12 @@
slen = strlen(buf);
for (i=0, bf=br->bfList; ibfLen; i++,bf++) {
+#ifdef AUTO_EXPAND
+ if (bf->lit && (bf->ftype != BF_DIR || Isarchive(bf->name))) {
+#else
if (bf->lit && bf->ftype != BF_DIR) {
+#endif
+
if ( (slen + strlen(bf->name) + 1) > 256) {
strcat(buf,"...");
break;
@@ -4278,10 +4774,10 @@
}
}
- i = PopUp(buf, yesno, 2);
+ i = PopUp(buf, yesno, COUNT(yesno));
if (i) return; /* cancelled */
}
-
+
/* if any directories are being toasted, bring up the are you REALLY sure
confirmation box */
@@ -4291,7 +4787,11 @@
slen = strlen(buf);
for (i=0, bf=br->bfList; ibfLen; i++,bf++) {
+#ifdef AUTO_EXPAND
+ if (bf->lit && (bf->ftype == BF_DIR || !Isarchive(bf->name))) {
+#else
if (bf->lit && bf->ftype == BF_DIR) {
+#endif
if ( (slen + strlen(bf->name) + 1) > 256) {
strcat(buf,"...");
break;
@@ -4303,16 +4803,20 @@
}
}
- i = PopUp(buf, yesno, 2);
+ i = PopUp(buf, yesno, COUNT(yesno));
if (i) return; /* cancelled */
}
/* okay, at this point they've been warned. do the deletion */
-
+
for (i=0, bf=br->bfList; ibfLen; i++,bf++) {
if (bf->lit) {
- if (bf->ftype == BF_DIR) rm_dir (br, bf->name);
+ if (bf->ftype == BF_DIR
+#ifdef AUTO_EXPAND
+ && !Isarchive(bf->name)
+#endif
+ ) rm_dir (br, bf->name);
else rm_file(br, bf->name);
}
}
@@ -4340,7 +4844,7 @@
/* rescan other br's that are looking at this directory */
for (i=0; ipath)==0)
+ if (&binfo[i] != br && strcmp(binfo[i].path, br->path)==0)
rescanDir(&binfo[i]);
}
@@ -4353,10 +4857,10 @@
static void doSelFilesCmd(br)
BROWINFO *br;
{
- int i;
- static char buf[MAXPATHLEN+100];
- static char *labels[] = { "\nOk", "\033Cancel" };
- char str[512];
+ int i;
+ static char buf[MAXPATHLEN+100];
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char str[512];
buf[0] = '\0';
strcpy(str,"Select file name(s). Wildcard '*' is allowed. ");
@@ -4394,9 +4898,9 @@
static void doRecurseCmd(br)
BROWINFO *br;
{
- int i;
- static char *labels[] = { "\nOk", "\033Cancel" };
- char str[512];
+ int i;
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char str[512];
strcpy(str,"Recursive Update: This could take *quite* a while.\n");
strcat(str,"Are you sure?");
@@ -4415,9 +4919,9 @@
/*******************************************/
-static void recurseUpdate(br, subdir)
- BROWINFO *br;
- char *subdir;
+static void recurseUpdate(br, subdir)
+ BROWINFO *br;
+ const char *subdir;
{
/* note: 'br->path + subdir' is the full path to recurse down from */
@@ -4430,7 +4934,7 @@
* and for each subdir in this dir, recurse
*
* if cur dir != orig dir, cd back to orig dir and reload 'br'
- */
+ */
int i;
char orgDir[MAXPATHLEN + 2];
@@ -4441,7 +4945,11 @@
xv_getwd(orgDir, sizeof(orgDir));
sprintf(curDir, "%s%s", br->path, subdir);
+#ifdef AUTO_EXPAND
+ if (Chvdir(curDir)) {
+#else
if (chdir(curDir)) {
+#endif
char str[512];
sprintf(str, "Unable to cd to '%s'\n", curDir);
setBrowStr(br, str);
@@ -4449,18 +4957,28 @@
}
xv_getwd(curDir, sizeof(curDir));
-
+
/* have we looped? */
for (i=0; ibfLen; i++) {
bf = &(br->bfList[i]);
- if (bf &&
- bf->ftype == BF_DIR &&
+ if (bf &&
+ bf->ftype == BF_DIR &&
strcmp(bf->name, ".") &&
strcmp(bf->name, "..") &&
strcmp(bf->name, THUMBDIRNAME) ) {
@@ -4495,7 +5013,12 @@
xv_getwd(curDir, sizeof(curDir));
if (strcmp(orgDir, curDir)) { /* change back to orgdir */
+#ifdef AUTO_EXPAND
+ Chvdir(orgDir);
+#else
chdir(orgDir);
+#endif
+ restIconVisible(br);
scanDir(br);
}
}
@@ -4519,12 +5042,19 @@
setBrowStr(br, buf);
}
+#ifdef AUTO_EXPAND
+ if (Rmvdir(name)) {
+ sprintf(buf, "fail to remove virturl directory: %s", name);
+ setBrowStr(br, buf);
+ }
+#endif
+
/* try to delete a thumbnail file, as well. ignore errors */
strcpy(buf1, name); /* tmp1 = leading path of name */
tmp = (char *) rindex(buf1, '/');
if (!tmp) strcpy(buf1,".");
else *tmp = '\0';
-
+
sprintf(buf, "%s/%s/%s", buf1, THUMBDIR, BaseName(name));
if (DEBUG) fprintf(stderr," (%s)\n", buf);
@@ -4548,7 +5078,7 @@
BROWINFO *br;
{
/* recursively delete this directory, and all things under it */
-
+
int i, dirlen, longpath, oldpathlen;
char **names, *name, buf[512];
struct stat st;
@@ -4569,7 +5099,7 @@
name = names[i];
/* skip . and .. (not that we should ever see them... */
- if (name[0] == '.' && (name[1]=='\0' ||
+ if (name[0] == '.' && (name[1]=='\0' ||
(name[1]=='.' && name[2]=='\0'))) goto done;
if (strlen(name) + oldpathlen >= (MAXPATHLEN-3)) {
@@ -4586,15 +5116,22 @@
rmdirPath[oldpathlen] = '\0';
goto done;
}
-
- if (stat2bf((u_int) st.st_mode) == BF_DIR) { /* skip, for now */
+
+#ifdef AUTO_EXPAND
+ if ((stat2bf((u_int) st.st_mode , rmdirPath) == BF_DIR)
+ && !Isarchive(rmdirPath)) /* skip, for now */
+#else
+
+ if (stat2bf((u_int) st.st_mode) == BF_DIR) /* skip, for now */
+#endif
+ {
rmdirPath[oldpathlen] = '\0';
continue; /* don't remove from list */
}
rm_file(br, rmdirPath);
rmdirPath[oldpathlen] = '\0';
-
+
done: /* remove name from list */
free(name);
names[i] = (char *) NULL;
@@ -4640,30 +5177,35 @@
static int overwrite;
#define OWRT_ASK 0
-#define OWRT_NOASK 1
-#define OWRT_CANCEL 2
-
+#define OWRT_ALWAYS 1
+#define OWRT_NEVER 2
+#define OWRT_CANCEL 3
/*******************************************/
-static void dragFiles(srcBr, dstBr, srcpath, dstpath, dstdir,
+static void dragFiles(srcBr, dstBr, srcpath, dstpath, dstdir,
names, nlen, cpymode)
- BROWINFO *srcBr, *dstBr;
- char *srcpath, *dstpath, *dstdir, **names;
- int nlen, cpymode;
+ BROWINFO *srcBr, *dstBr;
+ char *srcpath, *dstpath, **names;
+ const char *dstdir;
+ int nlen, cpymode;
{
- /* move or copy file(s) and their associated thumbnail files.
+ /* move or copy file(s) and their associated thumbnail files.
srcpath and dstpath will have trailing '/'s. dstdir is name of
folder in dstpath (or "." or "..") to write to. names is an nlen
long array of strings (the simple filenames of the files to move)
if 'cpymode' copy files, otherwise move them */
- int i, j, k, dothumbs, fail;
+ int i, j, dothumbs, fail;
char dstp[MAXPATHLEN + 1];
char src[MAXPATHLEN+1], dst[MAXPATHLEN+1];
char buf[128];
struct stat st;
+ /* if the source directory is read-only, don't move files; copy them */
+ if (!cpymode && (access(srcpath, W_OK) != 0))
+ cpymode = 1;
+
/* build real destination dir */
strcpy(dstp, dstpath);
@@ -4677,11 +5219,26 @@
}
else if (strcmp(dstdir,".")!=0) sprintf(dstp, "%s%s/", dstpath, dstdir);
+#ifdef AUTO_EXPAND
+ if (Isvdir(dstp)) {
+ sprintf(buf,"Sorry, you can't %s to the virtual directory, '%s'",
+ cpymode ? "copy" : "move", dstp);
+ ErrPopUp(buf, "\nBummer!");
+ SetCursors(-1);
+ return;
+ }
+ if (Isvdir(srcpath))
+ cpymode = 1;
+#endif
+
/* if there is a thumbnail directory in 'srcpath', make one for dstpath */
sprintf(src,"%s%s", srcpath, THUMBDIR);
dothumbs = 0;
+#ifdef AUTO_EXPAND
+ Dirtovd(src);
+#endif
if (stat(src, &st)==0) {
sprintf(dst,"%s%s", dstp, THUMBDIR);
mkdir(dst, st.st_mode & 07777);
@@ -4712,6 +5269,14 @@
if (overwrite == OWRT_CANCEL) break; /* abort move */
if (j==1) fail++;
+#ifdef AUTO_EXPAND
+ if (!cpymode && j==0)
+ if (Movevdir(src,dst)) {
+ sprintf(buf, "fail to move virturl directory: %s", names[i]);
+ setBrowStr(srcBr, buf);
+ }
+#endif
+
if (dothumbs && j==0) {
sprintf(src,"%s%s/%s", srcpath, THUMBDIR, names[i]);
sprintf(dst,"%s%s/%s", dstp, THUMBDIR, names[i]);
@@ -4749,8 +5314,17 @@
}
+ if (!cpymode) {
+ /* clear all lit files in the source folder (as they've been moved)
+ note: this won't be the optimal behavior if any files failed to
+ move, but screw it, that's not going to happen too often... */
+ for (i=0; ibfLen; i++) srcBr->bfList[i].lit = 0;
+ srcBr->numlit = 0;
+ }
+
+
/* clear all files in the destination folder */
- for (i=0; ibfLen; i++) {
+ for (i=0; ibfLen; i++) {
dstBr->bfList[i].lit = 0;
}
dstBr->numlit = 0;
@@ -4760,10 +5334,10 @@
for (i=0; ibfList;
+ for (j=0, bf=dstBr->bfList;
jbfLen && strcmp(name, bf->name)!=0; j++, bf++);
- if (jbfLen) {
- bf->lit = 1; dstBr->numlit++;
+ if (jbfLen) {
+ bf->lit = 1; dstBr->numlit++;
}
}
@@ -4783,10 +5357,10 @@
changedNumLit(srcBr, -1, 0);
- if (fail) sprintf(buf, "Some files were not %s because of errors.",
+ if (fail) sprintf(buf, "Some files were not %s because of errors.",
cpymode ? "copied" : "moved");
- else if (nlen>1) sprintf(buf, "%d files %s", nlen,
+ else if (nlen>1) sprintf(buf, "%d files %s", nlen,
(cpymode) ? "copied" : "moved");
else buf[0] = '\0';
setBrowStr(srcBr, buf);
@@ -4794,7 +5368,51 @@
SetCursors(-1);
}
+static int recursive_remove(dir)
+ char *dir;
+{
+ DIR *dp = NULL;
+ struct dirent *di;
+ char name[MAXPATHLEN+1];
+
+ strncpy(name, dir, MAXPATHLEN);
+ name[MAXPATHLEN] = 0;
+
+ if (name[strlen(name) - 1] == '/')
+ name[strlen(name) - 1] = 0;
+
+ if ((dp = opendir(name)) == NULL)
+ goto err;
+
+ while ((di = readdir(dp)) != NULL) {
+ char buf[MAXPATHLEN+1];
+ struct stat st;
+
+ if (!strcmp(di->d_name, ".") || !strcmp(di->d_name, ".."))
+ continue;
+
+ snprintf(buf, MAXPATHLEN, "%s/%s", name, di->d_name);
+
+ if (stat(buf, &st) < 0)
+ continue;
+
+ if (S_ISDIR(st.st_mode)) {
+ if (recursive_remove(buf) < 0)
+ goto err;
+ } else
+ unlink(buf);
+ }
+ if (rmdir(name) < 0)
+ goto err;
+
+ closedir(dp);
+ return 0;
+
+err:
+ if (dp) closedir(dp);
+ return -1;
+}
/*************************************************/
static int moveFile(src,dst)
@@ -4809,34 +5427,48 @@
One bit of noise: if destination file exists, pop up a Overwrite?
warning box. */
- int i, srcdir, dstdir;
- struct stat st;
- char buf[512];
- static char *owbuts[4] = { "\nOk", "dDon't ask", "nNo", "\033Cancel" };
+ int i, srcdir, dstdir;
+ struct stat st;
+ char buf[512];
+ static const char *owbuts[] = { "\nOk", "aAlways", "nNo", "NNever", "\033Cancel" };
if (DEBUG) fprintf(stderr,"moveFile %s %s\n", src, dst);
+#ifdef AUTO_EXPAND
+ Dirtosubst(src);
+#endif
+
if (stat(src, &st)) return 0; /* src doesn't exist, it would seem */
+#ifdef AUTO_EXPAND
+ srcdir = (stat2bf((u_int) st.st_mode , src) == BF_DIR);
+#else
srcdir = (stat2bf((u_int) st.st_mode) == BF_DIR);
+#endif
/* see if destination exists */
+
if (stat(dst, &st)==0) {
+ if (overwrite==OWRT_NEVER) return -1;
+#ifdef AUTO_EXPAND
+ dstdir = (stat2bf((u_int) st.st_mode , dst) == BF_DIR);
+#else
dstdir = (stat2bf((u_int) st.st_mode) == BF_DIR);
+#endif
if (overwrite==OWRT_ASK) {
- sprintf(buf, "%s '%s' exists.\n\nOverwrite?",
+ snprintf(buf, sizeof(buf), "%s '%s' exists.\n\nOverwrite?",
dstdir ? "Directory" : "File", dst);
- i = PopUp(buf, owbuts, 4);
-
- if (i==1) overwrite = OWRT_NOASK;
- else if (i==2) return -1;
- else if (i==3) { overwrite = OWRT_CANCEL; return 1; }
+ switch (PopUp(buf, owbuts, COUNT(owbuts))) {
+ case 1: overwrite = OWRT_ALWAYS; break;
+ case 2: return -1;
+ case 3: overwrite = OWRT_NEVER; return -1;
+ case 4: overwrite = OWRT_CANCEL; return 1;
+ }
}
if (dstdir) {
#ifndef VMS /* we don't delete directories in VMS */
- sprintf(buf, "rm -rf %s", dst);
- if (system(buf)) { /* okay, so it's cheating... */
+ if (recursive_remove(dst)) { /* okay, so it's cheating... */
SetISTR(ISTR_WARNING, "Unable to remove directory %s", dst);
return 1;
}
@@ -4848,7 +5480,7 @@
}
}
-
+
if (!rename(src, dst)) return 0; /* Ok */
if (errno != EXDEV) return 1; /* failure, of some sort */
@@ -4859,9 +5491,8 @@
if (i == 0) { /* copied okay, kill the original */
if (srcdir) {
#ifndef VMS /* we don't delete directories in VMS */
- sprintf(buf, "rm -rf %s", src);
- if (system(buf)) { /* okay, so it's cheating... */
- SetISTR(ISTR_WARNING, "Unable to remove directory %s", dst);
+ if (recursive_remove(src)) { /* okay, so it's cheating... */
+ SetISTR(ISTR_WARNING, "Unable to remove directory %s", src);
return 1;
}
#endif /* VMS */
@@ -4896,7 +5527,7 @@
/* possible cases: source is either a file or a directory, or doesn't exist,
destination is either a file, a directory, or doesn't exist.
- if source doesn't exist, nothing to do.
+ if source doesn't exist, nothing to do.
if source is a file:
if dest is a file, popup 'overwriting' question, delete file if ok
if dest is a dir, popup 'overwriting dir' question, delete dir if ok
@@ -4907,38 +5538,51 @@
fall through: if dest doesn't exist, copy the directory, recurs */
- int i, dstExists, srcdir, dstdir;
- struct stat srcSt, dstSt;
- char buf[1024];
- static char *owdiff[3] = { "\nOk", "nNo", "\033Cancel" };
- static char *owsame[4] = { "\nOk", "dDon't Ask", "nNo", "\033Cancel" };
+ int dstExists, srcdir, dstdir;
+ struct stat srcSt, dstSt;
+ char buf[1024];
+ static const char *owdiff[] = { "\nOk", "nNo", "\033Cancel" };
+ static const char *owsame[] = { "\nOk", "aAlways", "nNo", "NNever", "\033Cancel" };
if (DEBUG) fprintf(stderr,"copyFile %s %s\n", src, dst);
+#ifdef AUTO_EXPAND
+ Dirtosubst(src);
+#endif
+
if (stat(src,&srcSt)) return 0; /* source doesn't exist, it would seem */
dstExists = (stat(dst, &dstSt)==0);
if (dstExists) { /* ask about overwriting... */
- srcdir = (stat2bf((u_int) srcSt.st_mode) == BF_DIR);
- dstdir = (stat2bf((u_int) dstSt.st_mode) == BF_DIR);
+#ifdef AUTO_EXPAND
+ srcdir = (stat2bf((u_int) srcSt.st_mode , src) == BF_DIR);
+ dstdir = (stat2bf((u_int) dstSt.st_mode , dst) == BF_DIR);
+#else
+ srcdir = (stat2bf((u_int) srcSt.st_mode) == BF_DIR);
+ dstdir = (stat2bf((u_int) dstSt.st_mode) == BF_DIR);
+#endif
sprintf(buf, "%s '%s' already exists. Replace it with %s '%s'?",
(dstdir) ? "Directory" : "File", dst,
(srcdir) ? "contents of directory" : "file", src);
if (srcdir == dstdir) {
+ if (overwrite==OWRT_NEVER) return -1;
if (overwrite==OWRT_ASK) {
- i = PopUp(buf, owsame, 4);
- if (i==1) overwrite = OWRT_NOASK;
- if (i==2) return -1;
- else if (i==3) { overwrite = OWRT_CANCEL; return 1; }
+ switch (PopUp(buf, owsame, COUNT(owsame))) {
+ case 1: overwrite = OWRT_ALWAYS; break;
+ case 2: return -1;
+ case 3: overwrite = OWRT_NEVER; return -1;
+ case 4: overwrite = OWRT_CANCEL; return 1;
+ }
}
}
else { /* one's a dir, the other's a file. *ALWAYS* ask! */
- i = PopUp(buf, owdiff, 3);
- if (i==1) return -1;
- else if (i==2) { overwrite = OWRT_CANCEL; return 1; }
+ switch (PopUp(buf, owdiff, COUNT(owdiff))) {
+ case 1: return -1;
+ case 2: overwrite = OWRT_CANCEL; return 1;
+ }
}
@@ -4957,7 +5601,7 @@
/* destination doesn't exist no more, if it ever did... */
userMask = umask(0); /* grab the umask */
umask((mode_t) userMask); /* put it back... */
-
+
strcpy(cpSrcPath, src);
strcpy(cpDstPath, dst);
@@ -5017,7 +5661,7 @@
called recursively by cp_dir, there are *no* guarantees that either file
exists or not */
- int i, havedst;
+ int havedst;
struct stat srcSt, dstSt;
if (stat(cpSrcPath, &srcSt)) { /* src doesn't exist, usefully... */
@@ -5036,8 +5680,11 @@
havedst = 1;
}
-
- switch(stat2bf((u_int) srcSt.st_mode)) {
+#ifdef AUTO_EXPAND
+ switch(stat2bf((u_int) srcSt.st_mode , cpDstPath)) {
+#else
+ switch(stat2bf((u_int) srcSt.st_mode)) {
+#endif
/* determine how to copy, by filetype */
/* NOTE: There is no S_IFLNK case here, since we're using 'stat()' and
@@ -5053,18 +5700,22 @@
}
}
else {
+#ifdef AUTO_EXPAND
+ if (stat2bf((u_int) dstSt.st_mode , cpDstPath) != BF_DIR) {
+#else
if (stat2bf((u_int) dstSt.st_mode) != BF_DIR) {
+#endif
SetISTR(ISTR_WARNING,"%s: not a directory", cpDstPath);
copyerr++;
return;
}
}
-
+
cp_dir();
if (!havedst) chmod(cpDstPath, srcSt.st_mode);
-
+
break;
-
+
case BF_CHR:
case BF_BLK: cp_special(&srcSt, havedst); break;
@@ -5089,12 +5740,12 @@
{
int i, dirlen, oldsrclen, olddstlen, longpath;
char **names, *name;
- struct stat srcSt, dstSt;
+ struct stat srcSt;
/* src and dst directories both exists now. copy entries */
- if (DEBUG) fprintf(stderr,"cp_dir: src='%s', dst='%s'\n",
+ if (DEBUG) fprintf(stderr,"cp_dir: src='%s', dst='%s'\n",
cpSrcPath, cpDstPath);
longpath = 0;
@@ -5110,9 +5761,9 @@
for (i=0; i= (MAXPATHLEN-3)) ||
(strlen(name) + olddstlen >= (MAXPATHLEN-3))) {
@@ -5130,12 +5781,17 @@
cpSrcPath[oldsrclen] = '\0';
goto done;
}
-
- if (stat2bf((u_int) srcSt.st_mode) == BF_DIR) {
+
+#ifdef AUTO_EXPAND
+ if (stat2bf((u_int) srcSt.st_mode , cpSrcPath) == BF_DIR)
+#else
+ if (stat2bf((u_int) srcSt.st_mode) == BF_DIR)
+#endif
+ {
cpSrcPath[oldsrclen] = '\0';
continue; /* don't remove from list, just skip */
}
-
+
strcat(cpDstPath, "/");
strcat(cpDstPath, name);
cp(); /* RECURSE */
@@ -5169,7 +5825,7 @@
strcat(cpDstPath, name);
cp(); /* RECURSE */
-
+
cpSrcPath[oldsrclen] = '\0';
cpDstPath[olddstlen] = '\0';
}
@@ -5190,11 +5846,11 @@
int exists;
/*****************************/
{
- register int srcFd, dstFd, rcount, wcount, i;
- char str[512], buf[8192];
- static char *owbuts[4] = { "\nOk", "dDon't Ask", "nNo", "\033Cancel" };
+ register int srcFd, dstFd, rcount, wcount;
+ char buf[8192];
+ static const char *owbuts[] = { "\nOk", "aAlways", "nNo", "NNever", "\033Cancel" };
- if (DEBUG) fprintf(stderr,"cp_file: src='%s', dst='%s'\n",
+ if (DEBUG) fprintf(stderr,"cp_file: src='%s', dst='%s'\n",
cpSrcPath, cpDstPath);
if ((srcFd = open(cpSrcPath, O_RDONLY, 0)) == -1) {
@@ -5204,13 +5860,15 @@
}
if (exists) {
+ if (overwrite==OWRT_NEVER) return;
if (overwrite==OWRT_ASK) {
sprintf(buf, "File '%s' exists.\n\nOverwrite?", cpDstPath);
- i = PopUp(buf, owbuts, 4);
-
- if (i==1) overwrite = OWRT_NOASK;
- else if (i==2) return;
- else if (i==3) { overwrite = OWRT_CANCEL; return; }
+ switch (PopUp(buf, owbuts, 4)) {
+ case 1: overwrite = OWRT_ALWAYS; break;
+ case 2: return;
+ case 3: overwrite = OWRT_NEVER; return;
+ case 4: overwrite = OWRT_CANCEL; return;
+ }
}
dstFd = open(cpDstPath, O_WRONLY|O_TRUNC, 0);
}
@@ -5255,7 +5913,7 @@
int exists;
/*********************************/
{
- if (DEBUG) fprintf(stderr,"cp_spec: src='%s', dst='%s'\n",
+ if (DEBUG) fprintf(stderr,"cp_spec: src='%s', dst='%s'\n",
cpSrcPath, cpDstPath);
if (exists && unlink(cpDstPath)) {
@@ -5281,7 +5939,7 @@
int exists;
/*********************************/
{
- if (DEBUG) fprintf(stderr,"cp_fifo: src='%s', dst='%s'\n",
+ if (DEBUG) fprintf(stderr,"cp_fifo: src='%s', dst='%s'\n",
cpSrcPath, cpDstPath);
#ifdef S_IFIFO
@@ -5302,12 +5960,18 @@
-
+
/*********************************/
+#ifdef AUTO_EXPAND
+static int stat2bf(uistmode, path)
+ u_int uistmode;
+ char *path;
+#else
static int stat2bf(uistmode)
u_int uistmode;
+#endif
{
- /* given the 'st.st_mode' field from a successful stat(), returns
+ /* given the 'st.st_mode' field from a successful stat(), returns
BF_FILE, BF_DIR, BF_BLK, BF_CHR, BF_FIFO, or BF_SOCK. Does *NOT*
return BF_EXE */
@@ -5319,6 +5983,9 @@
else if (S_ISBLK(stmode)) rv = BF_BLK;
else if (S_ISFIFO(stmode)) rv = BF_FIFO;
else if (S_ISSOCK(stmode)) rv = BF_SOCK;
+#ifdef AUTO_EXPAND
+ else if (Isarchive(path)) rv = BF_DIR;
+#endif
else rv = BF_FILE;
return rv;
@@ -5357,8 +6024,8 @@
static int selmatch1(name, arg)
char *name, *arg;
{
- /* returns non-zero if 'name' matches 'arg'. Any '*' chars found in arg
- are considered wildcards that match any number of characters,
+ /* returns non-zero if 'name' matches 'arg'. Any '*' chars found in arg
+ are considered wildcards that match any number of characters,
including zero. */
char *sp, *oldnp;
@@ -5379,7 +6046,7 @@
while (*name) name++;
while (*arg ) arg++;
name--; arg--;
-
+
while (*arg != '*') {
if (*arg != *name || namenext) {
+ if (!strcmp(ptr->name, name)) {
+ ptr->icon = icon;
+ return;
+ }
+ }
+
+ ptr = calloc(sizeof(IVIS), 1);
+ if (!ptr)
+ return;
+ ptr->name = strdup(name);
+
+ if (!ptr->name) {
+ free(ptr);
+ return;
+ }
+
+ if (!prev) {
+ icon_vis_list = ptr;
+ } else {
+ prev->next = ptr;
+ }
+
+ ptr->next = NULL;
+ ptr->icon = icon;
+}
+
+/***************************************************************/
+static void restIconVisible(br)
+ BROWINFO *br;
+{
+ IVIS *ptr;
+
+ for (ptr = icon_vis_list; ptr; ptr = ptr->next) {
+ if (!strcmp(ptr->name, br->path)) {
+ if (ptr->icon >= 0) {
+ makeIconVisible(br, ptr->icon);
+ updateSel(br, ptr->icon, 0, 0);
+ }
+ return;
+ }
+ }
+}
+
+
+/*********************************/
+static void clipChanges(br)
+ BROWINFO *br;
+{
+ /* called whenever schnauzer activity should place file names in
+ the X11 clipboard, or change what it put there.
+
+ Implementation is simple because the UI is non-standard
+ (i.e., not like xterm(1)). The clipboard command causes the
+ current browser to dump all its currently selected files'
+ (if any) names to the clipboard, space-separated.
+ No effort is made to shell-escape blanks and other 'odd'
+ characters in the names. */
+
+ char buf[4000]; /* too much or too little, whatever... */
+ int n;
+ int i;
+
+ n = 0;
+ strcpy(buf, "");
+
+ for (i=0; ibfLen; i++) {
+ if(br->bfList[i].lit == 1) {
+ int m;
+
+ m = strlen(br->bfList[i].name) + 1;
+
+ if(n+m+1 >= sizeof(buf)) return; /* names probably won't fit in buf, abort */
+ strcat(buf, br->bfList[i].name);
+ strcat(buf, " ");
+ n += m;
+ }
+ }
+
+ if(n) {
+ buf[n-1] = 0; /* trim last space */
+
+ NewCutBuffer(buf);
+ }
+}
diff -ru xv-3.10a/xvbutt.c xv-3.10a-enhancements/xvbutt.c
--- xv-3.10a/xvbutt.c 1995-01-03 13:19:51.000000000 -0800
+++ xv-3.10a-enhancements/xvbutt.c 2007-04-15 20:59:15.000000000 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* xvbutt.c - regular, 'radio', 'checkbox', and 'menu' pushbuttons
*
* callable functions:
@@ -16,7 +16,7 @@
* RBSetActive() - sets active status of an RBUTT
* RBClick() - finds clicked-on rb in a list
* RBTrack() - tracks rb after click, until release
- *
+ *
* CBCreate() - create a CBUTT (checkbox button)
* CBRedraw() - redraw a CBUTT
* CBSetActive() - change active status of a CBUTT
@@ -26,7 +26,7 @@
* MBCreate() - create a MBUTT (menu button)
* MBRedraw() - redraw a MBUTT
* MBSetActive() - change active status of a MBUTT
- * MBWhich() - returns # of first checked selection
+ * MBWhich() - returns # of first checked selection
* MBSelect() - similar to RBSelect() ...
* MBClick() - returns true if given MB was clicked on
* MBTrack() - tracks MBUTT after click, until release
@@ -76,7 +76,7 @@
Window win;
int x,y;
unsigned int w,h;
- char *str;
+ const char *str;
unsigned long fg,bg,hi,lo;
{
bp->win = win;
@@ -116,7 +116,7 @@
void BTRedraw(bp)
BUTT *bp;
{
- int i,x,y,r,x1,y1;
+ int x,y,r,x1,y1;
unsigned int w,h;
XPoint tpts[10], bpts[10], ipts[5];
@@ -170,13 +170,13 @@
XSetForeground(theDisp, theGC, bp->fg);
XDrawLines(theDisp, bp->win, theGC, ipts, 5, CoordModeOrigin); /* inset */
- XDrawLine(theDisp, bp->win, theGC, x+1, y + 1,
+ XDrawLine(theDisp, bp->win, theGC, x+1, y + 1,
ipts[0].x, ipts[0].y);
XDrawLine(theDisp, bp->win, theGC, x+1, y + (int) h - 1,
ipts[1].x, ipts[1].y);
XDrawLine(theDisp, bp->win, theGC, x + (int) w - 1, y + (int) h - 1,
ipts[2].x, ipts[2].y);
- XDrawLine(theDisp, bp->win, theGC, x + (int) w - 1, y+1,
+ XDrawLine(theDisp, bp->win, theGC, x + (int) w - 1, y+1,
ipts[3].x, ipts[3].y);
if (bp->lit) {
@@ -184,12 +184,12 @@
XDrawRectangle(theDisp, bp->win, theGC, x+1, y+1, w-2, h-2);
}
}
-
+
else { /* ctrlColor */
XSetForeground(theDisp, theGC, bp->bg);
XFillRectangle(theDisp, bp->win, theGC, x+1, y+1, w-1, h-1);
- Draw3dRect(bp->win, x+1, y+1, w-2, h-2, R3D_OUT, bp->fwidth,
+ Draw3dRect(bp->win, x+1, y+1, w-2, h-2, R3D_OUT, bp->fwidth,
bp->hi, bp->lo, bp->bg);
XSetForeground(theDisp, theGC, bp->fg);
@@ -198,7 +198,7 @@
if (bp->lit)
XDrawRectangle(theDisp, bp->win, theGC, x+1, y+1, w-2, h-2);
}
-
+
@@ -210,7 +210,7 @@
XSetBackground(theDisp, theGC, bp->bg);
- if (bp->colorpix)
+ if (bp->colorpix)
XCopyArea (theDisp,bp->pix, bp->win, theGC, 0,0,bp->pw,bp->ph, x1,y1);
else
XCopyPlane(theDisp,bp->pix, bp->win, theGC, 0,0,bp->pw,bp->ph, x1,y1,1L);
@@ -262,15 +262,15 @@
if (bp->lit==inval && PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) {
bp->lit = !inval; BTRedraw(bp); XFlush(theDisp);
}
-
+
if (bp->lit!=inval && !PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) {
bp->lit = inval; BTRedraw(bp); XFlush(theDisp);
}
}
rval = (bp->lit != inval);
-
- if (bp->lit && !bp->toggle)
+
+ if (bp->lit && !bp->toggle)
{ bp->lit = 0; BTRedraw(bp); XFlush(theDisp); }
return(rval);
@@ -290,18 +290,18 @@
RBUTT *rblist;
Window win;
int x,y;
- char *str;
+ const char *str;
unsigned long fg,bg,hi,lo;
{
/* mallocs an RBUTT, fills in the fields, and appends it to rblist
if rblist is NULL, this is the first rb in the list. It will
- be made the 'selected' one
+ be made the 'selected' one
- Note: no need to check return status. It'll fatal error if it
+ Note: no need to check return status. It'll fatal error if it
can't malloc */
RBUTT *rb, *rbptr;
- Pixmap rb_frame, rb_frame1, rb_top, rb_bot, rb_dtop, rb_dbot, rb_body,
+ Pixmap rb_frame, rb_frame1, rb_top, rb_bot, rb_dtop, rb_dbot, rb_body,
rb_dot;
rb = (RBUTT *) malloc(sizeof(RBUTT));
@@ -348,7 +348,7 @@
rb_off = XCreatePixmap(theDisp, rootW, RBSIZE, RBSIZE, dispDEEP);
rb_off1 = XCreatePixmap(theDisp, rootW, RBSIZE, RBSIZE, dispDEEP);
- if (!rb_frame || !rb_frame1 || !rb_top || !rb_bot || !rb_dtop ||
+ if (!rb_frame || !rb_frame1 || !rb_top || !rb_bot || !rb_dtop ||
!rb_dbot || !rb_body || !rb_dot || !rb_on || !rb_on1 ||
!rb_off || !rb_off1)
FatalError("unable to create radio-button pixmaps");
@@ -410,7 +410,7 @@
XFillRectangle(theDisp, rb_on, theGC, 0,0,RBSIZE,RBSIZE);
XFillRectangle(theDisp, rb_on1, theGC, 0,0,RBSIZE,RBSIZE);
}
-
+
XSetStipple(theDisp, theGC, rb_frame);
XSetForeground(theDisp, theGC, fg);
XFillRectangle(theDisp, rb_on, theGC, 0,0,RBSIZE,RBSIZE);
@@ -437,7 +437,7 @@
return(rb);
}
-
+
@@ -475,23 +475,23 @@
int lit;
{
/* draws the rb being pointed at */
-
+
Pixmap pix;
-
+
if (!rb) return; /* rb = NULL */
-
+
XSetForeground(theDisp, theGC, rb->fg);
-
+
if (rb->selected) { pix = (lit) ? rb_on1 : rb_on; }
else { pix = (lit) ? rb_off1 : rb_off; }
-
+
XCopyArea(theDisp, pix, rb->win, theGC, 0,0,RBSIZE,RBSIZE, rb->x, rb->y);
- DrawString(rb->win, rb->x + RBSIZE + 4,
+ DrawString(rb->win, rb->x + RBSIZE + 4,
rb->y + RBSIZE/2 - CHIGH/2 + ASCENT, rb->str);
if (!rb->active) { /* if non-active, dim button and string */
DimRect(rb->win, rb->x, rb->y, RBSIZE, RBSIZE, rb->bg);
- DimRect(rb->win, rb->x + RBSIZE + 4, rb->y + RBSIZE/2 - CHIGH/2,
+ DimRect(rb->win, rb->x + RBSIZE + 4, rb->y + RBSIZE/2 - CHIGH/2,
(u_int) StringWidth(rb->str), (u_int) CHIGH, rb->bg);
}
}
@@ -527,19 +527,19 @@
}
-
+
/***********************************************/
int RBWhich(rblist)
RBUTT *rblist;
{
int i;
-
+
/* returns index of currently selected rb. if none, returns -1 */
-
+
i = 0;
- while (rblist && !rblist->selected)
+ while (rblist && !rblist->selected)
{ rblist = (RBUTT *) rblist->next; i++; }
-
+
if (!rblist) return -1; /* didn't find one */
return i;
}
@@ -550,9 +550,9 @@
RBUTT *rblist;
{
int i;
-
+
/* returns # of rb's in the list */
-
+
i = 0;
while (rblist) { rblist = (RBUTT *) rblist->next; i++; }
return i;
@@ -566,13 +566,13 @@
{
RBUTT *rb;
int i;
-
+
/* sets 'active' status of rb #n. does redrawing */
-
+
rb=rblist; i=0;
while (rb && i!=n) { rb = (RBUTT *) rb->next; i++; }
if (!rb) return; /* n out of range. do nothing */
-
+
if (rb->active != act) {
rb->active = act;
drawRB(rb, 0);
@@ -588,13 +588,13 @@
int i;
/* searches through rblist to see if mouse click at mx,my is in the
- clickable region of any of the rb's. If it finds one, it returns
+ clickable region of any of the rb's. If it finds one, it returns
it's index in the list. If not, returns -1 */
i = 0;
while (rblist) {
if (PTINRECT(mx, my, rblist->x, rblist->y, RBSIZE, RBSIZE)) break;
-
+
rblist = (RBUTT *) rblist->next;
i++;
}
@@ -613,9 +613,9 @@
Window rW, cW;
int i, x, y, rx, ry, lit, rv;
unsigned int mask;
-
+
/* returns '1' if selection changed */
-
+
rb=rblist; i=0;
while (rb && i!=n) { rb = (RBUTT *) rb->next; i++; }
if (!rb) return 0; /* n out of range */
@@ -637,7 +637,7 @@
drawRB(rb, lit);
XFlush(theDisp);
}
-
+
if (lit && !PTINRECT(x, y, rb->x, rb->y, RBSIZE, RBSIZE)) {
lit=0;
drawRB(rb, lit);
@@ -671,7 +671,7 @@
CBUTT *cb;
Window win;
int x,y;
- char *str;
+ const char *str;
unsigned long fg,bg,hi,lo;
{
/* fill in the fields of the structure */
@@ -690,14 +690,14 @@
do so. We'll be needing them, y'see... */
if (!cbpixmade) {
- cbcheck = XCreatePixmapFromBitmapData(theDisp, rootW,
+ cbcheck = XCreatePixmapFromBitmapData(theDisp, rootW,
(char *) cb_check_bits,
cb_check_width, cb_check_height, fg, bg, dispDEEP);
cbpixmade = 1;
}
}
-
+
@@ -708,25 +708,25 @@
/* draws the cb being pointed at */
XSetForeground(theDisp, theGC, cb->bg);
- XFillRectangle(theDisp, cb->win, theGC, cb->x+2, cb->y+2,
+ XFillRectangle(theDisp, cb->win, theGC, cb->x+2, cb->y+2,
XVCBSIZE-3,XVCBSIZE-3);
XSetForeground(theDisp, theGC, cb->fg);
XDrawRectangle(theDisp, cb->win, theGC, cb->x, cb->y, XVCBSIZE, XVCBSIZE);
Draw3dRect(cb->win, cb->x+1, cb->y+1, XVCBSIZE-2, XVCBSIZE-2, R3D_OUT, 2,
- cb->hi, cb->lo, cb->bg);
+ cb->hi, cb->lo, cb->bg);
- if (cb->val) XCopyArea(theDisp, cbcheck, cb->win, theGC,
- 0, 0, cb_check_width, cb_check_height,
+ if (cb->val) XCopyArea(theDisp, cbcheck, cb->win, theGC,
+ 0, 0, cb_check_width, cb_check_height,
cb->x+3, cb->y+3);
-
+
XSetForeground(theDisp, theGC, cb->fg);
- DrawString(cb->win, cb->x + XVCBSIZE+4,
+ DrawString(cb->win, cb->x + XVCBSIZE+4,
cb->y+XVCBSIZE/2 - CHIGH/2 + ASCENT, cb->str);
if (!cb->active) { /* if non-active, dim button and string */
DimRect(cb->win, cb->x, cb->y, XVCBSIZE, XVCBSIZE, cb->bg);
- DimRect(cb->win, cb->x + XVCBSIZE+4, cb->y+XVCBSIZE/2 - CHIGH/2,
+ DimRect(cb->win, cb->x + XVCBSIZE+4, cb->y+XVCBSIZE/2 - CHIGH/2,
(u_int) StringWidth(cb->str), (u_int) CHIGH, cb->bg);
}
}
@@ -761,7 +761,6 @@
Window rW, cW;
int x, y, rx, ry, lit;
unsigned int mask;
- Pixmap litpix, darkpix;
/* called once we've figured out that the mouse clicked in 'cb' */
@@ -782,7 +781,7 @@
drawCB(cb,lit);
XFlush(theDisp);
}
-
+
if (lit && !PTINRECT(x, y, cb->x, cb->y, XVCBSIZE, XVCBSIZE)) {
lit=0;
drawCB(cb,lit);
@@ -809,28 +808,28 @@
{
/* draws highlighting */
if (lit) {
- if (ctrlColor)
+ if (ctrlColor)
Draw3dRect(cb->win, cb->x+1, cb->y+1, XVCBSIZE-2, XVCBSIZE-2, R3D_IN, 2,
cb->hi, cb->lo, cb->bg);
else {
XSetForeground(theDisp, theGC, cb->fg);
- XDrawRectangle(theDisp, cb->win, theGC, cb->x+1, cb->y+1,
+ XDrawRectangle(theDisp, cb->win, theGC, cb->x+1, cb->y+1,
XVCBSIZE-2, XVCBSIZE-2);
}
}
else {
- if (ctrlColor)
+ if (ctrlColor)
Draw3dRect(cb->win, cb->x+1, cb->y+1, XVCBSIZE-2, XVCBSIZE-2, R3D_OUT, 2,
cb->hi, cb->lo, cb->bg);
else {
XSetForeground(theDisp, theGC, cb->bg);
- XDrawRectangle(theDisp, cb->win, theGC, cb->x+1, cb->y+1,
+ XDrawRectangle(theDisp, cb->win, theGC, cb->x+1, cb->y+1,
XVCBSIZE-2, XVCBSIZE-2);
}
}
}
-
+
/******************* MBUTT ROUTINES ************************/
@@ -838,20 +837,20 @@
/***********************************************/
-void MBCreate(mb, win, x,y,w,h, str, list, nlist, fg, bg, hi, lo)
+void MBCreate(mb, win, x, y, w, h, title, list, nlist, fg, bg, hi, lo)
MBUTT *mb;
Window win;
int x,y;
unsigned int w,h;
- char *str;
- char **list;
+ const char *title;
+ const char * const *list;
int nlist;
unsigned long fg,bg,hi,lo;
{
XSetWindowAttributes xswa;
unsigned long xswamask;
int i;
-
+
if (!mbpixmade) {
mbchk = XCreatePixmapFromBitmapData(theDisp, rootW, (char *) mb_chk_bits,
mb_chk_width, mb_chk_height, fg, bg, dispDEEP);
@@ -865,7 +864,7 @@
mb->y = y;
mb->w = w;
mb->h = h;
- mb->title = str;
+ mb->title = title;
mb->active = 1;
mb->list = list;
mb->nlist = nlist;
@@ -889,7 +888,7 @@
xswa.save_under = True;
xswamask = CWBackPixel | CWBorderPixel | CWSaveUnder;
- mb->mwin = XCreateWindow(theDisp, mb->win, x, y, w, h,
+ mb->mwin = XCreateWindow(theDisp, mb->win, x, y, w, h,
(u_int) 2, (int) dispDEEP, InputOutput,
theVisual, xswamask, &xswa);
@@ -898,7 +897,7 @@
XSelectInput(theDisp, mb->mwin, ExposureMask | VisibilityChangeMask);
XSetTransientForHint(theDisp, mb->mwin, mb->win);
}
-
+
@@ -908,15 +907,15 @@
{
/* draws a menu button in it's normal state. (When it's actively being
used (to select an item), all drawing is handled in MBTrack) */
-
+
int x,y,i,r,x1,y1;
unsigned int w,h;
-
+
r = 2; /* amt of shadow */
x = mb->x; y = mb->y; w = mb->w; h = mb->h;
- x1 = x + (int) w;
+ x1 = x + (int) w;
y1 = y + (int) h;
-
+
XSetForeground(theDisp, theGC, mb->bg);
XFillRectangle(theDisp, mb->win, theGC, x+1, y+1, w-1, h-1);
@@ -940,12 +939,14 @@
XSetBackground(theDisp, theGC, mb->bg);
XCopyPlane(theDisp, mb->pix, mb->win, theGC, 0,0,
(u_int) mb->pw, (u_int) mb->ph, x1,y1, 1L);
- if (!mb->active)
+ if (!mb->active)
DimRect(mb->win, x1,y1, (u_int) mb->pw, (u_int) mb->ph, mb->bg);
}
else { /* draw string centered in butt */
- char *str, stbuf[256];
+ const char *str;
+ char *tmp;
+ char stbuf[256];
if (mb->title) str = mb->title;
else { /* find first checked item, and show that as the title */
@@ -961,7 +962,7 @@
/* truncate at TAB, if any */
strcpy(stbuf, str);
- if ((str = (char *) index(stbuf, '\t')) != NULL) *str = '\0';
+ if ((tmp = (char *) index(stbuf, '\t')) != NULL) *tmp = '\0';
str = stbuf;
x1 = CENTERX(mfinfo, x + w/2, str);
@@ -997,14 +998,14 @@
MBUTT *mb;
{
/* returns index of first checked selection, or '-1' if nothing selected */
-
+
int i;
if (!mb->hascheck) return -1;
for (i=0; inlist; i++)
if (mb->flags[i]) return i;
-
+
return -1;
}
@@ -1017,13 +1018,13 @@
/* makes entry #n the selected entry (ie, the only one with a check mark)
Does all redrawing. Does nothing if entry #n already selected.
Don't let it select 'dim' entries */
-
+
int i;
-
+
if (n<0 || n>mb->nlist) return; /* # out of range */
if (!mb->hascheck) return; /* shouldn't happen */
if (mb->flags[n]) return; /* already selected */
-
+
for (i=0; iflags[i] = 0;
mb->flags[n] = 1;
@@ -1083,7 +1084,7 @@
}
}
mwide += 8; /* extra room at edges */
-
+
/* make wider if any checked menu items */
for (i=0; inlist && !mb->flags[i]; i++);
hascheck = (inlist || mb->hascheck);
@@ -1091,7 +1092,7 @@
if (hascheck && mb->title) mwide += 8;
if (mwide < (mb->w+1)) mwide = mb->w+1; /* at least as wide as button */
-
+
mhigh = mb->nlist * LINEHIGH + 2 + extratop;
mx = mb->x-1; my = mb->y - 1;
@@ -1138,16 +1139,17 @@
y = ASCENT + SPACING + extratop;
for (i=0; inlist; i++) {
char txtstr[256], *tabstr;
+
strcpy(txtstr, mb->list[i]);
if ((tabstr = (char *) index(txtstr, '\t'))) {
*tabstr = '\0'; tabstr++;
}
if (mb->flags[i]) {
- XCopyArea(theDisp, mbchk, win, theGC, 0, 0, mb_chk_width, mb_chk_height,
+ XCopyArea(theDisp, mbchk, win, theGC, 0, 0, mb_chk_width, mb_chk_height,
x - 10, y - 8);
}
-
+
if (!strcmp(mb->list[i], MBSEP)) {
mb->dim[i] = 1; /* don't select this one */
if (ctrlColor) {
@@ -1161,15 +1163,15 @@
XDrawLine(theDisp,win,theGC,4,y-(ASCENT/2)+1, mwide-5, y-(ASCENT/2)+1);
XSetForeground(theDisp, theGC, mb->fg);
}
- else
+ else
XDrawLine(theDisp, win, theGC, 4, y-(ASCENT/2), mwide-5, y-(ASCENT/2));
}
else {
DrawString(win, x, y, txtstr);
- if (tabstr)
+ if (tabstr)
DrawString(win, mwide - mtabwide - 4, y, tabstr);
- if (mb->dim[i])
+ if (mb->dim[i])
DimRect(win, x, y-ASCENT, (u_int) mwide, (u_int) CHIGH, mb->bg);
XSetForeground(theDisp, theGC, mb->fg);
}
diff -ru xv-3.10a/xvcolor.c xv-3.10a-enhancements/xvcolor.c
--- xv-3.10a/xvcolor.c 1995-01-06 11:29:23.000000000 -0800
+++ xv-3.10a-enhancements/xvcolor.c 2007-05-12 13:55:36.000000000 -0700
@@ -52,7 +52,7 @@
int pwide, phigh, *pnumcols;
{
/* operates on 8-bit images. sorts the colormap into 'best' order
- * 'order' is the 'best' order to allocate the colors. 'trans' is a
+ * 'order' is the 'best' order to allocate the colors. 'trans' is a
* transformation to be done to pic, cpic, and epic (in PIC8 mode) to
* compress the colormap
*/
@@ -67,22 +67,22 @@
/* initialize histogram and compute it */
for (i=0; i<256; i++) hist[i]=0;
for (i=pwide*phigh, p=pic; i; i--, p++) hist[*p]++;
-
+
if (DEBUG>1) {
fprintf(stderr,"%s: Desired colormap\n",cmd);
- for (i=0; i<256; i++)
+ for (i=0; i<256; i++)
if (hist[i]) fprintf(stderr,"(%3d %02x,%02x,%02x %d)\n",
i,rmap[i],gmap[i],bmap[i], hist[i]);
fprintf(stderr,"\n\n");
}
-
-
+
+
/* put the actually-used colors into the 'c' array in the order they occur
also, while we're at it, calculate ncols, and close up gaps in
colortable */
-
+
for (i=ncols=0; i<256; i++) {
- if (hist[i]) {
+ if (hist[i]) {
rmap[ncols] = rmap[i];
gmap[ncols] = gmap[i];
bmap[ncols] = bmap[i];
@@ -104,8 +104,8 @@
}
xvbcopy((char *) &c[entry], (char *) &c1[0], sizeof(CMAPENT));
c[entry].use = 0; /* dealt with */
-
-
+
+
/* sort rest of colormap. Half of the entries are allocated on the
basis of distance from already allocated colors, and half on the
basis of usage. (NB: 'taxicab' distance is used throughout this file.)
@@ -116,7 +116,7 @@
To obtain O(n^2) performance, we keep each unselected color
(in c[], with use>0) marked with the minimum distance to any of
the selected colors (in c1[]). Each time we select a color, we
- can update the minimum distances in O(n) time.
+ can update the minimum distances in O(n) time.
mod by Tom Lane Tom.Lane@g.gp.cs.cmu.edu */
@@ -134,8 +134,8 @@
for (j=0, cj=c; juse) { /* this color has not been marked already */
/* update mindist */
- d = (cj->r - ckR)*(cj->r - ckR) +
- (cj->g - ckG)*(cj->g - ckG) +
+ d = (cj->r - ckR)*(cj->r - ckR) +
+ (cj->g - ckG)*(cj->g - ckG) +
(cj->b - ckB)*(cj->b - ckB);
if (cj->mindist > d) cj->mindist = d;
if (cj->mindist > mdist) { mdist = cj->mindist; entry = j; }
@@ -148,8 +148,8 @@
for (j=0, cj=c; juse) { /* this color has not been marked already */
/* update mindist */
- d = (cj->r - ckR)*(cj->r - ckR) +
- (cj->g - ckG)*(cj->g - ckG) +
+ d = (cj->r - ckR)*(cj->r - ckR) +
+ (cj->g - ckG)*(cj->g - ckG) +
(cj->b - ckB)*(cj->b - ckB);
if (cj->mindist > d) cj->mindist = d;
if (cj->use > mdist) { mdist = cj->use; entry = j; }
@@ -162,18 +162,18 @@
xvbcopy((char *) &c[entry], (char *) &c1[i], sizeof(CMAPENT));
c[entry].use = 0;
}
-
+
for (i=0; i1) {
fprintf(stderr,"%s: result of sorting colormap\n",cmd);
- for (i=0; i %d\n", i, order[i]);
fprintf(stderr,"\n");
}
@@ -240,7 +240,7 @@
SetISTR(ISTR_COLOR,"Using %s colormap.",
(haveStdCmap == STD_111 ? "2x2x2" :
haveStdCmap == STD_222 ? "4x4x4" :
- haveStdCmap == STD_232 ? "4x8x4" :
+ haveStdCmap == STD_232 ? "4x8x4" :
haveStdCmap == STD_666 ? "6x6x6" : "8x8x4"));
if (ncols>0) SetISTR(ISTR_COLOR2,stdCmapSuccess);
@@ -251,7 +251,7 @@
for (i=0; i>3) |
+ i332 = ((int)rMap[i]&0xe0) | (((int)gMap[i]&0xe0)>>3) |
(((int)bMap[i]&0xc0)>>6);
cols[i] = stdcols[i332];
@@ -291,7 +291,7 @@
}
else {
- for (i=0; i> 8;
bdisp[c] = defs[c].blue >> 8;
failed[c]= 0;
-
+
/* see if the newly allocated color is new and different */
for (j=0, fcptr=freecols; j0) { /* only do SECOND PASS if there IS a colormap to read */
for (i=0; i>8);
gd = gi - (ctab[j].green>>8);
bd = bi - (ctab[j].blue >>8);
-
+
d = rd*rd + gd*gd + bd*bd;
if (d (size_t) 0) sprintf(tstr, "%s %s", tmp, foo);
@@ -623,7 +623,7 @@
allocROColors();
return;
}
-
+
SetISTR(ISTR_COLOR,"Got %d of %d colors.", nfcols,numcols);
for (i=0; iclass == TrueColor || theVisual->class == DirectColor) {
unsigned long r, g, b, rmask, gmask, bmask, origr, origg, origb;
int rshift, gshift, bshift;
-
- /* shift r,g,b so that high bit of 16-bit color specification is
- * aligned with high bit of r,g,b-mask in visual,
+
+ /* shift r,g,b so that high bit of 16-bit color specification is
+ * aligned with high bit of r,g,b-mask in visual,
* AND each component with its mask,
* and OR the three components together
*/
@@ -781,7 +781,7 @@
" mask=%04lx,%04lx,%04lx pix=%08lx\n",
rmask, gmask, bmask, cdef->pixel);
}
-
+
return 1;
}
else {
@@ -811,7 +811,7 @@
{
int i, j;
- /* if regroup is set, we *must* do a full realloc, as the cols[] array
+ /* if regroup is set, we *must* do a full realloc, as the cols[] array
isn't correct anymore. (cell groupings changed) */
ApplyECctrls(); /* set {r,g,b}cmap[editColor] based on dial settings */
@@ -830,16 +830,16 @@
}
}
-
+
/* do something clever if we're using R/W color and this colorcell isn't
shared */
if (!regroup && allocMode==AM_READWRITE && rwthistime) {
/* let's try to be clever */
- /* determine if the editColor cell is unique, or shared (among
+ /* determine if the editColor cell is unique, or shared (among
non-group members, that is) */
- for (i=j=0; iclass == TrueColor ||
+ if (theVisual->class == TrueColor ||
theVisual->class == DirectColor) desMode = STD_332;
else if (colorMapMode == CM_STDCMAP) desMode = STD_232;
else desMode = STD_222;
@@ -983,9 +983,9 @@
}
- if (DEBUG) fprintf(stderr,"MakeStdCmaps: have=%d, des=%d, ncols=%d\n",
+ if (DEBUG) fprintf(stderr,"MakeStdCmaps: have=%d, des=%d, ncols=%d\n",
haveStdCmap, desMode, ncols);
-
+
if (haveStdCmap != STD_NONE && haveStdCmap == desMode) return 0;
freeStdCmaps();
@@ -997,7 +997,7 @@
for (i=0; i<256; i++) des2got[i] = i;
exactCnt = nearCnt = 0;
-
+
if (desMode == STD_111) { /* try to alloc 8 colors */
/* generate a 1/1/1 desired colormap */
maplen = 8;
@@ -1009,7 +1009,7 @@
bmap[i] = (b*255);
}
}
-
+
else if (desMode == STD_222) { /* try to alloc 64 colors */
/* generate a 2/2/2 desired colormap */
maplen = 64;
@@ -1021,7 +1021,7 @@
bmap[i] = (b*255)/3;
}
}
-
+
else if (desMode == STD_232) { /* try to alloc 128 colors */
/* generate a 2/3/2 desired colormap */
maplen = 128;
@@ -1033,7 +1033,7 @@
bmap[i] = (b*255)/3;
}
}
-
+
else if (desMode == STD_666) { /* try to alloc 216 colors */
/* generate a 6*6*6 desired colormap */
maplen = 216;
@@ -1045,14 +1045,14 @@
bmap[i] = (b*255)/5;
}
}
-
+
else { /* desMode == STD_332 */
maplen = 256;
for (i=0; i0) {
for (i=0; i>8);
gd = gmap[i] - (ctab[j].green>>8);
bd = bmap[i] - (ctab[j].blue >>8);
-
+
d = CDIST(rd, gd, bd);
if (d 1) {
fprintf(stderr,"MakeStdCmaps: ncols=%d maplen=%d\n", ncols, maplen);
fprintf(stderr," std*[]= ");
- for (i=0; i<256; i++)
+ for (i=0; i<256; i++)
fprintf(stderr,"%02x,%02x,%02x ",stdr[i],stdg[i],stdb[i]);
fprintf(stderr,"\n\n");
fprintf(stderr," disp[]= ");
- for (i=0; i<256; i++)
+ for (i=0; i<256; i++)
fprintf(stderr,"%02x,%02x,%02x ",stdrdisp[i],stdgdisp[i],stdbdisp[i]);
fprintf(stderr,"\n\n");
fprintf(stderr," stdcols[]= ");
- for (i=0; i<256; i++)
+ for (i=0; i<256; i++)
fprintf(stderr,"%02lx ",stdcols[i]);
fprintf(stderr,"\n\n");
fprintf(stderr," stdfreecols[%d] = ", stdnfcols);
- for (i=0; i0)
- sprintf(stdCmapSuccess, "Got %d out of %d colors. (%d close color%s)",
+ if (nearCnt>0)
+ sprintf(stdCmapSuccess, "Got %d out of %d colors. (%d close color%s)",
exactCnt, maplen, nearCnt, (nearCnt>1) ? "s" : "");
else
sprintf(stdCmapSuccess, "Got %d out of %d colors.", exactCnt, maplen);
@@ -1292,11 +1292,11 @@
/* This function should only be called once, at the start of the program.
*
* produces many things:
- * browR,browG,browB[256]
+ * browR,browG,browB[256]
* - a 3/3/2 colormap used by genIcon
* browcols[256] - maps 3/3/2 values into X colors
* browCmap - local cmap used in browse window, if browPerfect
- */
+ */
int i,j,r,g,b, screwed, num, exactCnt, nearCnt;
XColor def;
@@ -1306,8 +1306,8 @@
long d, mind;
- if (DEBUG)
- fprintf(stderr,"MakeBrowCmap: perfect = %d, ncols = %d\n",
+ if (DEBUG)
+ fprintf(stderr,"MakeBrowCmap: perfect = %d, ncols = %d\n",
browPerfect, ncols);
if (ncols == 0 || !CMAPVIS(theVisual)) browPerfect = 0;
@@ -1350,7 +1350,7 @@
def.red = rmap[order[i]] << 8;
def.green = gmap[order[i]] << 8;
def.blue = bmap[order[i]] << 8;
-
+
def.flags = DoRed | DoGreen | DoBlue;
if (xvAllocColor(theDisp, browCmap, &def)) { /* success */
@@ -1358,14 +1358,14 @@
descols[order[i]] = def.pixel;
if (DEBUG>1)
- fprintf(stderr,"makebrowcmap: Phase 1: Alloc %x,%x,%x succeeded!\n",
+ fprintf(stderr,"makebrowcmap: Phase 1: Alloc %x,%x,%x succeeded!\n",
rmap[order[i]], gmap[order[i]], bmap[order[i]]);
}
else failed[order[i]] = 1;
}
-
- /* PHASE 2: map remaining unallocated colors into closest we got */
+
+ /* PHASE 2: map remaining unallocated colors into closest we got */
for (i=0; i<256; i++) {
if (failed[i]) {
@@ -1377,9 +1377,9 @@
if (d1)
- fprintf(stderr,"makebrowcmap: closest to %x,%x,%x = %x,%x,%x\n",
+ fprintf(stderr,"makebrowcmap: closest to %x,%x,%x = %x,%x,%x\n",
rmap[i],gmap[i],bmap[i], rmap[num], gmap[num], bmap[num]);
if (failed[num]) screwed = 1;
@@ -1406,7 +1406,7 @@
byte *rmap, *gmap, *bmap, *order;
int maplen;
{
- /* takes a colormap (maxlen 256) and produces an order array that
+ /* takes a colormap (maxlen 256) and produces an order array that
contains the most-diverse order for allocating these colors */
int dist[256], i, pick, maxv, ocnt, d;
@@ -1422,7 +1422,7 @@
ocnt = 0;
order[ocnt++] = pick;
-
+
/* init dist[] array */
for (i=0; i8",
- "Slow 24->8",
- "Best 24->8" };
-
-static char *algMList[] = { "Undo All\t\244u",
- MBSEP,
- "Blur...\t\244b",
- "Sharpen...\t\244s",
- "Edge Detect\t\244e",
- "Emboss\t\244m",
- "Oil Painting\t\244o",
- "Blend\t\244B",
- "Copy Rotate...\t\244t",
- "Clear Rotate...\t\244T",
- "Pixelize...\t\244p",
- "Spread...\t\244S",
- "DeSpeckle...\t\244k"};
-
-static char *sizeMList[] = { "Normal\tn",
- "Max Size\tm",
- "Maxpect\tM",
- "Double Size\t>",
- "Half Size\t<",
- "10% Larger\t.",
- "10% Smaller\t,",
- MBSEP,
- "Set Size\tS",
- "Re-Aspect\ta",
- "4x3\t4",
- "Int. Expand\tI" };
-
-static char *windowMList[] = { "Visual Schnauzer\t^v",
- "Color Editor\te",
- "Image Info\ti",
- "Image Comments\t^c",
- "Text View\t^t",
- MBSEP,
- "About XV\t^a",
- "XV Keyboard Help"};
+static const char *dispMList[] = { "Raw\tr",
+ "Dithered\td",
+ "Smooth\ts",
+ MBSEP,
+ "Read/Write Colors",
+ MBSEP,
+ "Normal Colors",
+ "Perfect Colors",
+ "Use Own Colormap",
+ "Use Std. Colormap" };
+
+static const char *rootMList[] = { "Window",
+ "Root: tiled",
+ "Root: integer tiled",
+ "Root: mirrored",
+ "Root: integer mirrored",
+ "Root: center tiled",
+ "Root: centered",
+ "Root: centered, warp",
+ "Root: centered, brick",
+ "Root: symmetrical tiled",
+ "Root: symmetrical mirrored",
+ "Root: upper left corner" };
+
+static const char *conv24MList[] = { "8-bit mode\t\2448",
+ "24-bit mode\t\2448",
+ MBSEP,
+ "Lock current mode",
+ MBSEP,
+ "Quick 24->8",
+ "Slow 24->8",
+ "Best 24->8" };
+
+static const char *algMList[] = { "Undo All\t\244u",
+ MBSEP,
+ "Blur...\t\244b",
+ "Sharpen...\t\244s",
+ "Edge Detect\t\244e",
+ "Emboss\t\244m",
+ "Oil Painting\t\244o",
+ "Blend\t\244B",
+ "Copy Rotate...\t\244t",
+ "Clear Rotate...\t\244T",
+ "Pixelize...\t\244p",
+ "Spread...\t\244S",
+ "DeSpeckle...\t\244k"};
+
+static const char *sizeMList[] = { "Normal\tn",
+ "Max Size\tm",
+ "Maxpect\tM",
+ "Double Size\t>",
+ "Half Size\t<",
+ "10% Larger\t.",
+ "10% Smaller\t,",
+ MBSEP,
+ "Set Size\tS",
+ "Re-Aspect\ta",
+ "4x3\t4",
+ "Int. Expand\tI" };
+
+static const char *windowMList[] = { "Visual Schnauzer\t^v",
+ "Color Editor\te",
+ "Image Info\ti",
+ "Image Comments\t^c",
+ "Text View\t^t",
+ MBSEP,
+ "About XV\t^a",
+ "XV Keyboard Help"};
@@ -157,14 +161,14 @@
/***************************************************/
void CreateCtrl(geom)
- char *geom;
+ const char *geom;
{
- int i, listh, topskip;
+ int listh, topskip;
double skip;
XSetWindowAttributes xswa;
Pixmap oicon1Pix, oicon2Pix;
- ctrlW = CreateWindow("xv controls", "XVcontrols", geom,
+ ctrlW = CreateWindow("xv controls", "XVcontrols", geom,
CTRLWIDE, CTRLHIGH, infofg, infobg, 0);
if (!ctrlW) FatalError("can't create controls window!");
@@ -205,10 +209,10 @@
oicon2Pix = MakePix1(ctrlW, oicon2_bits, oicon2_width, oicon2_height);
if (!grayTile || !dimStip || !fifoPix || !chrPix || !dirPix ||
- !blkPix || !lnkPix || !regPix || !rotlPix || !fliphPix ||
+ !blkPix || !lnkPix || !regPix || !rotlPix || !fliphPix ||
!flipvPix || !p10Pix || !m10Pix || !cutPix || !copyPix ||
!pastePix || !clearPix || !uiconPix || !oiconPix || !oicon1Pix ||
- !oicon2Pix || !padPix || !annotPix)
+ !oicon2Pix || !padPix || !annotPix)
FatalError("unable to create all pixmaps in CreateCtrl()\n");
@@ -226,7 +230,7 @@
XFreePixmap(theDisp, oicon1Pix);
XFreePixmap(theDisp, oicon2Pix);
-
+
if (ctrlColor) XSetWindowBackground(theDisp, ctrlW, locol);
else XSetWindowBackgroundPixmap(theDisp, ctrlW, grayTile);
@@ -234,7 +238,7 @@
listh = LINEHIGH * NLINES;
LSCreate(&nList, ctrlW, 5, 52, (CTRLWIDE-BUTTW-18),
- LINEHIGH*NLINES, NLINES, dispnames, numnames,
+ LINEHIGH*NLINES, NLINES, dispnames, numnames,
infofg, infobg, hicol, locol, RedrawNList, 0, 0);
nList.selected = 0; /* default to first name selected */
@@ -245,8 +249,8 @@
topskip = nList.y;
skip = ((double) (nList.h - (CHIGH+5))) / 6.0;
- if (skip > SBUTTH+8) {
- skip = SBUTTH + 7;
+ if (skip > SBUTTH+8) {
+ skip = SBUTTH + 7;
topskip = nList.y + (nList.h - (6*skip + (CHIGH+5))) / 2;
}
@@ -258,7 +262,7 @@
#define R_BY3 (topskip + (int)(3*skip))
#define R_BY4 (topskip + (int)(4*skip))
#define R_BY5 (topskip + (int)(5*skip))
-
+
BTCreate(&but[BNEXT], ctrlW, R_BX0, R_BY0, R_BW1, SBUTTH, "Next", BCLS);
BTCreate(&but[BPREV], ctrlW, R_BX0, R_BY1, R_BW1, SBUTTH, "Prev", BCLS);
BTCreate(&but[BLOAD], ctrlW, R_BX0, R_BY2, R_BW1, SBUTTH, "Load", BCLS);
@@ -309,7 +313,7 @@
BTCreate(&but[BABOUT], ctrlW,BX4, BY1,BUTTW,BUTTH,"About XV",BCLS);
BTCreate(&but[BQUIT], ctrlW,BX5, BY1,BUTTW,BUTTH,"Quit", BCLS);
- BTCreate(&but[BXV], ctrlW,5,5, 100, (u_int) nList.y - 5 - 2 - 5,
+ BTCreate(&but[BXV], ctrlW,5,5, 100, (u_int) nList.y - 5 - 2 - 5,
"", BCLS);
SetButtPix(&but[BCOPY], copyPix, copy_width, copy_height);
@@ -329,7 +333,7 @@
if (ctrlColor) {
SetButtPix(&but[BXV], oiconPix, oicon1_width, oicon1_height);
but[BXV].colorpix = 1;
- }
+ }
else SetButtPix(&but[BXV], iconPix, icon_width, icon_height);
#else
SetButtPix(&but[BXV], uiconPix, uicon_width, uicon_height);
@@ -338,21 +342,21 @@
XMapSubwindows(theDisp, ctrlW);
- /* have to create menu buttons after XMapSubWindows, as we *don't* want
+ /* have to create menu buttons after XMapSubWindows, as we *don't* want
the popup menus mapped */
- MBCreate(&dispMB, ctrlW, CTRLWIDE - 8 - 112 - 2*(112+2), 5,112,19,
+ MBCreate(&dispMB, ctrlW, CTRLWIDE - 8 - 112 - 2*(112+2), 5,112,19,
"Display", dispMList, DMB_MAX, BCLS);
- MBCreate(&conv24MB, ctrlW, CTRLWIDE - 8 - 112 - (112+2), 5,112,19,
+ MBCreate(&conv24MB, ctrlW, CTRLWIDE - 8 - 112 - (112+2), 5,112,19,
"24/8 Bit", conv24MList, CONV24_MAX, BCLS);
- MBCreate(&algMB, ctrlW, CTRLWIDE - 8 - 112, 5,112,19,
+ MBCreate(&algMB, ctrlW, CTRLWIDE - 8 - 112, 5,112,19,
"Algorithms", algMList, ALG_MAX, BCLS);
- MBCreate(&rootMB, ctrlW, CTRLWIDE - 8 - 112 - 2*(112+2), 5+21,112,19,
+ MBCreate(&rootMB, ctrlW, CTRLWIDE - 8 - 112 - 2*(112+2), 5+21,112,19,
"Root", rootMList, RMB_MAX, BCLS);
- MBCreate(&windowMB, ctrlW, CTRLWIDE - 8 - 112 - (112+2), 5+21,112,19,
+ MBCreate(&windowMB, ctrlW, CTRLWIDE - 8 - 112 - (112+2), 5+21,112,19,
"Windows", windowMList, WMB_MAX, BCLS);
- MBCreate(&sizeMB, ctrlW, CTRLWIDE - 8 - 112, 5+21,112,19,
+ MBCreate(&sizeMB, ctrlW, CTRLWIDE - 8 - 112, 5+21,112,19,
"Image Size", sizeMList, SZMB_MAX, BCLS);
@@ -395,7 +399,7 @@
byte *bits;
int w,h;
{
- return XCreatePixmapFromBitmapData(theDisp, win, (char *) bits,
+ return XCreatePixmapFromBitmapData(theDisp, win, (char *) bits,
(u_int) w, (u_int) h, 1L,0L,1);
}
@@ -404,7 +408,7 @@
void CtrlBox(vis)
int vis;
{
- if (vis) XMapRaised(theDisp, ctrlW);
+ if (vis) XMapRaised(theDisp, ctrlW);
else XUnmapWindow(theDisp, ctrlW);
ctrlUp = vis;
@@ -416,7 +420,6 @@
int x,y,w,h;
{
int i;
- XRectangle xr;
RANGE(w, 0, CTRLWIDE);
RANGE(h, 0, CTRLHIGH);
@@ -452,7 +455,7 @@
/***************************************************/
void DrawCtrlNumFiles()
{
- int x,y,w,h;
+ int x,y,w;
char foo[40];
x = but[BNEXT].x;
@@ -463,14 +466,14 @@
XSetBackground(theDisp, theGC, infobg);
sprintf(foo, "%d file%s", numnames, (numnames==1) ? "" : "s");
-
+
XSetForeground(theDisp, theGC, infobg);
XFillRectangle(theDisp,ctrlW, theGC, x+1,y+1, (u_int) w-1, (u_int) CHIGH+5);
XSetForeground(theDisp,theGC,infofg);
XDrawRectangle(theDisp,ctrlW, theGC, x,y, (u_int) w, (u_int) CHIGH+6);
- Draw3dRect(ctrlW, x+1,y+1, (u_int) w-2, (u_int) CHIGH+4,
+ Draw3dRect(ctrlW, x+1,y+1, (u_int) w-2, (u_int) CHIGH+4,
R3D_IN, 2, hicol, locol, infobg);
XSetForeground(theDisp,theGC,infofg);
@@ -489,7 +492,7 @@
st1 = GetISTR(ISTR_WARNING);
XSetForeground(theDisp, theGC, infobg);
- XFillRectangle(theDisp, ctrlW, theGC, 0, y+1,
+ XFillRectangle(theDisp, ctrlW, theGC, 0, y+1,
CTRLWIDE, (u_int)((CHIGH+4)*2+1));
XSetForeground(theDisp, theGC, infofg);
@@ -501,7 +504,7 @@
XSetForeground(theDisp, theGC, locol);
XDrawLine(theDisp, ctrlW, theGC, 0, y+1, CTRLWIDE, y+1);
XDrawLine(theDisp, ctrlW, theGC, 0, y+CHIGH+5, CTRLWIDE, y+CHIGH+5);
- XDrawLine(theDisp, ctrlW, theGC, 0, y+(CHIGH+4)*2+1,
+ XDrawLine(theDisp, ctrlW, theGC, 0, y+(CHIGH+4)*2+1,
CTRLWIDE, y+(CHIGH+4)*2+1);
}
@@ -542,16 +545,16 @@
void ScrollToCurrent(lst)
LIST *lst;
{
- /* called when selected item on list is changed. Makes the selected
+ /* called when selected item on list is changed. Makes the selected
item visible. If it already is, nothing happens. Otherwise, it
- attempts to scroll so that the selection appears in the middle of
+ attempts to scroll so that the selection appears in the middle of
the list window */
int halfway;
if (lst->selected < 0) return; /* no selection, do nothing */
- if (lst->selected > lst->scrl.val &&
+ if (lst->selected > lst->scrl.val &&
lst->selected < lst->scrl.val + lst->nlines-1) LSRedraw(lst, 0);
else {
halfway = (lst->nlines)/2; /* offset to the halfway pt. of the list */
@@ -590,7 +593,7 @@
lp->win = XCreateSimpleWindow(theDisp,win,x,y,(u_int) w, (u_int) h,1,fg,bg);
if (!lp->win) FatalError("can't create list window!");
- lp->x = x; lp->y = y;
+ lp->x = x; lp->y = y;
lp->w = w; lp->h = h;
lp->fg = fg; lp->bg = bg;
lp->hi = hi; lp->lo = lo;
@@ -603,7 +606,7 @@
XSelectInput(theDisp, lp->win, ExposureMask | ButtonPressMask);
- SCCreate(&lp->scrl, lp->win, w-20, -1, 1, h, 0,
+ SCCreate(&lp->scrl, lp->win, w-20, -1, 1, h, 0,
nstr-nlines, 0, nlines-1, fg, bg, hi, lo, fptr);
XMapSubwindows(theDisp, lp->win);
@@ -646,7 +649,7 @@
LIST *lp;
{
/* redraws lists 3d-effect, which can be trounced by drawSel() */
- Draw3dRect(lp->win, 0, 0, lp->w-1, lp->h-1, R3D_IN, 2,
+ Draw3dRect(lp->win, 0, 0, lp->w-1, lp->h-1, R3D_IN, 2,
lp->hi, lp->lo, lp->bg);
}
@@ -675,43 +678,43 @@
else { fg = lp->fg; bg = lp->bg; }
XSetForeground(theDisp, theGC, bg);
- XFillRectangle(theDisp, lp->win, theGC, x0, y0+i*LINEHIGH,
+ XFillRectangle(theDisp, lp->win, theGC, x0, y0+i*LINEHIGH,
(u_int) wide+1, (u_int) LINEHIGH);
if (j>=0 && jnstr) { /* only draw string if valid */
XSetForeground(theDisp, theGC, fg);
XSetBackground(theDisp, theGC, bg);
- if (!lp->filetypes)
+ if (!lp->filetypes)
DrawString(lp->win, x0+3, y0+i*LINEHIGH + ASCENT + 1, lp->str[j]);
else {
int ypos = y0 + i*LINEHIGH + (LINEHIGH - i_fifo_height)/2;
- if (lp->str[j][0] == C_FIFO)
+ if (lp->str[j][0] == C_FIFO)
XCopyPlane(theDisp, fifoPix, lp->win, theGC, 0, 0,
i_fifo_width, i_fifo_height, x0+3, ypos, 1L);
- else if (lp->str[j][0] == C_CHR)
+ else if (lp->str[j][0] == C_CHR)
XCopyPlane(theDisp, chrPix, lp->win, theGC, 0, 0,
i_chr_width, i_chr_height, x0+3, ypos, 1L);
- else if (lp->str[j][0] == C_DIR)
+ else if (lp->str[j][0] == C_DIR)
XCopyPlane(theDisp, dirPix, lp->win, theGC, 0, 0,
i_dir_width, i_dir_height, x0+3, ypos, 1L);
- else if (lp->str[j][0] == C_BLK)
+ else if (lp->str[j][0] == C_BLK)
XCopyPlane(theDisp, blkPix, lp->win, theGC, 0, 0,
i_blk_width, i_blk_height, x0+3, ypos, 1L);
- else if (lp->str[j][0] == C_LNK)
+ else if (lp->str[j][0] == C_LNK)
XCopyPlane(theDisp, lnkPix, lp->win, theGC, 0, 0,
i_lnk_width, i_lnk_height, x0+3, ypos, 1L);
- else if (lp->str[j][0] == C_SOCK)
+ else if (lp->str[j][0] == C_SOCK)
XCopyPlane(theDisp, sockPix, lp->win, theGC, 0, 0,
i_sock_width, i_sock_height, x0+3, ypos, 1L);
- else if (lp->str[j][0] == C_EXE)
+ else if (lp->str[j][0] == C_EXE)
XCopyPlane(theDisp, exePix, lp->win, theGC, 0, 0,
i_exe_width, i_exe_height, x0+3, ypos, 1L);
@@ -720,8 +723,8 @@
i_reg_width, i_reg_height, x0+3, ypos, 1L);
- DrawString(lp->win, x0+3 + i_fifo_width + 3,
- y0+i*LINEHIGH + ASCENT + 1,
+ DrawString(lp->win, x0+3 + i_fifo_width + 3,
+ y0+i*LINEHIGH + ASCENT + 1,
lp->str[j]+1);
}
}
@@ -735,7 +738,7 @@
{
int i;
- for (i = lp->scrl.val; i < lp->scrl.val + lp->nlines; i++)
+ for (i = lp->scrl.val; i < lp->scrl.val + lp->nlines; i++)
drawSel(lp,i);
ls3d(lp);
}
@@ -762,7 +765,7 @@
if (sel >= lp->nstr) sel = lp->selected;
/* see if it's a double click */
- if (ev->time - lasttime < DBLCLKTIME && sel==lastsel
+ if (ev->time - lasttime < DBLCLKTIME && sel==lastsel
&& (lp->scrl.val + (y-y0)/LINEHIGH) < lp->nstr
&& !INACTIVE(lp,sel)) {
return (sel);
@@ -782,7 +785,7 @@
while (XQueryPointer(theDisp,lp->win,&rW,&cW,&rx,&ry,&x,&y,&mask)) {
if (!(mask & Button1Mask)) break; /* button released */
- if (yscrl.val > lp->scrl.min) {
lp->selected = lp->scrl.val - 1;
SCSetVal(&lp->scrl, lp->scrl.val - 1);
@@ -804,7 +807,7 @@
if (sel >= lp->nstr) sel = lp->nstr - 1;
if (sel != lp->selected && sel >= lp->scrl.val &&
- sel < lp->scrl.val + lp->nlines) {
+ sel < lp->scrl.val + lp->nlines) {
/* dragged to another on current page */
oldsel = lp->selected;
lp->selected = sel;
@@ -829,17 +832,17 @@
else if (key==LS_PAGEDOWN) SCSetVal(&lp->scrl,lp->scrl.val + (lp->nlines-1));
else if (key==LS_HOME) SCSetVal(&lp->scrl,lp->scrl.min);
else if (key==LS_END) SCSetVal(&lp->scrl,lp->scrl.max);
-
+
else if (key==LS_LINEUP) {
/* if the selected item visible, but not the top line */
- if (lp->selected > lp->scrl.val &&
+ if (lp->selected > lp->scrl.val &&
lp->selected <= lp->scrl.val + lp->nlines - 1) {
/* then just move it */
lp->selected--;
drawSel(lp, lp->selected); drawSel(lp, lp->selected+1);
ls3d(lp);
}
-
+
/* if it's the top line... */
else if (lp->selected == lp->scrl.val) {
if (lp->selected > 0) {
@@ -847,7 +850,7 @@
SCSetVal(&lp->scrl, lp->selected);
}
}
-
+
/* if it's not visible, put it on the bottom line */
else {
lp->selected = lp->scrl.val + lp->nlines - 1;
@@ -856,10 +859,10 @@
ls3d(lp);
}
}
-
+
else if (key==LS_LINEDOWN) {
/* if the selected item visible, but not the bottom line */
- if (lp->selected >= lp->scrl.val &&
+ if (lp->selected >= lp->scrl.val &&
lp->selected < lp->scrl.val + lp->nlines - 1) {
if (lp->selected < lp->nstr-1) {
/* then just move it */
@@ -868,7 +871,7 @@
ls3d(lp);
}
}
-
+
/* if it's the bottom line... */
else if (lp->selected == lp->scrl.val + lp->nlines - 1) {
if (lp->selected < lp->nstr-1) {
@@ -876,7 +879,7 @@
SCSetVal(&lp->scrl, lp->scrl.val+1);
}
}
-
+
/* if it's not visible, put it on the top line */
else {
lp->selected = lp->scrl.val;
diff -ru xv-3.10a/xvcut.c xv-3.10a-enhancements/xvcut.c
--- xv-3.10a/xvcut.c 1995-01-13 11:55:48.000000000 -0800
+++ xv-3.10a-enhancements/xvcut.c 2007-04-15 15:02:32.000000000 -0700
@@ -15,7 +15,7 @@
* static void clearSelectedArea();
* static void makeClipFName ();
* static int countcols24 (byte *, int,int, int,int,int,int));
- * static int countNewCols (byte*, int, int, byte*, int,
+ * static int countNewCols (byte*, int, int, byte*, int,
* int, int, int, int);
*
* void InitSelection ();
@@ -72,7 +72,7 @@
static void clearSelectedArea PARM((void));
static void makeClipFName PARM((void));
static int countcols24 PARM((byte *, int, int, int, int, int, int));
-static int countNewCols PARM((byte *, int, int, byte *, int,
+static int countNewCols PARM((byte *, int, int, byte *, int,
int, int, int, int));
static int dragHandle PARM((XButtonEvent *));
static void dragSelection PARM((XButtonEvent *, u_int, int));
@@ -210,7 +210,7 @@
if (!PasteAllowed()) { XBell(theDisp, 0); return; }
cimg = getFromClip();
- if (!cimg) return;
+ if (!cimg) return;
/* if there's no selection, make one! */
if (!HaveSelection()) makePasteSel(cimg);
@@ -231,7 +231,7 @@
byte *dp, *dpic, *clippic, *clipcmap;
int clipw, cliph, clipis24, len, istran, trval;
- int i, j, sx,sy,sw,sh, cx,cy,cw,ch, dx,dy,dw,dh,dx2,dy2;
+ int i, j, sx,sy,sw,sh, cx,cy,cw,ch, dx,dy,dw,dh;
/*
@@ -245,7 +245,7 @@
((int) (cimg[CIMG_LEN + 2]<<16)) |
((int) (cimg[CIMG_LEN + 3]<<24));
- if (len < CIMG_PIC24) return;
+ if (len < CIMG_PIC24) return;
istran = cimg[CIMG_TRANS];
trval = cimg[CIMG_TRVAL];
@@ -268,7 +268,7 @@
* already, because if we *are*, we'd prefer to do any clipboard rescaling
* in 24-bit space for the obvious reasons.
*
- * possibilities:
+ * possibilities:
* PIC24 - easy, do clipboard rescale in 24-bit space
* PIC8, and clipboard is 8 bits, (or 24-bits, but with <=256 colors)
* and total unique colors < 256:
@@ -283,7 +283,7 @@
/* dx,dy,dw,dh is the rectangle (in PIC coords) where the paste will occur
(cropped to be entirely within PIC */
-
+
dx = sx; dy = sy; dw = sw; dh = sh;
CropRect2Rect(&dx, &dy, &dw, &dh, 0, 0, pWIDE, pHIGH);
@@ -291,7 +291,7 @@
/* cx,cy,cw,ch is the rectangle of the clipboard data (in clipboard coords)
that will actually be used in the paste operation */
- cx = (sx>=0) ? 0 : ((-sx) * clipw) / sw;
+ cx = (sx>=0) ? 0 : ((-sx) * clipw) / sw;
cy = (sy>=0) ? 0 : ((-sy) * cliph) / sh;
cw = (dw * clipw) / sw;
ch = (dh * cliph) / sh;
@@ -302,27 +302,29 @@
if (picType == PIC8) {
int ncc, keep8;
char buf[512];
-
+
if (clipis24) { /* pasting in a 24-bit image that *requires* promotion */
- static char *bnames[] = { "\nOkay", "\033Cancel" };
+ static const char *labels[] = { "\nOkay", "\033Cancel" };
+
strcpy(buf, "Warning: Pasting this 24-bit image will require ");
strcat(buf, "promoting the current image to 24 bits.");
-
- if (PopUp(buf, bnames, 2)) goto exit; /* Cancelled */
+
+ if (PopUp(buf, labels, 2)) goto exit; /* Cancelled */
else Change824Mode(PIC24); /* promote pic to 24 bits */
}
else { /* clip is 8 bits */
ncc = countNewCols(clippic,clipw,cliph,clipcmap,clipis24,cx,cy,cw,ch);
-
+
if (ncc + numcols > 256) {
- static char *bnames[] = { "\nPromote", "8Keep 8-bit", "\033Cancel" };
+ static const char *labels[] = { "\nPromote", "8Keep 8-bit", "\033Cancel" };
+
strcpy(buf,"Warning: The image and the clipboard combine to have ");
strcat(buf,"more than 256 unique colors. Promoting the ");
strcat(buf,"image to 24 bits is recommended, otherwise the contents ");
strcat(buf,"of the clipboard will probably lose some colors.");
-
- keep8 = PopUp(buf, bnames, 3);
+
+ keep8 = PopUp(buf, labels, 3);
if (keep8==2) goto exit; /* Cancel */
else if (keep8==0) Change824Mode(PIC24); /* promote pic to 24 bits */
}
@@ -331,8 +333,8 @@
-
-
+
+
/* legal possibilities at this point:
* pic is PIC24: clip is 8 or 24
* pic is PIC8: clip is 8, or clip is 24 but has 256 or fewer colors
@@ -342,18 +344,18 @@
if (picType == PIC8) {
int clx, cly, r,g,b,k,mind,close,newcols;
- byte *cp, *clp, *pp, *ccp, newr[256], newg[256], newb[256], remap[256];
+ byte *cp, *clp, *pp, newr[256], newg[256], newb[256], remap[256];
byte order[256], trans[256];
int bperpix, dpncols;
-
+
dpic = (byte *) malloc((size_t) dw * dh);
if (!dpic) FatalError("Out of memory in DoImgPaste()\n");
-
+
bperpix = (clipis24) ? 3 : 1;
newcols = 0;
-
+
/* dpic = a scaled, 8-bit representation of clippic[cx,cy,cw,ch] */
-
+
if (!clipis24) { /* copy colormap from clip data into newr,g,b[] */
for (i=0; i<256; i++) {
newr[i] = clipcmap[i*3];
@@ -366,22 +368,22 @@
dp = dpic + i*dw;
cly = cy + (i * ch) / dh;
clp = clippic + (cly*clipw * bperpix);
-
+
for (j=0; j0) {
@@ -763,9 +765,9 @@
XFree((void *) data);
/* read the rest of the data (len bytes) */
- i = XGetWindowProperty(theDisp, rootW, clipAtom, 1L,
- (long) ((len-4)+3)/4,
- False, XA_STRING, &actType, &actFormat, &nitems,
+ i = XGetWindowProperty(theDisp, rootW, clipAtom, 1L,
+ (long) ((len-4)+3)/4,
+ False, XA_STRING, &actType, &actFormat, &nitems,
&nleft, (unsigned char **) &data);
if (i==Success) {
@@ -791,8 +793,8 @@
}
}
-
- /* if we're still here, then the prop method was less than successful.
+
+ /* if we're still here, then the prop method was less than successful.
use the file method, instead */
if (!clipfname) makeClipFName();
@@ -800,7 +802,7 @@
fp = fopen(clipfname, "r");
if (!fp) {
unlink(clipfname);
- sprintf(str, "Can't read clipboard file '%s'\n\n %s.",
+ sprintf(str, "Can't read clipboard file '%s'\n\n %s.",
clipfname, ERRSTR(errno));
ErrPopUp(str,"\nBletch!");
return (byte *) NULL;
@@ -877,19 +879,19 @@
clipAtom = XInternAtom(theDisp, CLIPPROP, True);
if (clipAtom != None) XDeleteProperty(theDisp, rootW, clipAtom);
}
-
-
+
+
if (!forceClipFile) {
clipAtom = XInternAtom(theDisp, CLIPPROP, False); /* find or make prop */
if (clipAtom != None) {
/* try to store the data in the property */
-
+
xerrcode = 0;
XChangeProperty(theDisp, rootW, clipAtom, XA_STRING, 8, PropModeReplace,
cimg, len);
XSync(theDisp, False); /* make it happen *now* */
if (!xerrcode) return; /* success! */
-
+
/* failed, use file method */
XDeleteProperty(theDisp, rootW, clipAtom);
}
@@ -903,7 +905,7 @@
fp = fopen(clipfname, "w");
if (!fp) {
unlink(clipfname);
- sprintf(str, "Can't write clipboard file '%s'\n\n %s.",
+ sprintf(str, "Can't write clipboard file '%s'\n\n %s.",
clipfname, ERRSTR(errno));
ErrPopUp(str,"\nBletch!");
return;
@@ -964,7 +966,7 @@
/********************************************/
static void makeClipFName()
{
- char *homedir;
+ const char *homedir;
if (clipfname) return;
@@ -996,7 +998,7 @@
byte *pp;
nc = 0;
-
+
for (i=y; nc<257 && itime - lastClickTime) < DBLCLKTIME) {
lastClickButton=Button3;
if (HaveSelection() && PTINRECT(px, py, selrx, selry, selrw, selrh)) {
- EnableSelection(0);
+ EnableSelection(0);
rv = 1;
}
else {
@@ -1225,7 +1227,7 @@
else if (ev->button == Button2) { /* do a drag & drop operation */
if (HaveSelection() && PTINRECT(px,py,selrx,selry,selrw,selrh)) {
/* clip selection rect to pic */
- EnableSelection(0);
+ EnableSelection(0);
CropRect2Rect(&selrx, &selry, &selrw, &selrh, 0, 0, pWIDE, pHIGH);
if (selrw<1 || selrh<1) rv = 0;
@@ -1253,8 +1255,8 @@
* holding SHIFT constrains selection to be square,
* holding CTRL constrains selection to keep original aspect ratio
*/
-
- int i, mex, mey, mpx, mpy, offx,offy;
+
+ int mex, mey, mpx, mpy, offx,offy;
int sex, sey, sex2, sey2, sew, seh, sew2, seh2, hs, h2;
int istp, isbt, islf, isrt, isvm, ishm;
int cnstsq, cnstasp;
@@ -1272,7 +1274,7 @@
sew2 = sew/2;
seh2 = seh/2;
sex2--; sey2--;
-
+
if (sew>=35 && seh>=35) hs=7;
else if (sew>=20 && seh>=20) hs=5;
else if (sew>= 9 && seh>= 9) hs=3;
@@ -1307,7 +1309,7 @@
/* it's definitely in a handle... track 'til released */
-
+
DrawSelection(0);
selFilled = 1;
selTracking = 1;
@@ -1366,12 +1368,12 @@
else { chwide=1; newwide = (int) (seh*orgaspect); }
}
}
-
+
if (chwide) {
if (islf) { sex = (sex+sew) - newwide; }
sew = newwide;
}
-
+
if (chhigh) {
if (istp) { sey = (sey+seh) - newhigh; }
seh = newhigh;
@@ -1380,7 +1382,7 @@
if (sew<1) sew=1;
if (seh<1) seh=1;
-
+
if (sex!=selrx || sey!=selry || sew!=selrw || seh!=selrh) {
DrawSelection(0);
selrx = sex; selry = sey; selrw = sew; selrh = seh;
@@ -1395,14 +1397,14 @@
Timer(100);
}
}
-
+
EnableSelection(0);
selFilled = 0;
selTracking = 0;
/* only 'enable' the selection if it intersects CPIC */
- if (selrx < cXOFF+cWIDE && selrx+selrw > cXOFF &&
+ if (selrx < cXOFF+cWIDE && selrx+selrw > cXOFF &&
selry < cYOFF+cHIGH && selry+selrh > cYOFF) EnableSelection(1);
return 1;
@@ -1422,7 +1424,7 @@
*
* if 'dragndrop', changes cursor, monitors CTRL status
*/
-
+
int mpx, mpy, offx, offy;
int newsx, newsy, orgsx, orgsy, cnstrain, docopy, lastdocopy;
Window rW, cW;
@@ -1436,9 +1438,9 @@
CoordE2P(ev->x, ev->y, &mpx, &mpy);
offx = mpx - selrx; offy = mpy - selry;
-
+
/* track rectangle until we get a release */
-
+
DrawSelection(0);
selFilled = 1;
selTracking = 1;
@@ -1467,7 +1469,7 @@
dx = newsx - orgsx; dy = newsy - orgsy;
if (abs(dx) > abs(dy)) dy = 0;
else if (abs(dy) > abs(dx)) dx = 0;
-
+
newsx = orgsx + dx; newsy = orgsy + dy;
}
@@ -1485,7 +1487,7 @@
Timer(100);
}
}
-
+
EnableSelection(0);
selFilled = 0;
@@ -1495,7 +1497,7 @@
/* only do if the selection intersects CPIC */
- if (selrx < cXOFF+cWIDE && selrx+selrw > cXOFF &&
+ if (selrx < cXOFF+cWIDE && selrx+selrw > cXOFF &&
selry < cYOFF+cHIGH && selry+selrh > cYOFF) {
EnableSelection(1);
@@ -1503,10 +1505,10 @@
if (dragndrop) {
int tmpsx, tmpsy;
byte *data;
-
+
tmpsx = selrx; tmpsy = selry;
selrx = orgsx; selry = orgsy;
-
+
data = getSelection(); /* copy old data */
if (data) {
if (!docopy) clearSelectedArea();
@@ -1531,29 +1533,29 @@
int rx,ry,ox,oy,x,y,active, x1, y1, x2, y2, cnstrain;
int i, px,py,px2,py2,pw,ph;
unsigned int mask;
-
+
/* called on a B1 press in mainW to draw a new rectangular selection.
* any former selection has already been removed. holding shift down
- * while tracking constrains selection to a square
+ * while tracking constrains selection to a square
*/
-
+
active = 0;
-
+
x1 = ox = ev->x; y1 = oy = ev->y; /* nail down one corner */
selrx = selry = selrw = selrh = 0;
selTracking = 1;
-
+
while (1) {
if (!XQueryPointer(theDisp,mainW,&rW,&cW,&rx,&ry,&x,&y,&mask)) continue;
if (!(mask & Button1Mask)) break; /* button released */
cnstrain = (mask & ShiftMask);
-
+
if (x!=ox || y!=oy) { /* moved. erase and redraw (?) */
x2 = x; y2 = y;
-
+
/* x1,y1,x2,y2 are in epic coords. sort, convert to pic coords,
and if changed, erase+redraw */
-
+
CoordE2P(x1, y1, &px, &py);
CoordE2P(x2, y2, &px2, &py2);
if (px>px2) { i=px; px=px2; px2=i; }
@@ -1561,17 +1563,17 @@
pw = px2-px+1; ph=py2-py+1;
/* keep px,py,pw,ph inside 'pic' */
-
+
if (px<0) { pw+=px; px=0; }
if (py<0) { ph+=py; py=0; }
if (px>pWIDE-1) px = pWIDE-1;
if (py>pHIGH-1) py = pHIGH-1;
-
+
if (pw<0) pw=0;
if (ph<0) ph=0;
if (px+pw>pWIDE) pw = pWIDE - px;
if (py+ph>pHIGH) ph = pHIGH - py;
-
+
if (cnstrain) { /* make a square at smaller of w,h */
if (ph>pw) { if (y2ph) { if (x2 selr{x,y,w,h}
if the rectangle has changed, erase old and draw new */
-
+
if (px!=selrx || py!=selry || pw!=selrw || ph!=selrh) {
DrawSelection(0);
selrx = px; selry = py; selrw = pw; selrh = ph;
DrawSelection(1);
-
+
haveSel = active = (pw>0 && ph>0);
if (infoUp) SetSelectionString();
XFlush(theDisp);
@@ -1615,7 +1617,7 @@
set, pick a new 'color' to invert the selection with */
int x,y,x1,y1,w,h;
-
+
if (newcol) selColor = (selColor+1) & 0x7;
/* convert selr{x,y,w,h} into epic coords */
@@ -1650,7 +1652,7 @@
if (y<0 && y+h>eHIGH && selFilled!=1)
XDrawLine(theDisp, mainW, theGC, x, eHIGH/2, x+w, eHIGH/2);
-
+
if (selFilled==0 || selFilled == 1) {
/* one little kludge: if w or h == eWIDE or eHIGH, make it one smaller */
if (x+w == eWIDE) w--;
@@ -1664,17 +1666,17 @@
else if (w>=20 && h>=20) { hs=5; h1=4; h2=2; }
else if (w>= 9 && h>= 9) { hs=3; h1=2; h2=1; }
else hs=h1=h2=0;
-
+
if (hs) {
XFillRectangle(theDisp,mainW,theGC,x+1, y+1, (u_int)h1,(u_int)h1);
XFillRectangle(theDisp,mainW,theGC,x+w/2-h2,y+1, (u_int)hs,(u_int)h1);
XFillRectangle(theDisp,mainW,theGC,x+w-h1, y+1, (u_int)h1,(u_int)h1);
-
+
XFillRectangle(theDisp,mainW,theGC,x+1, y+h/2-h2,
(u_int)h1, (u_int)hs);
XFillRectangle(theDisp,mainW,theGC,x+w-h1,y+h/2-h2,
(u_int)h1, (u_int)hs);
-
+
XFillRectangle(theDisp,mainW,theGC,x+1, y+h-h1,
(u_int)h1,(u_int)h1);
XFillRectangle(theDisp,mainW,theGC,x+w/2-h2,y+h-h1,
@@ -1683,7 +1685,7 @@
(u_int)h1,(u_int)h1);
}
}
-
+
if (selFilled==1) {
XDrawLine(theDisp, mainW, theGC, x+1, y+1, x+w-1, y+h-1);
XDrawLine(theDisp, mainW, theGC, x+1, y+h-1, x+w-1, y+1);
@@ -1692,8 +1694,8 @@
else if (selFilled==2) {
XFillRectangle(theDisp, mainW, theGC, x,y,(u_int) w, (u_int) h);
}
-
-
+
+
XSetFunction(theDisp,theGC,GXcopy);
XSetPlaneMask(theDisp, theGC, AllPlanes);
}
@@ -1703,7 +1705,7 @@
void MoveGrowSelection(dx,dy,dw,dh)
int dx,dy,dw,dh;
{
- /* moves and/or grows the selection by the specified amount
+ /* moves and/or grows the selection by the specified amount
(in pic coords). keeps the selection entirely within 'pic'.
(called by 'CropKey()') */
@@ -1729,7 +1731,7 @@
}
}
-
+
/***********************************/
void BlinkSelection(cnt)
int cnt;
diff -ru xv-3.10a/xvdflt.c xv-3.10a-enhancements/xvdflt.c
--- xv-3.10a/xvdflt.c 1994-12-22 14:34:42.000000000 -0800
+++ xv-3.10a-enhancements/xvdflt.c 2007-05-12 14:07:36.000000000 -0700
@@ -16,12 +16,12 @@
#include "bits/xv_rev"
#include "bits/xv_ver"
#include "bits/xf_left"
-#include "bits/xf_right"
+/* #include "bits/xf_right" not used */
#include "bits/font5x9.h"
#ifndef USEOLDPIC
-# include "xvdflt.h"
+# include "xvdflt.h"
#endif
@@ -62,7 +62,7 @@
for (i=0; i mouse button for menu.");
@@ -136,7 +136,11 @@
pinfo->w = XVDFLT_WIDE;
pinfo->h = XVDFLT_HIGH;
pinfo->type = PIC8;
+#ifdef HAVE_PNG
+ pinfo->frmType = F_PNG;
+#else
pinfo->frmType = F_GIF;
+#endif
pinfo->colType = F_FULLCOLOR;
pinfo->normw = pinfo->w;
@@ -169,7 +173,7 @@
for (i=k=0; i mouse button for menu.");
@@ -240,7 +244,11 @@
pinfo->w = DWIDE;
pinfo->h = DHIGH;
pinfo->type = PIC8;
+#ifdef HAVE_PNG
+ pinfo->frmType = F_PNG;
+#else
pinfo->frmType = F_GIF;
+#endif
pinfo->colType = F_FULLCOLOR;
sprintf(pinfo->fullInfo, "<8-bit internal>");
@@ -272,7 +280,7 @@
x = cx - bwide/2;
k = *bptr;
- for (j=0,bit=0; j=0) && (x= 32 && i < 128)
+ if (i >= 32 && i < 128)
xbm2pic(font5x9[i - 32], 5, 9, pic, pw, ph, cx, cy, col);
}
}
diff -ru xv-3.10a/xvdflt.h xv-3.10a-enhancements/xvdflt.h
--- xv-3.10a/xvdflt.h 1994-12-22 14:34:56.000000000 -0800
+++ xv-3.10a-enhancements/xvdflt.h 2007-04-15 20:45:08.000000000 -0700
@@ -2,7 +2,7 @@
#define XVDFLT_HIGH 270
#define XVDFLT_NPARTS 5
#define XVDFLT_PARTLEN 100
-char *xvdflt_pic[1350] = {
+const char *xvdflt_pic[1350] = {
/* 0a */ "00000000000000000000000000000000000000000000000101010101010101010101010101010101010101010101010101010101010101000000000000000000000000000002020202020202020303030303030303030404040404040505050505060708",
/* 0b */ "0809090a0b0c0d0e0e0f101111121213131313141414141515151515151515151616161616161616161616161616161616161616161616161616161616171717171717171717171717171717161616161616161616161616161616161616161616161617",
/* 0c */ "171717181818181818181818181818181818181919181818181818191919191919191a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1b1b1b1b1b1b1b1b1b1c1c1c1c1c1c1c1c1d1d1d1d1d1d1d1d1d1c1c1c1c1c1c1c1c1c1c1c1c1c1c1b1b1b1b1b1b1b1b1b1a1a",
@@ -1356,9 +1356,9 @@
};
-byte xvdflt_r[256] = { 83,83,84,84,84,85,92,94,100,109,119,124,133,137,145,157,163,168,175,183,191,202,203,255,254,253,252,251,250,249,145,114,83,106,129,249,250,251,250,243,216,226,241,222,222,132,61,82,244,249,243,248,173,59,247,102,252,241,244,244,57,241,216,239,6,17,157,244,139,236,250,246,84,213,121,240,70,30,99,91,38,73,105,123,82,40,30,38,114,81,44,35,37,35,30,33,1,0,5,1,1,4,3,0,0,11,0,0,6,15,7,3,8,0,0,4,8,11,15,0,10,11,14,11,0,14,0,28,6,1,22,17,8,1,8,7,7,13,0,9,10,6,7,10,11,11,18,7,2,8,7,9,5,10,8,16,6,6,5,8,8,6,10,8,4,30,22,5,33,33,11,6,10,15,19,13,28,21,35,28,10,25,26,27,29,3,27,14,21,30,31,27,31,35,6,33,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
+const byte xvdflt_r[256] = { 83,83,84,84,84,85,92,94,100,109,119,124,133,137,145,157,163,168,175,183,191,202,203,255,254,253,252,251,250,249,145,114,83,106,129,249,250,251,250,243,216,226,241,222,222,132,61,82,244,249,243,248,173,59,247,102,252,241,244,244,57,241,216,239,6,17,157,244,139,236,250,246,84,213,121,240,70,30,99,91,38,73,105,123,82,40,30,38,114,81,44,35,37,35,30,33,1,0,5,1,1,4,3,0,0,11,0,0,6,15,7,3,8,0,0,4,8,11,15,0,10,11,14,11,0,14,0,28,6,1,22,17,8,1,8,7,7,13,0,9,10,6,7,10,11,11,18,7,2,8,7,9,5,10,8,16,6,6,5,8,8,6,10,8,4,30,22,5,33,33,11,6,10,15,19,13,28,21,35,28,10,25,26,27,29,3,27,14,21,30,31,27,31,35,6,33,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
-byte xvdflt_g[256] = { 83,83,84,84,84,85,92,94,100,109,119,124,133,137,145,157,162,168,174,184,191,196,205,255,254,253,252,251,250,249,146,114,83,106,130,211,185,176,173,230,211,157,161,170,144,31,52,82,168,168,162,248,116,42,247,68,171,164,245,244,35,159,133,161,18,26,151,163,138,65,67,51,68,49,111,159,88,30,100,87,38,74,92,124,82,38,22,38,114,81,22,35,37,35,30,33,1,0,4,0,1,4,2,0,0,11,0,0,6,15,7,3,8,0,0,4,9,10,14,0,10,10,13,11,0,7,0,18,6,0,22,18,8,1,8,7,7,13,0,9,9,6,7,10,11,11,18,7,2,9,7,9,5,10,8,16,6,6,5,8,8,7,9,8,4,30,22,5,33,32,11,6,10,15,19,13,28,21,35,25,9,22,26,27,29,3,27,14,21,30,31,11,31,35,6,18,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
+const byte xvdflt_g[256] = { 83,83,84,84,84,85,92,94,100,109,119,124,133,137,145,157,162,168,174,184,191,196,205,255,254,253,252,251,250,249,146,114,83,106,130,211,185,176,173,230,211,157,161,170,144,31,52,82,168,168,162,248,116,42,247,68,171,164,245,244,35,159,133,161,18,26,151,163,138,65,67,51,68,49,111,159,88,30,100,87,38,74,92,124,82,38,22,38,114,81,22,35,37,35,30,33,1,0,4,0,1,4,2,0,0,11,0,0,6,15,7,3,8,0,0,4,9,10,14,0,10,10,13,11,0,7,0,18,6,0,22,18,8,1,8,7,7,13,0,9,9,6,7,10,11,11,18,7,2,9,7,9,5,10,8,16,6,6,5,8,8,7,9,8,4,30,22,5,33,32,11,6,10,15,19,13,28,21,35,25,9,22,26,27,29,3,27,14,21,30,31,11,31,35,6,18,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
-byte xvdflt_b[256] = { 251,250,252,253,254,255,254,255,254,253,254,254,252,255,255,253,251,253,253,253,254,249,252,255,254,253,252,251,250,249,252,255,249,253,250,162,99,79,81,225,239,113,92,147,72,43,37,248,84,88,91,248,83,34,247,80,84,86,245,244,30,90,74,92,10,55,239,85,250,90,88,72,125,68,206,92,190,87,245,230,133,216,199,248,247,105,73,108,252,244,62,97,119,143,150,134,57,49,64,64,72,78,72,40,75,98,66,59,110,110,80,89,95,86,34,87,80,88,77,48,100,80,98,89,33,60,29,75,91,73,111,87,120,89,103,103,126,111,23,121,108,147,111,142,105,111,111,140,107,107,118,113,112,110,114,123,140,120,141,132,124,130,98,127,151,102,124,132,108,119,123,159,124,135,123,124,114,135,126,100,122,126,132,140,126,164,119,149,149,137,113,75,127,114,131,78,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
+const byte xvdflt_b[256] = { 251,250,252,253,254,255,254,255,254,253,254,254,252,255,255,253,251,253,253,253,254,249,252,255,254,253,252,251,250,249,252,255,249,253,250,162,99,79,81,225,239,113,92,147,72,43,37,248,84,88,91,248,83,34,247,80,84,86,245,244,30,90,74,92,10,55,239,85,250,90,88,72,125,68,206,92,190,87,245,230,133,216,199,248,247,105,73,108,252,244,62,97,119,143,150,134,57,49,64,64,72,78,72,40,75,98,66,59,110,110,80,89,95,86,34,87,80,88,77,48,100,80,98,89,33,60,29,75,91,73,111,87,120,89,103,103,126,111,23,121,108,147,111,142,105,111,111,140,107,107,118,113,112,110,114,123,140,120,141,132,124,130,98,127,151,102,124,132,108,119,123,159,124,135,123,124,114,135,126,100,122,126,132,140,126,164,119,149,149,137,113,75,127,114,131,78,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
diff -ru xv-3.10a/xvdial.c xv-3.10a-enhancements/xvdial.c
--- xv-3.10a/xvdial.c 1995-01-03 13:20:31.000000000 -0800
+++ xv-3.10a-enhancements/xvdial.c 2007-04-15 17:55:50.000000000 -0700
@@ -1,11 +1,11 @@
-/*
+/*
* xvdial.c - DIAL handling functions
*
* callable functions:
*
* DCreate() - creates a dial
* DSetRange() - sets min/max/current values of control
- * DSetVal() - sets value of control
+ * DSetVal() - sets value of control
* DSetActive() - turns dial '.active' on and off
* DRedraw() - redraws the dial
* DTrack() - called when clicked. Operates control 'til mouseup
@@ -41,51 +41,53 @@
/* local functions */
-static int whereInDial PARM((DIAL *, int, int));
-static void drawArrow PARM((DIAL *));
-static void drawValStr PARM((DIAL *));
-static void drawButt PARM((DIAL *, int, int));
-static int computeDialVal PARM((DIAL *, int, int));
-static void dimDial PARM((DIAL *));
+static int whereInDial PARM((DIAL *, int, int));
+static void drawArrow PARM((DIAL *));
+static void drawValStr PARM((DIAL *));
+static void drawButt PARM((DIAL *, int, int));
+static double computeDialVal PARM((DIAL *, int, int));
+static void dimDial PARM((DIAL *));
/***************************************************/
-void DCreate(dp, parent, x, y, w, h, minv, maxv, curv, page,
+void DCreate(dp, parent, x, y, w, h, minv, maxv, curv, inc, page,
fg, bg, hi, lo, title, units)
-DIAL *dp;
-Window parent;
-int x,y,w,h,minv,maxv,curv,page;
-unsigned long fg,bg,hi,lo;
-char *title, *units;
+DIAL *dp;
+Window parent;
+int x, y, w, h;
+double minv, maxv, curv, inc, page;
+unsigned long fg, bg, hi, lo;
+const char *title, *units;
{
if (!pixmaps_built) {
- cw1Pix = XCreatePixmapFromBitmapData(theDisp, parent,
+ cw1Pix = XCreatePixmapFromBitmapData(theDisp, parent,
(char *) dial_cw1_bits, PW, PH, fg, bg, dispDEEP);
- ccw1Pix = XCreatePixmapFromBitmapData(theDisp, parent,
+ ccw1Pix = XCreatePixmapFromBitmapData(theDisp, parent,
(char *) dial_ccw1_bits, PW, PH, fg, bg, dispDEEP);
- cw2Pix = XCreatePixmapFromBitmapData(theDisp, parent,
+ cw2Pix = XCreatePixmapFromBitmapData(theDisp, parent,
(char *) dial_cw2_bits, PW, PH, fg, bg, dispDEEP);
- ccw2Pix = XCreatePixmapFromBitmapData(theDisp, parent,
+ ccw2Pix = XCreatePixmapFromBitmapData(theDisp, parent,
(char *) dial_ccw2_bits, PW, PH, fg, bg, dispDEEP);
}
- dp->x = x;
- dp->y = y;
-
- dp->w = w;
- dp->h = h;
- dp->fg = fg;
- dp->bg = bg;
- dp->hi = hi;
- dp->lo = lo;
- dp->title = title;
- dp->units = units;
- dp->active = 1;
+ dp->x = x;
+ dp->y = y;
+ dp->w = w;
+ dp->h = h;
+ dp->fg = fg;
+ dp->bg = bg;
+ dp->hi = hi;
+ dp->lo = lo;
+ dp->title = title;
+ dp->units = units;
+ dp->active = 1;
dp->drawobj = NULL;
- if (w < h-24-16) dp->rad = (w - 8) / 2;
- else dp->rad = (h - 24 - 16 - 8) / 2;
+ if (w < h-24-16)
+ dp->rad = (w - 8) / 2;
+ else
+ dp->rad = (h - 24 - 16 - 8) / 2;
dp->cx = w / 2;
dp->cy = dp->rad + 4 + 16;
@@ -94,22 +96,22 @@
dp->bx[INCW1] = w-14-4; dp->by[INCW1] = h - 4 - 20;
dp->bx[INCW2] = w-14-4; dp->by[INCW2] = h - 4 - 10;
- dp->win = XCreateSimpleWindow(theDisp, parent,x,y,(u_int) w,(u_int) h,
- 1,fg,bg);
+ dp->win = XCreateSimpleWindow(theDisp, parent, x, y, (u_int) w, (u_int) h,
+ 1, fg, bg);
if (!dp->win) FatalError("can't create dial window");
- DSetRange(dp, minv, maxv, curv, page);
+ DSetRange(dp, minv, maxv, curv, inc, page);
XSelectInput(theDisp, dp->win, ExposureMask | ButtonPressMask);
}
/***************************************************/
-void DSetRange(dp, minv, maxv, curv, page)
-DIAL *dp;
-int minv, maxv, curv, page;
+void DSetRange(dp, minv, maxv, curv, inc, page)
+DIAL *dp;
+double minv, maxv, curv, inc, page;
{
if (maxvmin = minv; dp->max = maxv; dp->page = page;
+ dp->min = minv; dp->max = maxv; dp->inc = inc; dp->page = page;
dp->active = (minv < maxv);
DSetVal(dp, curv);
@@ -118,22 +120,22 @@
/***************************************************/
void DSetVal(dp, curv)
-DIAL *dp;
-int curv;
+DIAL *dp;
+double curv;
{
RANGE(curv, dp->min, dp->max); /* make sure curv is in-range */
if (curv == dp->val) return;
/* erase old arrow */
- XSetForeground(theDisp, theGC, dp->bg);
+ XSetForeground(theDisp, theGC, dp->bg);
drawArrow(dp);
- dp->val = curv;
+ dp->val = (double)((int)(curv / dp->inc + (curv > 0 ? 0.5 : -0.5))) * dp->inc;
/* draw new arrow and string */
XSetForeground(theDisp, theGC, dp->fg);
- XSetBackground(theDisp, theGC, dp->bg);
+ XSetBackground(theDisp, theGC, dp->bg);
drawArrow(dp);
drawValStr(dp);
if (!dp->active) dimDial(dp);
@@ -202,7 +204,8 @@
int mx,my;
{
Window rW,cW;
- int rx,ry, x,y, ipos, pos, lit, i, origval;
+ int rx, ry, x, y, ipos, pos, lit;
+ double origval;
unsigned int mask;
lit = 0;
@@ -224,35 +227,36 @@
if (ipos != INDIAL) {
drawButt(dp, ipos, 1);
switch (ipos) {
- case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+1); break;
+ case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+dp->inc); break;
case INCW2: if (dp->val < dp->max) DSetVal(dp, dp->val+dp->page); break;
- case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-1); break;
+ case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->inc); break;
case INCCW2: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->page); break;
}
- if (dp->drawobj != NULL) (dp->drawobj)();
+ if (dp->drawobj != NULL) (dp->drawobj)();
Timer(INC1WAIT);
lit = 1;
}
- else {
- i = computeDialVal(dp, mx, my);
- DSetVal(dp, i);
- if (dp->drawobj != NULL) (dp->drawobj)();
+ else {
+ double v;
+ v = computeDialVal(dp, mx, my);
+ DSetVal(dp, v);
+ if (dp->drawobj != NULL) (dp->drawobj)();
}
-
+
/* loop until mouse is released */
while (XQueryPointer(theDisp,dp->win,&rW,&cW,&rx,&ry,&x,&y,&mask)) {
if (!(mask & Button1Mask)) break; /* button released */
if (ipos == INDIAL) {
- int j;
- i = computeDialVal(dp, x, y);
- j = dp->val;
- DSetVal(dp, i);
- if (j != dp->val) {
+ double v, w;
+ v = computeDialVal(dp, x, y);
+ w = dp->val;
+ DSetVal(dp, v);
+ if (w != dp->val) {
/* track whatever dial controls */
- if (dp->drawobj != NULL) (dp->drawobj)();
+ if (dp->drawobj != NULL) (dp->drawobj)();
}
}
@@ -266,18 +270,18 @@
if (lit) {
switch (ipos) {
- case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+1);
+ case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+dp->inc);
break;
case INCW2: if (dp->val < dp->max) DSetVal(dp, dp->val+dp->page);
break;
- case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-1);
+ case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->inc);
break;
case INCCW2: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->page);
break;
}
/* track whatever dial controls */
- if (dp->drawobj != NULL) (dp->drawobj)();
+ if (dp->drawobj != NULL) (dp->drawobj)();
Timer(INC2WAIT);
}
@@ -305,34 +309,35 @@
/* returns region * that x,y is in. returns -1 if none */
- for (i=0; i<4; i++)
+ for (i=0; i<4; i++)
if (PTINRECT(x,y, dp->bx[i], dp->by[i], 14, 10)) return i;
- if (PTINRECT(x,y, dp->cx - dp->rad, dp->cy - dp->rad,
+ if (PTINRECT(x,y, dp->cx - dp->rad, dp->cy - dp->rad,
2*dp->rad, 2*dp->rad))
return INDIAL;
return -1;
}
-
+
/***************************************************/
static void drawArrow(dp)
DIAL *dp;
{
- int i, rad, cx, cy;
+ int rad, cx, cy;
+ double v;
XPoint arrow[4];
rad = dp->rad; cx = dp->cx; cy = dp->cy;
/* map pos (range minv..maxv) into degrees (range 240..-60) */
- i = 240 + (-300 * (dp->val - dp->min)) / (dp->max - dp->min);
- arrow[0].x = cx + (int) ((double) rad * .80 * cos(i * DEG2RAD));
- arrow[0].y = cy - (int) ((double) rad * .80 * sin(i * DEG2RAD));
- arrow[1].x = cx + (int) ((double) rad * .33 * cos((i+160) * DEG2RAD));
- arrow[1].y = cy - (int) ((double) rad * .33 * sin((i+160) * DEG2RAD));
- arrow[2].x = cx + (int) ((double) rad * .33 * cos((i-160) * DEG2RAD));
- arrow[2].y = cy - (int) ((double) rad * .33 * sin((i-160) * DEG2RAD));
+ v = 240 + (-300 * (dp->val - dp->min)) / (dp->max - dp->min);
+ arrow[0].x = cx + (int) ((double) rad * .80 * cos(v * DEG2RAD));
+ arrow[0].y = cy - (int) ((double) rad * .80 * sin(v * DEG2RAD));
+ arrow[1].x = cx + (int) ((double) rad * .33 * cos((v+160) * DEG2RAD));
+ arrow[1].y = cy - (int) ((double) rad * .33 * sin((v+160) * DEG2RAD));
+ arrow[2].x = cx + (int) ((double) rad * .33 * cos((v-160) * DEG2RAD));
+ arrow[2].y = cy - (int) ((double) rad * .33 * sin((v-160) * DEG2RAD));
arrow[3].x = arrow[0].x;
arrow[3].y = arrow[0].y;
XDrawLines(theDisp, dp->win, theGC, arrow, 4, CoordModeOrigin);
@@ -343,33 +348,47 @@
static void drawValStr(dp)
DIAL *dp;
{
- int i, x1, x2;
+ int tot, i, x1, x2;
char foo[60], foo1[60];
/* compute longest string necessary so we can right-align this thing */
- sprintf(foo,"%d",dp->min); x1 = strlen(foo);
- sprintf(foo,"%d",dp->max); x2 = strlen(foo);
+ sprintf(foo,"%d",(int)dp->min); x1 = strlen(foo);
+ sprintf(foo,"%d",(int)dp->max); x2 = strlen(foo);
if (dp->min < 0 && dp->max > 0) x2++; /* put '+' at beginning */
i = x1; if (x2>x1) i = x2;
if (dp->units) i += strlen(dp->units);
- if (dp->min < 0 && dp->max > 0) sprintf(foo,"%+d", dp->val);
- else sprintf(foo,"%d", dp->val);
+ sprintf(foo,"%g",dp->inc); /* space for decimal values */
+ tot = i + strlen(foo) - 1; /* Take away the 0 from the beginning */
+
+ if (dp->min < 0.0 && dp->max > 0.0) sprintf(foo,"%+g", dp->val);
+ else sprintf(foo,"%g", dp->val);
+
+ if (dp->inc < 1.0)
+ {
+ int j;
+
+ if (dp->val == (double)((int)dp->val))
+ strcat(foo,".");
+
+ for (j = strlen(foo); j < tot; j++)
+ strcat(foo,"0");
+ }
if (dp->units) strcat(foo,dp->units);
foo1[0] = '\0';
if (strlen(foo) < (size_t) i) {
- for (i = i - strlen(foo); i>0; i--) strcat(foo1," ");
+ for (i-=strlen(foo);i>0;i--) strcat(foo1," ");
}
strcat(foo1, foo);
XSetForeground(theDisp, theGC, dp->fg);
XSetBackground(theDisp, theGC, dp->bg);
XSetFont(theDisp, theGC, monofont);
- XDrawImageString(theDisp, dp->win, theGC,
+ XDrawImageString(theDisp, dp->win, theGC,
dp->w/2 - XTextWidth(monofinfo, foo1, (int) strlen(foo1))/2,
dp->h-14 - (monofinfo->ascent + monofinfo->descent)/2
- + monofinfo->ascent,
+ + monofinfo->ascent,
foo1, (int) strlen(foo1));
XSetFont(theDisp, theGC, mfont);
}
@@ -411,12 +430,13 @@
/***************************************************/
-static int computeDialVal(dp, x, y)
+static double computeDialVal(dp, x, y)
DIAL *dp;
int x, y;
{
- int dx, dy, val;
- double angle;
+ int dx, dy;
+
+ double angle, val;
/* compute dx, dy (distance from cx, cy). Note: +dy is *up* */
dx = x - dp->cx; dy = dp->cy - y;
@@ -431,13 +451,15 @@
}
else if (dx>0) angle = atan((double) dy / (double) dx) * RAD2DEG;
else angle = atan((double) -dy / (double) -dx) * RAD2DEG + 180.0;
-
+
/* map angle into range: -90..270, then into to value */
if (angle > 270.0) angle -= 360.0;
if (angle < -90.0) angle += 360.0;
- val = (int) ((dp->max - dp->min) * (240.0 - angle) / 300.0) + dp->min;
+ val = ((dp->max - dp->min) * (240.0 - angle) / 300.0) + dp->min;
+ /* round value to be an even multiple of dp->inc */
+ val = (double)((int)(val / dp->inc + 0.5)) * dp->inc;
return val;
}
diff -ru xv-3.10a/xvdir.c xv-3.10a-enhancements/xvdir.c
--- xv-3.10a/xvdir.c 1995-01-03 13:21:39.000000000 -0800
+++ xv-3.10a-enhancements/xvdir.c 2007-05-13 18:47:51.000000000 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* xvdir.c - Directory changin', file i/o dialog box
*
* callable functions:
@@ -50,32 +50,63 @@
#define COLWIDE 150 /* width of colMB */
/* NOTE: make sure these match up with F_* definitions in xv.h */
-static char *saveColors[] = { "Full Color",
- "Greyscale",
- "B/W Dithered",
- "Reduced Color" };
-
-static char *saveFormats[] = { "GIF",
+static const char *saveColors[] = { "Full Color",
+ "Greyscale",
+ "B/W Dithered",
+ "Reduced Color" };
+
+static const char *saveFormats[] = {
+#ifdef HAVE_PNG
+ "PNG",
+#endif
#ifdef HAVE_JPEG
- "JPEG",
+ "JPEG",
#endif
+#ifdef HAVE_JP2K
+ "JPEG 2000",
+ "JP2",
+#endif
+ "GIF",
#ifdef HAVE_TIFF
- "TIFF",
+ "TIFF",
+#endif
+ "PostScript",
+ "PBM/PGM/PPM (raw)",
+ "PBM/PGM/PPM (ascii)",
+ "X11 Bitmap",
+ "XPM",
+ "BMP",
+ "Sun Rasterfile",
+ "IRIS RGB",
+ "Targa (24-bit)",
+ "FITS",
+ "PM",
+ "Spectrum SCREEN$", /* [JCE] */
+ "WBMP",
+#ifdef HAVE_MAG
+ "MAG",
+#endif
+#ifdef HAVE_PIC
+ "PIC",
+#endif
+#ifdef HAVE_MAKI
+ "MAKI (640x400 only)",
+#endif
+#ifdef HAVE_PI
+ "PI",
+#endif
+#ifdef HAVE_PIC2
+ "PIC2",
+#endif
+#ifdef HAVE_MGCSFX
+ "MgcSfx",
#endif
- "PostScript",
- "PBM/PGM/PPM (raw)",
- "PBM/PGM/PPM (ascii)",
- "X11 Bitmap",
- "XPM",
- "BMP",
- "Sun Rasterfile",
- "IRIS RGB",
- "Targa (24-bit)",
- "FITS",
- "PM",
- MBSEP,
- "Filename List"};
+ MBSEP,
+ "Filename List" };
+#ifdef HAVE_PIC2
+extern int PIC2SaveParams PARM((char *, int));
+#endif
static void arrangeButts PARM((int));
static void RedrawDList PARM((int, SCRL *));
@@ -83,34 +114,37 @@
static int dnamcmp PARM((const void *, const void *));
static int FNameCdable PARM((void));
static void loadCWD PARM((void));
+#ifdef FOO
static int cd_able PARM((char *));
+#endif
static void scrollToFileName PARM((void));
-static void setFName PARM((char *));
+static void setFName PARM((const char *));
static void showFName PARM((void));
static void changeSuffix PARM((void));
static int autoComplete PARM((void));
-static byte *handleBWandReduced PARM((byte *, int,int,int, int, int *,
+static byte *handleBWandReduced PARM((byte *, int,int,int, int, int *,
byte **, byte **, byte **));
static byte *handleNormSel PARM((int *, int *, int *, int *));
-static char *fnames[MAXNAMES];
-static int numfnames = 0, ndirs = 0;
-static char path[MAXPATHLEN+1]; /* '/' terminated */
-static char loadpath[MAXPATHLEN+1]; /* '/' terminated */
-static char savepath[MAXPATHLEN+1]; /* '/' terminated */
-static char *dirs[MAXDEEP]; /* list of directory names */
-static char *dirMBlist[MAXDEEP]; /* list of dir names in right order */
-static char *lastdir; /* name of the directory we're in */
-static char filename[MAXFNLEN+100]; /* filename being entered */
-static char deffname[MAXFNLEN+100]; /* default filename */
-
-static int savemode; /* if 0 'load box', if 1 'save box' */
-static int curPos, stPos, enPos; /* filename textedit stuff */
-static MBUTT dirMB; /* popup path menu */
-static MBUTT fmtMB; /* 'format' menu button (Save only) */
-static MBUTT colMB; /* 'colors' menu button (Save only) */
+static char *fnames[MAXNAMES];
+static int numfnames = 0, ndirs = 0;
+static char path[MAXPATHLEN+1]; /* '/' terminated */
+static char loadpath[MAXPATHLEN+1]; /* '/' terminated */
+static char savepath[MAXPATHLEN+1]; /* '/' terminated */
+static char *dirs[MAXDEEP]; /* list of directory names */
+static const char *dirMBlist[MAXDEEP]; /* list of dir names in right order */
+static char *lastdir; /* name of the directory we're in */
+static char filename[MAXFNLEN+100]; /* filename being entered */
+static char deffname[MAXFNLEN+100]; /* default filename */
+
+static int savemode; /* if 0 'load box', if 1 'save box' */
+static int curPos; /* insertion point in textedit filename */
+static int stPos, enPos; /* start and end of visible textedit filename */
+static MBUTT dirMB; /* popup path menu */
+static MBUTT fmtMB; /* 'format' menu button (Save only) */
+static MBUTT colMB; /* 'colors' menu button (Save only) */
static Pixmap d_loadPix, d_savePix;
@@ -119,7 +153,7 @@
static char oldfname[MAXFNLEN+100];
/* the name of the file actually opened. (the temp file if we are piping) */
-static char outFName[256];
+static char outFName[256];
static int dopipe;
@@ -127,48 +161,46 @@
void CreateDirW(geom)
char *geom;
{
- int w, y;
-
path[0] = '\0';
xv_getwd(loadpath, sizeof(loadpath));
xv_getwd(savepath, sizeof(savepath));
-
+
dirW = CreateWindow("","XVdir", geom, DIRWIDE, DIRHIGH, infofg, infobg, 0);
if (!dirW) FatalError("couldn't create 'directory' window!");
- LSCreate(&dList, dirW, 10, 5 + 3*(6+LINEHIGH) + 6, LISTWIDE,
- LINEHIGH*NLINES, NLINES, fnames, numfnames, infofg, infobg,
+ LSCreate(&dList, dirW, 10, 5 + 3*(6+LINEHIGH) + 6, LISTWIDE,
+ LINEHIGH*NLINES, NLINES, fnames, numfnames, infofg, infobg,
hicol, locol, RedrawDList, 1, 0);
- dnamW = XCreateSimpleWindow(theDisp, dirW, 80, dList.y + (int) dList.h + 30,
- (u_int) DNAMWIDE+6, (u_int) LINEHIGH+5,
+ dnamW = XCreateSimpleWindow(theDisp, dirW, 80, dList.y + (int) dList.h + 30,
+ (u_int) DNAMWIDE+6, (u_int) LINEHIGH+5,
1, infofg, infobg);
if (!dnamW) FatalError("can't create name window");
XSelectInput(theDisp, dnamW, ExposureMask);
- CBCreate(&browseCB, dirW, DIRWIDE/2, dList.y + (int) dList.h + 6,
+ CBCreate(&browseCB, dirW, DIRWIDE/2, dList.y + (int) dList.h + 6,
"Browse", infofg, infobg, hicol,locol);
- CBCreate(&savenormCB, dirW, 220, dList.y + (int) dList.h + 6,
+ CBCreate(&savenormCB, dirW, 220, dList.y + (int) dList.h + 6,
"Normal Size", infofg, infobg,hicol,locol);
- CBCreate(&saveselCB, dirW, 80, dList.y + (int) dList.h + 6,
+ CBCreate(&saveselCB, dirW, 80, dList.y + (int) dList.h + 6,
"Selected Area", infofg, infobg,hicol,locol);
/* y-coordinates get filled in when window is opened */
- BTCreate(&dbut[S_BOK], dirW, 259, 0, 80, BUTTH,
+ BTCreate(&dbut[S_BOK], dirW, 259, 0, 80, BUTTH,
"Ok", infofg, infobg,hicol,locol);
- BTCreate(&dbut[S_BCANC], dirW, 259, 0, 80, BUTTH,
+ BTCreate(&dbut[S_BCANC], dirW, 259, 0, 80, BUTTH,
"Cancel", infofg,infobg,hicol,locol);
- BTCreate(&dbut[S_BRESCAN], dirW, 259, 0, 80, BUTTH,
+ BTCreate(&dbut[S_BRESCAN], dirW, 259, 0, 80, BUTTH,
"Rescan", infofg,infobg,hicol,locol);
- BTCreate(&dbut[S_BOLDSET], dirW, 259, 0, 80, BUTTH,
+ BTCreate(&dbut[S_BOLDSET], dirW, 259, 0, 80, BUTTH,
"Prev Set", infofg,infobg,hicol,locol);
- BTCreate(&dbut[S_BOLDNAM], dirW, 259, 0, 80, BUTTH,
+ BTCreate(&dbut[S_BOLDNAM], dirW, 259, 0, 80, BUTTH,
"Prev Name", infofg,infobg,hicol,locol);
SetDirFName("");
@@ -180,33 +212,33 @@
* create MBUTTs *after* calling XMapSubWindows() to keep popup unmapped
*/
- MBCreate(&dirMB, dirW, 50, dList.y -(LINEHIGH+6),
+ MBCreate(&dirMB, dirW, 50, dList.y -(LINEHIGH+6),
(u_int) DDWIDE, (u_int) LINEHIGH, NULL, NULL, 0,
infofg,infobg,hicol,locol);
- MBCreate(&fmtMB, dirW, DIRWIDE-FMTWIDE-10, 5,
- (u_int) FMTWIDE, (u_int) LINEHIGH, NULL, saveFormats, F_MAXFMTS,
+ MBCreate(&fmtMB, dirW, DIRWIDE-FMTWIDE-10, 5,
+ (u_int) FMTWIDE, (u_int) LINEHIGH, NULL, saveFormats, F_MAXFMTS,
infofg,infobg,hicol,locol);
fmtMB.hascheck = 1;
MBSelect(&fmtMB, 0);
- MBCreate(&colMB, dirW, DIRWIDE-COLWIDE-10, 5+LINEHIGH+6,
- (u_int) COLWIDE, (u_int) LINEHIGH, NULL, saveColors, F_MAXCOLORS,
+ MBCreate(&colMB, dirW, DIRWIDE-COLWIDE-10, 5+LINEHIGH+6,
+ (u_int) COLWIDE, (u_int) LINEHIGH, NULL, saveColors, F_MAXCOLORS,
infofg,infobg,hicol,locol);
colMB.hascheck = 1;
MBSelect(&colMB, 0);
- d_loadPix = XCreatePixmapFromBitmapData(theDisp, dirW,
- (char *) d_load_bits, d_load_width, d_load_height,
+ d_loadPix = XCreatePixmapFromBitmapData(theDisp, dirW,
+ (char *) d_load_bits, d_load_width, d_load_height,
infofg, infobg, dispDEEP);
- d_savePix = XCreatePixmapFromBitmapData(theDisp, dirW,
- (char *) d_save_bits, d_save_width, d_save_height,
+ d_savePix = XCreatePixmapFromBitmapData(theDisp, dirW,
+ (char *) d_save_bits, d_save_width, d_save_height,
infofg, infobg, dispDEEP);
}
-
+
/***************************************************/
void DirBox(mode)
@@ -261,7 +293,7 @@
BTSetActive(&dbut[S_BOLDSET], haveoldinfo);
BTSetActive(&dbut[S_BOLDNAM], haveoldinfo);
-
+
CBSetActive(&saveselCB, HaveSelection());
MBSetActive(&fmtMB, 1);
@@ -303,15 +335,15 @@
if (gap>16) {
gap = 16;
top = dList.y + (dList.h - (nbts*BUTTH) - (ngaps*gap))/2;
-
+
for (i=0; i txtw) txtw = StringWidth(COLLABEL);
if (!savemode) {
- XCopyArea(theDisp, d_loadPix, dirW, theGC, 0,0,d_load_width,d_load_height,
+ XCopyArea(theDisp, d_loadPix, dirW, theGC, 0,0,d_load_width,d_load_height,
10, (dirMB.y-6)/2 - d_load_height/2);
XSetFillStyle(theDisp, theGC, FillStippled);
@@ -399,18 +431,18 @@
i = v = 0;
if (MBClick(&fmtMB, x,y) && (v=MBTrack(&fmtMB))>=0) i=1;
else if (MBClick(&colMB, x,y) && (v=MBTrack(&colMB))>=0) i=2;
-
+
if (i) { /* changed one of them */
if (i==1) SetDirSaveMode(F_FORMAT, v);
else SetDirSaveMode(F_COLORS, v);
changeSuffix();
}
}
-
-
+
+
if (!savemode) { /* LOAD */
if (CBClick(&browseCB,x,y)) CBTrack(&browseCB);
- }
+ }
else { /* SAVE */
if (CBClick(&savenormCB,x,y)) CBTrack(&savenormCB);
else if (CBClick(&saveselCB,x,y)) CBTrack(&saveselCB);
@@ -482,7 +514,7 @@
}
if (oldnumnames != numnames) { /* added some */
- if (numnames>0) BTSetActive(&but[BDELETE],1);
+ if (numnames>0) BTSetActive(&but[BDELETE],1);
windowMB.dim[WMB_TEXTVIEW] = (numnames==0);
LSNewData(&nList, dispnames, numnames);
@@ -501,10 +533,35 @@
}
-
if (MBClick(&dirMB, x, y)) {
i = MBTrack(&dirMB);
if (i >= 0) changedDirMB(i);
+ return -1;
+ }
+
+ /* handle clicks inside the filename box */
+ if (x > 80 &&
+ y > dList.y + (int) dList.h + 30 &&
+ x < 80 + DNAMWIDE+6 &&
+ y < dList.y + (int) dList.h + 30 + LINEHIGH+5) {
+ int tx;
+ int dx;
+ int pos;
+
+ /* make coordinates relative to dnamW */
+ tx = x - (80 + 1 + 3); /* left side plus the border plus the space for the "more stuff" sign */
+
+ for (pos=stPos; pos+1 < enPos; pos++) {
+ if (XTextWidth(mfinfo, &filename[stPos], 1+pos-stPos) > tx)
+ break;
+ }
+ /* if we are more than halfway past this char, put the insertion point after it */
+ dx = tx - XTextWidth(mfinfo, &filename[stPos], pos-stPos);
+ if (dx > XTextWidth(mfinfo, &filename[pos], 1)/2)
+ pos++;
+
+ curPos = pos;
+ showFName();
}
return -1;
@@ -564,14 +621,18 @@
* a special concealed device setup to provide a list of available
* disks).
*/
- if ( ((ndirs-sel) == 2) && (strlen(tmppath) > 1) )
+ if ( ((ndirs-sel) == 2) && (strlen(tmppath) > 1) )
strcat ( tmppath, "/000000" ); /* add root dir for device */
else if ((ndirs-sel) == 1 ) {
strcpy ( tmppath, "/XV_Root_Device/000000" ); /* fake top level */
}
#endif
+#ifdef AUTO_EXPAND
+ if (Chvdir(tmppath)) {
+#else
if (chdir(tmppath)) {
+#endif
char str[512];
sprintf(str,"Unable to cd to '%s'\n", tmppath);
*trunc_point = '/'; /* restore the path */
@@ -602,7 +663,7 @@
xv_getwd(path, sizeof(path));
LoadCurrentDirectory();
}
-
+
/***************************************************/
@@ -621,14 +682,14 @@
#else
struct dirent *dp;
#endif
-
+
/* get rid of previous file names */
for (i=0; i=0; i--,j++) {
- size_t stlen = (i<(ndirs-1)) ? dirs[i+1] - dirs[i] : strlen(dirs[i]);
- dirMBlist[j] = (char *) malloc(stlen+1);
- if (!dirMBlist[j]) FatalError("unable to malloc dirMBlist[]");
+ size_t stlen = (i<(ndirs-1)) ? dirs[i+1] - dirs[i] : strlen(dirs[i]);
+ char *copy;
+
+ copy = malloc(stlen+1);
+ if (!copy) FatalError("unable to malloc dirMBlist[]");
- strncpy(dirMBlist[j], dirs[i], stlen);
- dirMBlist[j][stlen] = '\0';
+ strncpy(copy, dirs[i], stlen);
+ copy[stlen] = '\0';
+ dirMBlist[j] = copy;
}
-
+
lastdir = dirs[ndirs-1];
dirMB.list = dirMBlist;
dirMB.nlist = ndirs;
- XClearArea(theDisp, dirMB.win, dirMB.x, dirMB.y,
+ XClearArea(theDisp, dirMB.win, dirMB.x, dirMB.y,
(u_int) dirMB.w+3, (u_int) dirMB.h+3, False);
i = StringWidth(dirMBlist[0]) + 10;
dirMB.x = dirMB.x + dirMB.w/2 - i/2;
@@ -704,8 +776,8 @@
i=0;
while ( (dp = readdir(dirp)) != NULL) {
- if (strcmp(dp->d_name, ".")==0 ||
- (strcmp(dp->d_name, "..")==0 &&
+ if (strcmp(dp->d_name, ".")==0 ||
+ (strcmp(dp->d_name, "..")==0 &&
(strcmp(path,"/")==0 || strcmp(path,"//")==0)) ||
strcmp(dp->d_name, THUMBDIR)==0) {
/* skip over '.' and '..' and THUMBDIR */
@@ -714,7 +786,7 @@
if (i == MAXNAMES) {
fprintf(stderr,
- "%s: too many directory entries. Only using first %d.\n",
+ "%s: too many directory entries. Using only first %d.\n",
cmd, MAXNAMES);
break;
}
@@ -733,7 +805,7 @@
/* For VMS we will default all files EXCEPT directories to avoid
the high cost of the VAX C implementation of the stat function.
Suggested by Kevin Oberman (OBERMAN@icdc.llnl.gov) */
-
+
if (xv_strstr (fnames[i]+1, ".DIR") != NULL) fnames[i][0] = C_DIR;
if (xv_strstr (fnames[i]+1, ".EXE") != NULL) fnames[i][0] = C_EXE;
if (xv_strstr (fnames[i]+1, ".OBJ") != NULL) fnames[i][0] = C_BLK;
@@ -749,6 +821,9 @@
else if (S_ISFIFO(ftype)) fnames[i][0] = C_FIFO;
else if (S_ISSOCK(ftype)) fnames[i][0] = C_SOCK;
else if (fnames[i][0] == C_REG && (mode&0111)) fnames[i][0] = C_EXE;
+#ifdef AUTO_EXPAND
+ else if (Isarchive(fnames[i]+1)) fnames[i][0] = C_DIR;
+#endif
}
else {
/* fprintf(stderr,"problems 'stat-ing' files\n");*/
@@ -784,11 +859,13 @@
/***************************************************/
+#ifdef FOO
static int cd_able(str)
char *str;
{
return ((str[0] == C_DIR || str[0] == C_LNK));
}
+#endif /* FOO */
/***************************************************/
@@ -829,24 +906,28 @@
int len;
len = strlen(filename);
-
+
if (c>=' ' && c<'\177') { /* printable characters */
/* note: only allow 'piped commands' in savemode... */
+#undef PREVENT_SPACES /* Spaces are fine in filenames. */
+#ifdef PREVENT_SPACES
/* only allow spaces in 'piped commands', not filenames */
if (c==' ' && (!ISPIPE(filename[0]) || curPos==0)) return (-1);
+#endif
/* only allow vertbars in 'piped commands', not filenames */
if (c=='|' && curPos!=0 && !ISPIPE(filename[0])) return(-1);
if (len >= MAXFNLEN-1) return(-1); /* max length of string */
+
xvbcopy(&filename[curPos], &filename[curPos+1], (size_t) (len-curPos+1));
filename[curPos]=c; curPos++;
scrollToFileName();
}
- else if (c=='\010' || c=='\177') { /* BS or DEL */
+ else if (c=='\010') { /* BS */
if (curPos==0) return(-1); /* at beginning of str */
xvbcopy(&filename[curPos], &filename[curPos-1], (size_t) (len-curPos+1));
curPos--;
@@ -871,7 +952,7 @@
curPos = len;
}
- else if (c=='\004') { /* ^D: delete character at curPos */
+ else if (c=='\004' || c=='\177') { /* ^D or DEL: delete character at curPos */
if (curPos==len) return(-1);
xvbcopy(&filename[curPos+1], &filename[curPos], (size_t) (len-curPos));
}
@@ -918,19 +999,19 @@
{
/* called to 'auto complete' a filename being entered. If the name that
has been entered so far is anything but a simple filename (ie, has
- spaces, pipe char, '/', etc) fails. If it is a simple filename,
+ spaces, pipe char, '/', etc) fails. If it is a simple filename,
looks through the name list to find something that matches what's already
been typed. If nothing matches, it fails. If more than one thing
matches, it sets the name to the longest string that the multiple
- matches have in common, and succeeds (and beeps).
+ matches have in common, and succeeds (and beeps).
If only one matches, sets the string to the match and succeeds.
-
+
returns zero on failure, non-zero on success */
-
+
int i, firstmatch, slen, nummatch, cnt;
/* is filename a simple filename? */
- if (strlen(filename)==0 ||
+ if (strlen(filename)==0 ||
ISPIPE(filename[0]) ||
index(filename, '/') ||
filename[0]=='~' ) return 0;
@@ -946,7 +1027,7 @@
firstmatch = i;
/* count # of matches */
- for (i=firstmatch, nummatch=0;
+ for (i=firstmatch, nummatch=0;
ienPos) enPos = curPos;
-
+
if (stPos>len) stPos = (len>0) ? len-1 : 0;
if (enPos>len) enPos = (len>0) ? len-1 : 0;
-
+
/* while substring is shorter than window, inc enPos */
-
+
while (XTextWidth(mfinfo, &filename[stPos], enPos-stPos) < DNAMWIDE
&& enPos=0) MBSelect(&colMB, bnum);
}
-
+
else if (group == F_FORMAT) {
MBSelect(&fmtMB, bnum);
- if (MBWhich(&fmtMB) == F_XBM) { /* turn off all but B/W */
+ if (MBWhich(&fmtMB) == F_XBM ||
+ MBWhich(&fmtMB) == F_WBMP) { /* turn off all but B/W */
colMB.dim[F_FULLCOLOR] = 1;
colMB.dim[F_GREYSCALE] = 1;
colMB.dim[F_BWDITHER] = 0;
@@ -1322,10 +1501,10 @@
colMB.dim[F_GREYSCALE] = 0;
colMB.dim[F_BWDITHER] = 0;
colMB.dim[F_REDUCED] = (picType==PIC8) ? 0 : 1;
- if (picType!=PIC8 && MBWhich(&colMB)==F_REDUCED)
+ if (picType!=PIC8 && MBWhich(&colMB)==F_REDUCED)
MBSelect(&colMB, F_FULLCOLOR);
}
-
+
if (MBWhich(&fmtMB) == F_FILELIST) {
MBSetActive(&colMB, 0);
CBSetActive(&savenormCB, 0);
@@ -1337,12 +1516,12 @@
}
}
-
+
/***************************************/
static void changeSuffix()
{
- /* see if there's a common suffix at the end of the filename.
+ /* see if there's a common suffix at the end of the filename.
if there is, remember what case it was (all caps or all lower), lop
it off, and replace it with a new appropriate suffix, in the
same case */
@@ -1356,7 +1535,7 @@
suffix++; /* point to first letter of the suffix */
/* check for all-caposity */
- for (sp = suffix, allcaps=1; *sp; sp++)
+ for (sp = suffix, allcaps=1; *sp; sp++)
if (islower(*sp)) allcaps = 0;
/* copy the suffix into an all-lower-case buffer */
@@ -1380,14 +1559,33 @@
(strcmp(lowsuf,"eps" )==0) ||
(strcmp(lowsuf,"rgb" )==0) ||
(strcmp(lowsuf,"tga" )==0) ||
- (strcmp(lowsuf,"xpm" )==0) ||
(strcmp(lowsuf,"fits")==0) ||
(strcmp(lowsuf,"fts" )==0) ||
+#ifdef HAVE_JPEG
(strcmp(lowsuf,"jpg" )==0) ||
(strcmp(lowsuf,"jpeg")==0) ||
(strcmp(lowsuf,"jfif")==0) ||
+#endif
+#ifdef HAVE_JP2K
+ (strcmp(lowsuf,"jpc" )==0) ||
+ (strcmp(lowsuf,"jp2" )==0) ||
+#endif
+#ifdef HAVE_TIFF
(strcmp(lowsuf,"tif" )==0) ||
- (strcmp(lowsuf,"tiff")==0)) {
+ (strcmp(lowsuf,"tiff")==0) ||
+#endif
+#ifdef HAVE_PNG
+ (strcmp(lowsuf,"png" )==0) ||
+#endif
+ (strcmp(lowsuf,"wbmp")==0) ||
+ (strcmp(lowsuf,"xpm" )==0) ||
+ (strcmp(lowsuf,"tiff")==0) ||
+ (strcmp(lowsuf,"mag" )==0) ||
+ (strcmp(lowsuf,"pic" )==0) ||
+ (strcmp(lowsuf,"mki" )==0) ||
+ (strcmp(lowsuf,"pi" )==0) ||
+ (strcmp(lowsuf,"p2" )==0) ||
+ (strcmp(lowsuf,"pcd" )==0)) {
/* found one. set lowsuf = to the new suffix, and tack on to filename */
@@ -1401,7 +1599,7 @@
case F_GIF: strcpy(lowsuf,"gif"); break;
case F_PM: strcpy(lowsuf,"pm"); break;
case F_PBMRAW:
- case F_PBMASCII: if (col == F_FULLCOLOR || col == F_REDUCED)
+ case F_PBMASCII: if (col == F_FULLCOLOR || col == F_REDUCED)
strcpy(lowsuf,"ppm");
else if (col == F_GREYSCALE) strcpy(lowsuf,"pgm");
else if (col == F_BWDITHER) strcpy(lowsuf,"pbm");
@@ -1410,6 +1608,7 @@
case F_XBM: strcpy(lowsuf,"xbm"); break;
case F_SUNRAS: strcpy(lowsuf,"ras"); break;
case F_BMP: strcpy(lowsuf,"bmp"); break;
+ case F_WBMP: strcpy(lowsuf,"wbmp"); break;
case F_PS: strcpy(lowsuf,"ps"); break;
case F_IRIS: strcpy(lowsuf,"rgb"); break;
case F_TARGA: strcpy(lowsuf,"tga"); break;
@@ -1420,16 +1619,46 @@
case F_JPEG: strcpy(lowsuf,"jpg"); break;
#endif
+#ifdef HAVE_JP2K
+ case F_JPC: strcpy(lowsuf,"jpc"); break;
+ case F_JP2: strcpy(lowsuf,"jp2"); break;
+#endif
+
#ifdef HAVE_TIFF
case F_TIFF: strcpy(lowsuf,"tif"); break;
#endif
+
+#ifdef HAVE_PNG
+ case F_PNG: strcpy(lowsuf,"png"); break;
+#endif
+
+#ifdef HAVE_MAG
+ case F_MAG: strcpy(lowsuf,"mag"); break;
+#endif
+
+#ifdef HAVE_PIC
+ case F_PIC: strcpy(lowsuf,"pic"); break;
+#endif
+
+#ifdef HAVE_MAKI
+ case F_MAKI: strcpy(lowsuf,"mki"); break;
+#endif
+
+#ifdef HAVE_PI
+ case F_PI: strcpy(lowsuf,"pi"); break;
+#endif
+
+#ifdef HAVE_PIC2
+ case F_PIC2: strcpy(lowsuf,"p2"); break;
+#endif
}
+
if (allcaps) { /* upper-caseify lowsuf */
- for (sp=lowsuf; *sp; sp++)
+ for (sp=lowsuf; *sp; sp++)
*sp = (islower(*sp)) ? toupper(*sp) : *sp;
}
-
+
/* one other case: if the original suffix started with a single
capital letter, make the new suffix start with a single cap */
if (isupper(suffix[0])) lowsuf[0] = toupper(lowsuf[0]);
@@ -1439,7 +1668,7 @@
}
}
-
+
/***************************************************/
int DirCheckCD()
@@ -1462,7 +1691,7 @@
static int FNameCdable()
{
/* returns '1' if filename is a directory, and goes there */
-
+
char newpath[1024];
struct stat st;
int retval = 0;
@@ -1490,6 +1719,11 @@
}
#endif
+#ifdef AUTO_EXPAND
+ Mkvdir(newpath);
+ Dirtovd(newpath);
+#endif
+
if (stat(newpath, &st)==0) {
int isdir;
@@ -1518,7 +1752,7 @@
retval = 1;
}
}
-
+
return retval;
}
@@ -1549,8 +1783,8 @@
*up='\0';
if (*uname=='\0') { /* no name. substitute ~ with $HOME */
- char *homedir;
- homedir = (char *) getenv("HOME");
+ const char *homedir;
+ homedir = (const char *) getenv("HOME");
if (homedir == NULL) homedir = ".";
strcpy(tmp,homedir);
strcat(tmp,sp);
@@ -1574,12 +1808,12 @@
/***************************************/
FILE *OpenOutFile(filename)
- char *filename;
+ const char *filename;
{
/* opens file for output. does various error handling bits. Returns
an open file pointer if success, NULL if failure */
- FILE *fp;
+ FILE *fp = NULL;
struct stat st;
if (!filename || filename[0] == '\0') return NULL;
@@ -1587,7 +1821,11 @@
dopipe = 0;
/* make sure we're in the correct directory */
+#ifdef AUTO_EXPAND
+ if (strlen(path)) Chvdir(path);
+#else
if (strlen(path)) chdir(path);
+#endif
if (ISPIPE(filename[0])) { /* do piping */
/* make up some bogus temp file to put this in */
@@ -1596,23 +1834,34 @@
#else
strcpy(outFName, "[]xvXXXXXX.lis");
#endif
+#ifdef USE_MKSTEMP
+ fp = fdopen(mkstemp(outFName), "w");
+#else
mktemp(outFName);
+#endif
dopipe = 1;
}
- /* see if file exists (ie, we're overwriting) */
- if (stat(outFName, &st)==0) { /* stat succeeded, file must exist */
- static char *foo[] = { "\nOk", "\033Cancel" };
- char str[512];
+#ifdef USE_MKSTEMP /* (prior) nonexistence of file is already guaranteed by */
+ if (!dopipe) /* mkstemp(), but now mkstemp() itself has created it */
+#endif
+ /* see if file exists (i.e., we're overwriting) */
+ if (stat(outFName, &st)==0) { /* stat succeeded, file must exist */
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char str[512];
- sprintf(str,"Overwrite existing file '%s'?", outFName);
- if (PopUp(str, foo, 2)) return NULL;
- }
-
+ sprintf(str,"Overwrite existing file '%s'?", outFName);
+ if (PopUp(str, labels, 2)) return NULL;
+ }
+
+
+ /* Open file (if not already open via mkstemp()) */
+#ifdef USE_MKSTEMP
+ if (!dopipe)
+#endif
+ fp = fopen(outFName, "w");
- /* Open file */
- fp = fopen(outFName, "w");
if (!fp) {
char str[512];
sprintf(str,"Can't write file '%s'\n\n %s.",outFName, ERRSTR(errno));
@@ -1622,12 +1871,12 @@
return fp;
}
-
+
/***************************************/
int CloseOutFile(fp, filename, failed)
FILE *fp;
- char *filename;
+ const char *filename;
int failed;
{
char buf[64];
@@ -1642,9 +1891,8 @@
return 1;
}
-
+
if (fclose(fp) == EOF) {
- static char *foo[] = { "\nWeird!" };
char str[512];
sprintf(str,"Can't close file '%s'\n\n %s.",outFName, ERRSTR(errno));
ErrPopUp(str, "\nWeird!");
@@ -1666,7 +1914,7 @@
}
SetISTR(ISTR_INFO,"Successfully wrote '%s'%s", outFName, buf);
-
+
if (dopipe) {
char cmd[512], str[1024];
int i;
@@ -1709,7 +1957,7 @@
return 0;
}
-
+
static byte rBW[2], gBW[2], bBW[2];
@@ -1732,7 +1980,7 @@
bwpic = (byte *) NULL;
*nc = numcols; *rpp = rMap; *gpp = gMap; *bpp = bMap;
- /* quick check: if we're saving a 24-bit image, then none of this
+ /* quick check: if we're saving a 24-bit image, then none of this
complicated 'reduced'/dithered/smoothed business comes into play.
'reduced' is disabled, for semi-obvious reasons, in 24-bit mode,
as is 'dithered'. If 'smoothed', and we're saving at current
@@ -1744,32 +1992,32 @@
if we're saving B/W DITHERED, and deal accordingly */
- if (ptype == PIC24) {
+ if (ptype == PIC24) {
if (color != F_BWDITHER) return NULL;
else { /* generate a bw-dithered version */
byte *p24, *thepic;
-
+
thepic = pic;
p24 = GammifyPic24(thepic, pw, ph);
if (p24) thepic = p24;
-
+
/* generate a FSDithered 1-byte per pixel image */
bwpic = FSDither(thepic, PIC24, pw, ph, NULL,NULL,NULL, 0, 1);
if (!bwpic) FatalError("unable to malloc dithered picture (DoSave)");
-
+
if (p24) free(p24); /* won't need it any more */
-
+
/* build a BW colormap */
rBW[0] = gBW[0] = bBW[0] = 0;
rBW[1] = gBW[1] = bBW[1] = 255;
-
+
*rpp = rBW; *gpp = gBW; *bpp = bBW;
*nc = 2;
-
+
return bwpic;
}
}
-
+
/* ptype == PIC8 ... */
@@ -1777,7 +2025,7 @@
*nc = numcols; *rpp = rMap; *gpp = gMap; *bpp = bMap;
if (color==F_REDUCED) { *rpp = rdisp; *gpp = gdisp; *bpp = bdisp; }
- /* if DITHER or SMOOTH, and color==FULLCOLOR or GREY,
+ /* if DITHER or SMOOTH, and color==FULLCOLOR or GREY,
make color=REDUCED, so it will be written with the correct colortable */
if ((epicMode == EM_DITH || epicMode == EM_SMOOTH) && color != F_REDUCED) {
@@ -1789,7 +2037,7 @@
*rpp = gray; *gpp = gray; *bpp = gray;
}
}
-
+
@@ -1823,8 +2071,8 @@
* and whether or not it should be freed when we're done with it. The 'pic'
* returned is the desired portion of 'cpic' or 'epic' if there is a
* selection, and the saveselCB is enabled, or alternately, it's the
- * whole cpic or epic.
- *
+ * whole cpic or epic.
+ *
* if selection does not intersect cpic/epic, returns cpic/epic
* NEVER RETURNS NULL
*/
@@ -1837,7 +2085,7 @@
if (savenormCB.val) { thepic = cpic; pw = cWIDE; ph = cHIGH; }
else { thepic = epic; pw = eWIDE; ph = eHIGH; }
- *pwide = pw; *phigh = ph;
+ *pwide = pw; *phigh = ph;
if (saveselCB.active && saveselCB.val && HaveSelection()) {
@@ -1862,7 +2110,7 @@
CoordP2E(x2,y2, &x2, &y2);
slx = x1; sly = y1; slw = x2-x1; slh = y2-y1;
CropRect2Rect(&slx, &sly, &slw, &slh, 0,0,pw,ph);
-
+
if (slw<1 || slh<1) { slx = sly = 0; slw=pw; slh=ph; }
if (slx!=0 || sly!=0 || slw!=pw || slh!=ph) {
@@ -1871,7 +2119,7 @@
}
}
- *pwide = slw; *phigh = slh;
+ *pwide = slw; *phigh = slh;
}
return thepic;
@@ -1884,11 +2132,11 @@
byte **rmapP, **gmapP, **bmapP;
{
/* handles the whole ugly mess of the various save options.
- * returns an image, of type 'ptypeP', size 'wP,hP'.
+ * returns an image, of type 'ptypeP', size 'wP,hP'.
* if (*ptypeP == PIC8), also returns numcols 'ncP', and the r,g,b map
* to use rmapP, gmapP, bmapP.
*
- * if freeP is set, image can safely be freed after it is saved
+ * if freeP is set, image can safely be freed after it is saved
*/
byte *pic1, *pic2;
@@ -1896,9 +2144,9 @@
pic1 = handleNormSel(&ptype, &w, &h, &pfree);
- pic2 = handleBWandReduced(pic1, ptype, w,h, MBWhich(&colMB),
+ pic2 = handleBWandReduced(pic1, ptype, w,h, MBWhich(&colMB),
ncP, rmapP, gmapP, bmapP);
- if (pic2) {
+ if (pic2) {
if (pfree) free(pic1);
pic1 = pic2;
pfree = 1;
@@ -1906,7 +2154,7 @@
}
- if (ptype == PIC24) {
+ if (ptype == PIC24) {
pic2 = GammifyPic24(pic1, w, h);
if (pic2) {
if (pfree) free(pic1);
@@ -1920,7 +2168,7 @@
return pic1;
}
-
+
/***************************************/
void GetSaveSize(wP, hP)
int *wP, *hP;
@@ -1947,7 +2195,7 @@
CoordP2E(x2,y2, &x2, &y2);
slx = x1; sly = y1; slw = x2-x1; slh = y2-y1;
CropRect2Rect(&slx, &sly, &slw, &slh, 0,0,eWIDE,eHIGH);
-
+
if (slw<1 || slh<1) { slx = sly = 0; slw=eWIDE; slh=eHIGH; }
}
}
@@ -1982,8 +2230,8 @@
if (stat(namelist[curname], &origStat)==0) {
haveStat = 1;
- if (DEBUG) fprintf(stderr," origStat.size=%ld, origStat.mtime=%d\n",
- origStat.st_size, origStat.st_mtime);
+ if (DEBUG) fprintf(stderr," origStat.size=%ld, origStat.mtime=%ld\n",
+ (long)origStat.st_size, (long)origStat.st_mtime);
}
}
}
@@ -1993,7 +2241,7 @@
int CheckPoll(del)
int del;
{
- /* returns '1' if the file has been modified, and either
+ /* returns '1' if the file has been modified, and either
A) the file has stabilized (st = lastStat), or
B) 'del' seconds have gone by since the file last changed size
*/
@@ -2007,14 +2255,14 @@
(strcmp(namelist[curname], STDINSTR)!=0)) {
if (stat(namelist[curname], &st)==0) {
- if (DEBUG) fprintf(stderr," st.size=%ld, st.mtime=%d\n",
- st.st_size, st.st_mtime);
+ if (DEBUG) fprintf(stderr," st.size=%ld, st.mtime=%ld\n",
+ (long)st.st_size, (long)st.st_mtime);
if ((st.st_size == origStat.st_size) &&
(st.st_mtime == origStat.st_mtime)) return 0; /* no change */
/* if it's changed since last looked ... */
- if (!haveLastStat ||
+ if (!haveLastStat ||
st.st_size != lastStat.st_size ||
st.st_mtime != lastStat.st_mtime) {
xvbcopy((char *) &st, (char *) &lastStat, sizeof(struct stat));
@@ -2031,7 +2279,7 @@
}
}
}
-
+
return 0;
}
@@ -2042,14 +2290,13 @@
{
/* called when file 'name' has been deleted. If any of the browsers
were showing the directory that the file was in, does a rescan() */
-
- int i;
+
char buf[MAXPATHLEN + 2], *tmp;
strcpy(buf, name);
- tmp = BaseName(buf);
+ tmp = (char *) BaseName(buf); /* intentionally losing constness */
*tmp = '\0'; /* truncate after last '/' */
-
+
if (strcmp(path, buf)==0) LoadCurrentDirectory();
}
@@ -2062,3 +2309,164 @@
}
+#ifdef HAVE_PIC2
+/**** Stuff for PIC2Dialog box ****/
+FILE *pic2_OpenOutFile(filename, append)
+char *filename;
+int *append;
+{
+ /* opens file for output. does various error handling bits. Returns
+ an open file pointer if success, NULL if failure */
+
+ FILE *fp = NULL;
+ struct stat st;
+
+ if (!filename || filename[0] == '\0')
+ return (NULL);
+ strcpy(outFName, filename);
+ dopipe = 0;
+
+ /* make sure we're in the correct directory */
+#ifdef AUTO_EXPAND
+ if (strlen(path)) Chvdir(path);
+#else
+ if (strlen(path)) chdir(path);
+#endif
+
+ if (ISPIPE(filename[0])) { /* do piping */
+ /* make up some bogus temp file to put this in */
+#ifndef VMS
+ sprintf(outFName, "%s/xvXXXXXX", tmpdir);
+#else
+ strcpy(outFName, "[]xvXXXXXX.lis");
+#endif
+#ifdef USE_MKSTEMP
+ fp = fdopen(mkstemp(outFName), "w");
+#else
+ mktemp(outFName);
+#endif
+ dopipe = 1;
+ }
+
+
+ /* see if file exists (i.e., we're overwriting) */
+ *append = 0;
+#ifdef USE_MKSTEMP
+ if (!dopipe)
+#endif
+ if (stat(outFName, &st)==0) { /* stat succeeded, file must exist */
+ if (ReadFileType(outFName) != RFT_PIC2) {
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char str[512];
+
+ sprintf(str,"Overwrite existing file '%s'?", outFName);
+ if (PopUp(str, labels, 2))
+ return (NULL);
+ } else {
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char str[512];
+
+ sprintf(str,"Append to existing file '%s'?", outFName);
+ if (PopUp(str, labels, 2)) {
+ sprintf(str,"Overwrite existing file '%s'?", outFName);
+ if (PopUp(str, labels, 2))
+ return (NULL);
+ } else
+ *append = 1;
+ }
+ }
+
+ /* Open file */
+#ifdef USE_MKSTEMP
+ if (!dopipe)
+#endif
+ fp = *append ? fopen(outFName, "r+") : fopen(outFName, "w");
+ if (!fp) {
+ char str[512];
+ sprintf(str,"Can't write file '%s'\n\n %s.",outFName, ERRSTR(errno));
+ ErrPopUp(str, "\nBummer");
+ return (NULL);
+ }
+
+ return (fp);
+}
+
+
+/***************************************/
+void pic2_KillNullFile(fp)
+FILE *fp;
+{
+ fseek(fp, (size_t) 0, SEEK_END);
+ if (ftell(fp) > 0) {
+ fclose(fp);
+ return;
+ } else {
+ fclose(fp);
+ unlink(outFName);
+ return;
+ }
+}
+#endif /* HAVE_PIC2 */
+
+
+#ifdef HAVE_MGCSFX
+/**** Stuff for MGCSFX Dialog box ****/
+/***************************************/
+int OpenOutFileDesc(filename)
+ char *filename;
+{
+ /* opens file for output. does various error handling bits. Returns
+ an open file pointer if success, NULL if failure */
+
+ int fd;
+ struct stat st;
+
+ if (!filename || filename[0] == '\0') return -1;
+ strcpy(outFName, filename);
+ dopipe = 0;
+
+ /* make sure we're in the correct directory */
+#ifdef AUTO_EXPAND
+ if (strlen(path)) Chvdir(path);
+#else
+ if (strlen(path)) chdir(path);
+#endif
+
+ if (ISPIPE(filename[0])) { /* do piping */
+ /* make up some bogus temp file to put this in */
+#ifndef VMS
+ sprintf(outFName, "%s/xvXXXXXX", tmpdir);
+#else
+ strcpy(outFName, "[]xvXXXXXX.lis");
+#endif
+#ifdef USE_MKSTEMP
+ close(mkstemp(outFName));
+#else
+ mktemp(outFName);
+#endif
+ dopipe = 1;
+ }
+
+
+ /* if didn't just create it, see if file exists (i.e., we're overwriting) */
+ if (!dopipe && stat(outFName, &st)==0) { /* stat succeeded, file exists */
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+ char str[512];
+
+ sprintf(str,"Overwrite existing file '%s'?", outFName);
+ if (PopUp(str, labels, 2)) return -1;
+ }
+
+
+ /* Open file */
+ fd = open(outFName, O_WRONLY | O_CREAT | O_TRUNC, (0644));
+ if (fd < 0) {
+ char str[512];
+ sprintf(str,"Can't write file '%s'\n\n %s.", outFName, ERRSTR(errno));
+ ErrPopUp(str, "\nBummer");
+ return -1;
+ }
+
+ return fd;
+}
+#endif /* HAVE_MGCSFX */
diff -ru xv-3.10a/xvevent.c xv-3.10a-enhancements/xvevent.c
--- xv-3.10a/xvevent.c 1995-01-23 15:20:24.000000000 -0800
+++ xv-3.10a-enhancements/xvevent.c 2007-05-12 15:27:11.000000000 -0700
@@ -39,8 +39,15 @@
static Cursor dropper = 0, pen = 0, blur = 0;
+static void SelectDispMB PARM((int));
+static void Select24to8MB PARM((int));
+static void SelectRootMB PARM((int));
+static void SelectWindowMB PARM((int));
+static void SelectSizeMB PARM((int));
+
+static void DoPrint PARM((void));
static void debugEvent PARM((XEvent *));
-static char *win2name PARM((Window));
+static const char *win2name PARM((Window));
static void handleButtonEvent PARM((XEvent *, int *, int *));
static void handleKeyEvent PARM((XEvent *, int *, int *));
static void zoomCurs PARM((u_int));
@@ -64,6 +71,8 @@
static void annotatePic PARM((void));
+static int debkludge_offx;
+static int debkludge_offy;
/****************/
int EventLoop()
@@ -71,13 +80,25 @@
{
XEvent event;
int retval,done,waiting;
- time_t orgtime, curtime;
+#ifdef USE_TICKS
+ clock_t waitsec_ticks=0L, orgtime_ticks=0L, curtime_ticks;
+ clock_t elapsed_ticks=0L, remaining_interval;
+#else
+ time_t orgtime=0L, curtime;
+#endif
#ifndef NOSIGNAL
signal(SIGQUIT, onInterrupt);
#endif
+ if (startGrab == 1) {
+ startGrab = 2;
+ FakeButtonPress(&but[BGRAB]);
+ FakeKeyPress(ctrlW, XK_Return);
+ return(1);
+ }
+
/* note: there's no special event handling if we're using the root window.
if we're using the root window, we will recieve NO events for mainW */
@@ -100,18 +121,24 @@
while (!done) {
- if (waitsec > -1 && canstartwait && !waiting && XPending(theDisp)==0) {
- /* we wanna wait, we can wait, we haven't started waiting yet, and
- all pending events (ie, drawing the image the first time)
+ if (waitsec >= 0.0 && canstartwait && !waiting && XPending(theDisp)==0) {
+ /* we wanna wait, we can wait, we haven't started waiting yet, and
+ all pending events (ie, drawing the image the first time)
have been dealt with: START WAITING */
- time((time_t *) &orgtime);
+#ifdef USE_TICKS
+ waitsec_ticks = (clock_t)(waitsec * CLK_TCK);
+ orgtime_ticks = times(NULL); /* unclear if NULL valid, but OK on Linux */
+#else
+ orgtime = time(NULL);
+#endif
waiting = 1;
}
- /* if there's an XEvent pending *or* we're not doing anything
+ /* if there's an XEvent pending *or* we're not doing anything
in real-time (polling, flashing the selection, etc.) get next event */
- if ((waitsec==-1 && !polling && !HaveSelection()) || XPending(theDisp)>0) {
+ if ((waitsec<0.0 && !polling && !HaveSelection()) || XPending(theDisp)>0)
+ {
XNextEvent(theDisp, &event);
retval = HandleEvent(&event,&done);
}
@@ -121,7 +148,7 @@
DrawSelection(0);
DrawSelection(1);
XFlush(theDisp);
- Timer(200);
+ Timer(200); /* milliseconds */
}
if (polling) {
@@ -129,13 +156,32 @@
else if (!XPending(theDisp)) sleep(1);
}
- if (waitsec>-1 && waiting) {
- time((time_t *) &curtime);
- if (curtime - orgtime < waitsec) sleep(1);
- else {
- if (waitloop) return NEXTLOOP;
- else return NEXTQUIT;
- }
+ if (waitsec>=0.0 && waiting) {
+#ifdef USE_TICKS
+ curtime_ticks = times(NULL); /* value in ticks */
+ if (curtime_ticks < orgtime_ticks) {
+ /* clock ticks rolled over: need to correct for that (i.e.,
+ * curtime_ticks is presumably quite small, while orgtime_ticks
+ * should be close to LONG_MAX, so do math accordingly--any way
+ * to check whether clock_t is *not* a signed long?) */
+ elapsed_ticks = curtime_ticks + (LONG_MAX - orgtime_ticks);
+ } else
+ elapsed_ticks = curtime_ticks - orgtime_ticks;
+ remaining_interval = waitsec_ticks - elapsed_ticks;
+ if (remaining_interval >= (clock_t)(1 * CLK_TCK))
+ sleep(1);
+ else {
+ /* less than one second remaining: do delay in msec, then return */
+ Timer((remaining_interval * 1000L) / CLK_TCK); /* can't overflow */
+ return waitloop? NEXTLOOP : NEXTQUIT;
+ }
+#else
+ curtime = time(NULL); /* value in seconds */
+ if (curtime - orgtime < (time_t)waitsec)
+ sleep(1);
+ else
+ return waitloop? NEXTLOOP : NEXTQUIT;
+#endif
}
}
} /* while (!done) */
@@ -154,7 +200,27 @@
int *donep;
{
static int wasInfoUp=0, wasCtrlUp=0, wasDirUp=0, wasGamUp=0, wasPsUp=0;
- static int wasJpegUp=0, wasTiffUp=0;
+#ifdef HAVE_JPEG
+ static int wasJpegUp=0;
+#endif
+#ifdef HAVE_JP2K
+ static int wasJp2kUp=0;
+#endif
+#ifdef HAVE_TIFF
+ static int wasTiffUp=0;
+#endif
+#ifdef HAVE_PNG
+ static int wasPngUp=0;
+#endif
+#ifdef HAVE_PCD
+ static int wasPcdUp=0;
+#endif
+#ifdef HAVE_PIC2
+ static int wasPic2Up=0;
+#endif
+#ifdef HAVE_MGCSFX
+ static int wasMgcSfxUp=0;
+#endif
static int mainWKludge=0; /* force first mainW expose after a mainW config
to redraw all of mainW */
@@ -187,7 +253,7 @@
#ifdef VMS
static int borders_sized = 0;
-
+
if (!borders_sized && !useroot && exp_event->window == mainW) {
/*
* Initial expose of main window, find the size of the ancestor
@@ -198,13 +264,13 @@
int status, count, mwid, mhgt, x, y, w, h, b, d, mbrd;
Window root, parent, *children, crw = exp_event->window;
borders_sized = 1;
- status = XGetGeometry(theDisp, crw,
+ status = XGetGeometry(theDisp, crw,
&root, &x, &y, &mwid, &mhgt, &mbrd, &d);
-
+
for ( parent = crw, w=mwid, h=mhgt;
status && (parent != root) && (parent != vrootW); ) {
crw = parent;
- status = XQueryTree ( theDisp, crw, &root, &parent,
+ status = XQueryTree ( theDisp, crw, &root, &parent,
&children, &count );
if ( children != NULL ) XFree ( children );
}
@@ -221,7 +287,7 @@
win = exp_event->window;
x = exp_event->x; y = exp_event->y;
w = exp_event->width; h = exp_event->height;
-
+
if (PUCheckEvent (event)) break; /* event has been processed */
if (PSCheckEvent (event)) break; /* event has been processed */
@@ -229,16 +295,42 @@
if (JPEGCheckEvent(event)) break; /* event has been processed */
#endif
+#ifdef HAVE_JP2K
+ if (JP2KCheckEvent(event)) break; /* event has been processed */
+#endif
+
#ifdef HAVE_TIFF
if (TIFFCheckEvent(event)) break; /* event has been processed */
#endif
+#ifdef HAVE_PNG
+ if (PNGCheckEvent (event)) break; /* event has been processed */
+#endif
+
+ if (PCDCheckEvent(event)) break; /* event has been processed */
+
+#ifdef HAVE_PIC2
+ if (PIC2CheckEvent(event)) break; /* event has been processed */
+#endif
+
+#ifdef HAVE_PCD
+ if (PCDCheckEvent (event)) break; /* event has been processed */
+#endif
+
+#ifdef HAVE_MGCSFX
+ if (MGCSFXCheckEvent(event)) break; /* event has been processed */
+#endif
+
+#ifdef TV_MULTILINGUAL
+ if (CharsetCheckEvent(event)) break; /* event has been processed */
+#endif
+
if (GamCheckEvent (event)) break; /* event has been processed */
if (BrowseCheckEvent (event, &retval, &done)) break; /* event eaten */
if (TextCheckEvent (event, &retval, &done)) break; /* event eaten */
/* if the window doesn't do intelligent redraw, drop but last expose */
- if (exp_event->count>0 &&
+ if (exp_event->count>0 &&
win != mainW && win != ctrlW && win != dirW && win != infoW) break;
@@ -301,7 +393,7 @@
if (DEBUG) fprintf(stderr,"No configs pending.\n");
/* if (DEBUG) XClearArea(theDisp, mainW, x,y,w,h, False); */
DrawWindow(x,y,w,h);
-
+
if (HaveSelection()) DrawSelection(0);
canstartwait = 1; /* finished drawing */
@@ -314,7 +406,7 @@
else if (win == infoW) RedrawInfo(x,y,w,h);
else if (win == ctrlW) RedrawCtrl(x,y,w,h);
else if (win == dirW) RedrawDirW(x,y,w,h);
-
+
XSetClipMask(theDisp, theGC, None);
XDestroyRegion(reg);
}
@@ -324,10 +416,10 @@
else if (win == dList.win) LSRedraw(&dList,0);
else if (win == dList.scrl.win) SCRedraw(&dList.scrl);
else if (win == dnamW) RedrawDNamW();
- }
+ }
break;
-
+
case ClientMessage: {
Atom proto, delwin;
@@ -344,6 +436,9 @@
if (BrowseDelWin(client_event->window)) break;
if (TextDelWin(client_event->window)) break;
+#ifdef TV_MULTILINGUAL
+ if (CharsetDelWin(client_event->window)) break;
+#endif
if (client_event->window == infoW) InfoBox(0);
else if (client_event->window == gamW) GamBox(0);
@@ -355,10 +450,32 @@
else if (client_event->window == jpegW) JPEGDialog(0);
#endif
+#ifdef HAVE_JP2K
+ else if (client_event->window == jp2kW) JP2KDialog(0);
+#endif
+
#ifdef HAVE_TIFF
else if (client_event->window == tiffW) TIFFDialog(0);
#endif
+#ifdef HAVE_PNG
+ else if (client_event->window == pngW) PNGDialog(0);
+#endif
+
+ else if (client_event->window == pcdW) PCDDialog(0);
+
+#ifdef HAVE_PIC2
+ else if (client_event->window == pic2W) PIC2Dialog(0);
+#endif
+
+#ifdef HAVE_PCD
+ else if (client_event->window == pcdW) PCDDialog(0);
+#endif
+
+#ifdef HAVE_MGCSFX
+ else if (client_event->window == mgcsfxW) MGCSFXDialog(0);
+#endif
+
else if (client_event->window == mainW) Quit(0);
}
}
@@ -381,31 +498,35 @@
if (win==ctrlW || win==gamW || win==infoW || win==mainW || win==dirW) {
XSizeHints hints;
+#define BAD_IDEA
+#ifdef BAD_IDEA
/*
- * if there's a virtual window manager running (e.g. tvtwm / olvwm),
- * we're going to get 'cevt' values in terms of the
+ * if there is a virtual window manager running (e.g., tvtwm / olvwm),
+ * we're going to get 'cevt' values in terms of the
* 'real' root window (the one that is the size of the screen).
* We'll want to translate them into values that are in terms of
* the 'virtual' root window (the 'big' one)
*/
if (vrootW != rootW) {
- int x1,y1; Window child;
+ int x1,y1;
+ Window child;
- XTranslateCoordinates(theDisp, rootW, vrootW, cevt->x, cevt->y,
+ XTranslateCoordinates(theDisp, rootW, vrootW, cevt->x, cevt->y,
&x1, &y1, &child);
if (DEBUG) fprintf(stderr," CONFIG trans %d,%d root -> %d,%d vroot\n",
cevt->x, cevt->y, x1, y1);
cevt->x = x1; cevt->y = y1;
}
+#endif
#ifndef VMS
/* read hints for this window and adjust any position hints, but
- only if this is a 'synthetic' event sent to us by the WM
+ only if this is a 'synthetic' event sent to us by the WM
('real' events from the server have useless x,y info, since the
mainW has been reparented by the WM) */
- if (cevt->send_event &&
+ if (cevt->send_event &&
XGetNormalHints(theDisp, cevt->window, &hints)) {
if (DEBUG) fprintf(stderr," CONFIG got hints (0x%x %d,%d)\n",
@@ -439,11 +560,11 @@
* This sucks!
*
* So, if we have just loaded an image, and we get a Synthetic conf
- * that is not the desired size (eWIDExeHIGH), ignore it, as it's
+ * that is not the desired size (eWIDExeHIGH), ignore it, as it's
* just the conf generated by moving the old window. And stop
* ignoring further config events
*
- * EVIL KLUDGE: do *not* ignore configs that are <100x100. Not
+ * EVIL KLUDGE: do *not* ignore configs that are <100x100. Not
* ignoring them won't be a big performance problem, and it'll get
* around the 'I only got one config in the wrong size' problem when
* initially displaying small images
@@ -453,7 +574,7 @@
/* fprintf(stderr,"***mainw, ignore=%d, send_event=%d, evtSize=%d,%d, size=%d,%d\n", ignoreConfigs, cevt->send_event, cevt->width, cevt->height, eWIDE, eHIGH); */
- if (ignoreConfigs==1 && cevt->send_event &&
+ if (ignoreConfigs==1 && cevt->send_event &&
(cevt->width != eWIDE || cevt->height != eHIGH)) {
ignoreConfigs=0; /* ignore this one only */
break;
@@ -470,7 +591,7 @@
else {
XEvent xev;
if (DEBUG) fprintf(stderr,"No configs pend.");
-
+
if (cevt->width == eWIDE && cevt->height == eHIGH) {
if (DEBUG) fprintf(stderr,"No redraw\n");
}
@@ -478,12 +599,12 @@
if (DEBUG) fprintf(stderr,"Do full redraw\n");
Resize(cevt->width, cevt->height);
-
+
/* eat any pending expose events and do a full redraw */
while (XCheckTypedWindowEvent(theDisp, mainW, Expose, &xev)) {
XExposeEvent *exp = (XExposeEvent *) &xev;
- if (DEBUG)
+ if (DEBUG)
fprintf(stderr," ate expose (%s) (count=%d) %d,%d %dx%d\n",
exp->send_event ? "synth" : "real", exp->count,
exp->x, exp->y, exp->width, exp->height);
@@ -508,9 +629,9 @@
}
break;
-
-
+
+
case CirculateNotify:
case DestroyNotify:
case GravityNotify: break;
@@ -534,10 +655,24 @@
#ifdef HAVE_JPEG
if (wasJpegUp) { JPEGDialog(wasJpegUp); wasJpegUp=0; }
#endif
-
+#ifdef HAVE_JP2K
+ if (wasJp2kUp) { JP2KDialog(wasJpegUp); wasJp2kUp=0; }
+#endif
#ifdef HAVE_TIFF
if (wasTiffUp) { TIFFDialog(wasTiffUp); wasTiffUp=0; }
#endif
+#ifdef HAVE_PNG
+ if (wasPngUp) { PNGDialog(wasPngUp); wasPngUp=0; }
+#endif
+#ifdef HAVE_PCD
+ if (wasPcdUp) { PCDDialog(wasPcdUp); wasPcdUp=0; }
+#endif
+#ifdef HAVE_PIC2
+ if (wasPic2Up) { PIC2Dialog(wasPic2Up); wasPic2Up=0; }
+#endif
+#ifdef HAVE_MGCSFX
+ if (wasMgcSfxUp) { MGCSFXDialog(wasMgcSfxUp); wasMgcSfxUp=0; }
+#endif
}
}
}
@@ -554,7 +689,7 @@
/* don't do it if we've just switched to a root mode */
if ((unmap_event->window == mainW && dispMode == 0) ||
- (unmap_event->window == ctrlW && dispMode != 0)) {
+ (unmap_event->window == ctrlW && dispMode != 0)) {
if (autoclose) {
if (autoclose>1) autoclose -= 2; /* grab kludge */
@@ -572,10 +707,24 @@
#ifdef HAVE_JPEG
if (jpegUp) { wasJpegUp = jpegUp; JPEGDialog(0); }
#endif
-
+#ifdef HAVE_JP2K
+ if (jp2kUp) { wasJp2kUp = jp2kUp; JP2KDialog(0); }
+#endif
#ifdef HAVE_TIFF
if (tiffUp) { wasTiffUp = tiffUp; TIFFDialog(0); }
#endif
+#ifdef HAVE_PNG
+ if (pngUp) { wasPngUp = pngUp; PNGDialog(0); }
+#endif
+#ifdef HAVE_PCD
+ if (pcdUp) { wasPcdUp = pcdUp; PCDDialog(0); }
+#endif
+#ifdef HAVE_PIC2
+ if (pic2Up) { wasPic2Up = pic2Up; PIC2Dialog(0); }
+#endif
+#ifdef HAVE_MGCSFX
+ if (mgcsfxUp) { wasMgcSfxUp = mgcsfxUp; MGCSFXDialog(0); }
+#endif
}
}
}
@@ -586,8 +735,8 @@
XReparentEvent *reparent_event = (XReparentEvent *) event;
if (DEBUG) {
- fprintf(stderr,"Reparent: mainW=%x ->win=%x ->ev=%x ->parent=%x ",
- (u_int) mainW, (u_int) reparent_event->window,
+ fprintf(stderr,"Reparent: mainW=%x ->win=%x ->ev=%x ->parent=%x ",
+ (u_int) mainW, (u_int) reparent_event->window,
(u_int) reparent_event->event, (u_int) reparent_event->parent);
fprintf(stderr,"%d,%d\n", reparent_event->x, reparent_event->y);
}
@@ -598,7 +747,7 @@
p_offx = p_offy = 0; /* topleft correction for WMs titlebar */
- if (ch_offx == 0 && ch_offy == 0) {
+ if (ch_offx == 0 && ch_offy == 0) {
/* looks like the user is running MWM or OLWM */
XWindowAttributes xwa;
@@ -609,8 +758,8 @@
XSync(theDisp, False);
XGetWindowAttributes(theDisp, mainW, &xwa);
-
- if (DEBUG)
+
+ if (DEBUG)
fprintf(stderr,"XGetAttr: mainW %d,%d %dx%d\n", xwa.x, xwa.y,
xwa.width, xwa.height);
@@ -620,8 +769,8 @@
XSync(theDisp, False);
XGetWindowAttributes(theDisp, reparent_event->parent, &xwa);
-
- if (DEBUG)
+
+ if (DEBUG)
fprintf(stderr,"XGetAttr: parent %d,%d %dx%d\n", xwa.x, xwa.y,
xwa.width, xwa.height);
}
@@ -641,42 +790,75 @@
p_offy = xwa.y;
}
-
+ /* Gather info to keep right border inside */
+ {
+ Window current;
+ Window root_r;
+ Window parent_r;
+ Window *children_r;
+ unsigned int nchildren_r;
+ XWindowAttributes xwa;
+
+ parent_r=mainW;
+ current=mainW;
+ do {
+ current=parent_r;
+ XQueryTree(theDisp, current, &root_r, &parent_r,
+ &children_r, &nchildren_r);
+ if (children_r!=NULL) {
+ XFree(children_r);
+ }
+ } while (parent_r!=root_r && parent_r!=vrootW);
+ XGetWindowAttributes(theDisp, current, &xwa);
+ debkludge_offx = eWIDE-xwa.width+p_offx;
+ debkludge_offy = eHIGH-xwa.height+p_offy;
+ }
+
+#if 0
+ /* 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.
+ */
/* move window around a bit... */
{
XWindowAttributes xwa;
+
GetWindowPos(&xwa);
+ //fprintf(stderr, "RAC: orig window pos %d,%d\n", xwa.x, xwa.y);
+
xwa.width = eWIDE; xwa.height = eHIGH;
-
+ //fprintf(stderr, "RAC: image size now %d,%d\n", xwa.width, xwa.height);
+
/* try to keep the damned thing on-screen, if possible */
- if (xwa.x + xwa.width > dispWIDE) xwa.x = dispWIDE - xwa.width;
- if (xwa.y + xwa.height > dispHIGH) xwa.y = dispHIGH - xwa.height;
+ if (xwa.x + xwa.width > vrWIDE) xwa.x = vrWIDE - xwa.width;
+ if (xwa.y + xwa.height > vrHIGH) xwa.y = vrHIGH - xwa.height;
if (xwa.x < 0) xwa.x = 0;
if (xwa.y < 0) xwa.y = 0;
-
+
+ //fprintf(stderr, "RAC: moving window to %d,%d\n", xwa.x, xwa.y);
SetWindowPos(&xwa);
}
-
+#endif
}
}
break;
-
+
case EnterNotify:
case LeaveNotify: {
XCrossingEvent *cross_event = (XCrossingEvent *) event;
if (cross_event->window == mainW || 0
/* (cross_event->window == gamW && cmapInGam) */ ) {
-
+
if (cross_event->type == EnterNotify && cross_event->window == mainW) {
zoomCurs(cross_event->state);
}
- if (cross_event->type == EnterNotify && LocalCmap && !ninstall)
+ if (cross_event->type == EnterNotify && LocalCmap && !ninstall)
XInstallColormap(theDisp,LocalCmap);
- if (cross_event->type == LeaveNotify && LocalCmap && !ninstall)
+ if (cross_event->type == LeaveNotify && LocalCmap && !ninstall)
XUninstallColormap(theDisp,LocalCmap);
}
}
@@ -685,12 +867,12 @@
case SelectionClear: break;
- case SelectionRequest:
+ case SelectionRequest:
{
XSelectionRequestEvent *xsrevt = (XSelectionRequestEvent *) event;
XSelectionEvent xse;
- if (xsrevt->owner != ctrlW ||
+ if (xsrevt->owner != ctrlW ||
xsrevt->selection != XA_PRIMARY ||
xsrevt->target != XA_STRING) { /* can't do it. */
xse.property = None;
@@ -702,7 +884,7 @@
if (xse.property != None) {
xerrcode = 0;
XChangeProperty(theDisp, xsrevt->requestor, xse.property,
- XA_STRING, 8, PropModeReplace,
+ XA_STRING, 8, PropModeReplace,
(byte *) ((xevPriSel) ? xevPriSel : "\0"),
(int) ((xevPriSel) ? strlen(xevPriSel)+1 : 1));
XSync(theDisp, False);
@@ -721,9 +903,9 @@
XSync(theDisp, False);
}
break;
-
-
-
+
+
+
default: break; /* ignore unexpected events */
} /* switch */
@@ -734,11 +916,11 @@
/***********************************/
-void SelectDispMB(i)
+static void SelectDispMB(i)
int i;
{
/* called to handle selection of a dispMB item */
-
+
if (i<0 || i>=DMB_MAX) return;
if (dispMB.dim[i]) return; /* disabled */
@@ -747,36 +929,36 @@
if (i==DMB_RAW) epicMode = EM_RAW;
else if (i==DMB_DITH) epicMode = EM_DITH;
else epicMode = EM_SMOOTH;
-
- SetEpicMode();
+
+ SetEpicMode();
GenerateEpic(eWIDE, eHIGH);
DrawEpic();
SetCursors(-1);
}
-
+
else if (i==DMB_COLRW) { /* toggle rw on/off */
dispMB.flags[i] = !dispMB.flags[i];
allocMode = (dispMB.flags[i]) ? AM_READWRITE : AM_READONLY;
ChangeCmapMode(colorMapMode, 1, 0);
}
-
+
else if (i>=DMB_COLNORM && i<=DMB_COLSTDC && !dispMB.flags[i]) {
switch (i) {
- case DMB_COLNORM:
- ChangeCmapMode(CM_NORMAL, 1, 0);
- defaultCmapMode = CM_NORMAL;
+ case DMB_COLNORM:
+ ChangeCmapMode(CM_NORMAL, 1, 0);
+ defaultCmapMode = CM_NORMAL;
break;
- case DMB_COLPERF:
+ case DMB_COLPERF:
ChangeCmapMode(CM_PERFECT,1, 0);
- defaultCmapMode = CM_PERFECT;
+ defaultCmapMode = CM_PERFECT;
break;
- case DMB_COLOWNC:
+ case DMB_COLOWNC:
ChangeCmapMode(CM_OWNCMAP,1, 0);
- defaultCmapMode = CM_OWNCMAP;
+ defaultCmapMode = CM_OWNCMAP;
break;
- case DMB_COLSTDC:
+ case DMB_COLSTDC:
ChangeCmapMode(CM_STDCMAP,1, 0);
- defaultCmapMode = CM_STDCMAP;
+ defaultCmapMode = CM_STDCMAP;
break;
}
}
@@ -784,27 +966,27 @@
/***********************************/
-void SelectRootMB(i)
+static void SelectRootMB(i)
int i;
{
/* called to handle selection of a rootMB item */
-
+
if (i<0 || i>=RMB_MAX) return;
if (rootMB.flags[i]) return;
if (rootMB.dim[i]) return;
dispMode = i;
-
+
/* move checkmark */
for (i=RMB_WINDOW; i=CONV24_MAX) return;
@@ -818,25 +1000,25 @@
else if (i==CONV24_24BIT && state824==1) {
/* went 24->8->24 */
char buf[512];
-
+
sprintf(buf,"Warning: You appear to have taken a 24-bit ");
strcat(buf, "image, turned it to an 8-bit image, and turned ");
strcat(buf, "it back into a 24-bit image. Understand that ");
strcat(buf, "image data has probably been lost in this ");
strcat(buf, "transformation. You *may* want to reload the ");
strcat(buf, "original image to avoid this problem.");
-
+
ErrPopUp(buf, "\nI Know!");
-
+
state824 = 2; /* shut up until next image is loaded */
}
}
}
-
+
else if (i==CONV24_LOCK) {
conv24MB.flags[i] = !conv24MB.flags[i];
}
-
+
else if (i>=CONV24_FAST && i<=CONV24_BEST) {
conv24 = i;
for (i=CONV24_FAST; i<=CONV24_BEST; i++) {
@@ -847,7 +1029,7 @@
/***********************************/
-void SelectWindowMB(i)
+static void SelectWindowMB(i)
int i;
{
if (i<0 || i>=WMB_MAX) return;
@@ -859,15 +1041,15 @@
else chdir(initdir);
OpenBrowse();
break;
-
+
case WMB_COLEDIT: GamBox (!gamUp); break;
case WMB_INFO: InfoBox(!infoUp); break;
-
- case WMB_COMMENT:
+
+ case WMB_COMMENT:
if (!commentUp) OpenCommentText();
else CloseCommentText();
break;
-
+
case WMB_TEXTVIEW: textViewCmd(); break;
case WMB_ABOUTXV: ShowLicense(); break;
case WMB_KEYHELP: ShowKeyHelp(); break;
@@ -878,7 +1060,7 @@
/***********************************/
-void SelectSizeMB(i)
+static void SelectSizeMB(i)
int i;
{
int w,h;
@@ -892,19 +1074,19 @@
double r,wr,hr;
wr = ((double) cWIDE) / maxWIDE;
hr = ((double) cHIGH) / maxHIGH;
-
+
r = (wr>hr) ? wr : hr; /* r is the max(wr,hr) */
w = (int) ((cWIDE / r) + 0.5);
h = (int) ((cHIGH / r) + 0.5);
}
else { w = cWIDE; h = cHIGH; }
-
+
WResize(w, h);
break;
case SZMB_MAXPIC: WMaximize(); break;
- case SZMB_MAXPECT:
+ case SZMB_MAXPECT:
{
int w1,h1;
w1 = eWIDE; h1 = eHIGH;
@@ -925,24 +1107,24 @@
if (h==eHIGH) h++;
WResize(w,h);
break;
-
-
+
+
case SZMB_SETSIZE: setSizeCmd(); break;
case SZMB_ASPECT: FixAspect(1, &w, &h); WResize(w,h); break;
- case SZMB_4BY3:
+ case SZMB_4BY3:
w = eWIDE; h = (w * 3) / 4;
if (h>maxHIGH) { h = eHIGH; w = (h*4)/3; }
WResize(w,h);
break;
- case SZMB_INTEXP:
+ case SZMB_INTEXP:
{
/* round (eWIDE/cWIDE),(eHIGH/cHIGH) to nearest
integer expansion/compression values */
-
+
double w,h;
-
+
if (eWIDE >= cWIDE) {
w = ((double) eWIDE) / cWIDE;
w = floor(w + 0.5);
@@ -961,7 +1143,7 @@
}
w = pick;
}
-
+
if (eHIGH >= cHIGH) {
h = ((double) eHIGH) / cHIGH;
h = floor(h + 0.5);
@@ -980,25 +1162,26 @@
}
h = pick;
}
-
+
WResize((int) (w*cWIDE), (int) (h*cHIGH));
}
break;
-
+
default: break;
}
}
/***********************************/
-void DoPrint()
+static void DoPrint()
{
/* pops open appropriate dialog boxes, issues print command */
- int i;
- char txt[512], str[PRINTCMDLEN + 10];
- static char *labels[] = { " Color", " Grayscale", " B/W", "\033Cancel" };
-
+ int i;
+ char txt[512], str[PRINTCMDLEN + 10];
+ static const char *labels[] = { "\03Color", "\07Grayscale", " B/W", "\033Cancel" };
+ /* ^B ("\02") already used for moving cursor back */
+
strcpy(txt, "Print: Enter a command that will read a PostScript file ");
strcat(txt, "from stdin and print it to the desired printer.\n\n");
#ifndef VMS
@@ -1011,11 +1194,11 @@
if (i == 3 || strlen(printCmd)==0) return; /* CANCEL */
if (dirUp == BLOAD) DirBox(0);
-
+
SetDirSaveMode(F_FORMAT, F_PS);
SetDirSaveMode(F_COLORS, i);
- if (printCmd[0] != '|' && printCmd[0] != '!')
+ if (printCmd[0] != '|' && printCmd[0] != '!')
sprintf(str, "| %s", printCmd);
else strcpy(str, printCmd);
@@ -1086,11 +1269,11 @@
}
}
-static char *win2name(win)
+static const char *win2name(win)
Window win;
{
static char foo[16];
-
+
if (win == mainW) return "mainW";
else if (win == rootW) return "rootW";
else if (win == vrootW) return "vrootW";
@@ -1106,7 +1289,7 @@
}
}
-
+
/***********************************/
static void handleButtonEvent(event, donep, retvalp)
XEvent *event;
@@ -1127,38 +1310,60 @@
case ButtonPress:
/* *always* check for pop-up events, as errors can happen... */
if (PUCheckEvent (event)) break;
-
+
if (autoquit && win == mainW) Quit(0);
-
+
if (viewonly) break; /* ignore all other button presses */
-
+
if (win == mainW && !useroot && showzoomcursor) {
DoZoom(x, y, but_event->button);
break;
}
-
+
if (PSCheckEvent (event)) break;
-
+
#ifdef HAVE_JPEG
if (JPEGCheckEvent(event)) break;
#endif
-
+
+#ifdef HAVE_JP2K
+ if (JP2KCheckEvent(event)) break;
+#endif
+
#ifdef HAVE_TIFF
if (TIFFCheckEvent(event)) break;
#endif
-
+
+#ifdef HAVE_PNG
+ if (PNGCheckEvent (event)) break;
+#endif
+
+#ifdef HAVE_PCD
+ if (PCDCheckEvent (event)) break; /* event has been processed */
+#endif
+
+#ifdef HAVE_PIC2
+ if (PIC2CheckEvent(event)) break;
+#endif
+
+#ifdef HAVE_MGCSFX
+ if (MGCSFXCheckEvent(event)) break;
+#endif
+
+#ifdef TV_MULTILINGUAL
+ if (CharsetCheckEvent(event)) break;
+#endif
+
if (GamCheckEvent (event)) break;
if (BrowseCheckEvent (event, &retval, &done)) break;
if (TextCheckEvent (event, &retval, &done)) break;
-
+
switch (but_event->button) {
-
- case Button1:
+
+ case Button1:
if (win == mainW) DoSelection(but_event);
-
+
else if (win == ctrlW) {
- int w,h;
-
if (MBClick(&dispMB, x,y)) SelectDispMB (MBTrack(&dispMB) );
else if (MBClick(&conv24MB, x,y)) Select24to8MB (MBTrack(&conv24MB));
else if (MBClick(&rootMB, x,y)) SelectRootMB (MBTrack(&rootMB) );
@@ -1170,9 +1375,9 @@
if (i>=0) DoAlg(i);
break;
}
-
+
i=ClickCtrl(x,y);
-
+
switch (i) {
case BNEXT: retval= NEXTPIC; done=1; break;
case BPREV: retval= PREVPIC; done=1; break;
@@ -1192,21 +1397,21 @@
case BROTR: Rotate(0); break;
case BFLIPH: Flip(0); break;
case BFLIPV: Flip(1); break;
-
+
case BCROP: Crop(); break;
case BUNCROP: UnCrop(); break;
case BACROP: AutoCrop(); break;
-
+
case BPAD:
{
int mode, wide, high, opaque, omode; char *str;
-
+
while (PadPopUp(&mode, &str, &wide, &high, &opaque, &omode)==0) {
- if (DoPad(mode, str, wide, high, opaque, omode)) {
+ if (DoPad(mode, str, wide, high, opaque, omode)) {
done = 1; retval = PADDED; break;
}
- }
- }
+ }
+ }
break;
case BANNOT: annotatePic(); break;
@@ -1214,85 +1419,127 @@
case BABOUT: SelectWindowMB(WMB_ABOUTXV); break;
case BXV: retval = DFLTPIC; done=1; break;
case BQUIT: retval = QUIT; done=1; break;
-
+
default: break;
}
-
+
if (i==BFLIPH || i==BFLIPV) {
DrawEpic();
SetCursors(-1);
}
}
-
+
else if (win == nList.win) {
i=LSClick(&nList,but_event);
if (curname<0) ActivePrevNext();
if (i>=0) { done = 1; retval = i; }
}
-
+
else if (win == nList.scrl.win) SCTrack(&nList.scrl, x, y);
-
+
else if (win == dirW) {
i=ClickDirW(x,y);
-
+
switch (i) {
case S_BOK: if (dirUp == BLOAD) {
- if (!DirCheckCD()) {
- retval = LOADPIC;
- done=1;
+ if (!DirCheckCD()) {
+ retval = LOADPIC;
+ done=1;
+ }
+ }
+ else if (dirUp == BSAVE) {
+ DoSave();
}
- }
- else if (dirUp == BSAVE) {
- DoSave();
- }
break;
-
+
case S_BCANC: DirBox(0); break;
-
+
case S_BRESCAN:
WaitCursor(); LoadCurrentDirectory(); SetCursors(-1);
break;
}
}
-
+
else if (win == dList.win) {
i=LSClick(&dList,but_event);
SelectDir(i);
}
-
+
else if (win == dList.scrl.win) SCTrack(&dList.scrl, x,y);
else if (win == infoW) InfoBox(0); /* close info */
-
+
break;
-
-
- case Button2:
+
+
+ case Button2:
if (win == mainW && !useroot) {
if (!shift && !DoSelection(but_event)) TrackPicValues(x,y);
else if (shift) Paint();
}
break;
-
+
case Button3: /* if using root, MUST NOT get rid of ctrlbox. */
- if (!shift && !useroot) CtrlBox(!ctrlUp);
+ if (!shift && !useroot) CtrlBox(!ctrlUp);
else if (shift) BlurPaint();
break;
-
+
+ case Button4: /* note min vs. max, + vs. - */
+ if (win == ctrlW || win == nList.win || win == nList.scrl.win) {
+ SCRL *sp=&nList.scrl;
+ int halfpage=sp->page/2;
+
+ if (sp->val > sp->min+halfpage)
+ SCSetVal(sp,sp->val-halfpage);
+ else
+ SCSetVal(sp,sp->min);
+ }
+ else if (win == dirW || win == dList.win || win == dList.scrl.win) {
+ SCRL *sp=&dList.scrl;
+ int halfpage=sp->page/2;
+
+ if (sp->val > sp->min+halfpage)
+ SCSetVal(sp,sp->val-halfpage);
+ else
+ SCSetVal(sp,sp->min);
+ }
+ break;
+
+ case Button5: /* note max vs. min, - vs. + */
+ if (win == ctrlW || win == nList.win || win == nList.scrl.win) {
+ SCRL *sp=&nList.scrl;
+ int halfpage=sp->page/2;
+
+ if (sp->val < sp->max-halfpage)
+ SCSetVal(sp,sp->val+halfpage);
+ else
+ SCSetVal(sp,sp->max);
+ }
+ else if (win == dirW || win == dList.win || win == dList.scrl.win) {
+ SCRL *sp=&dList.scrl;
+ int halfpage=sp->page/2;
+
+ if (sp->val < sp->max-halfpage)
+ SCSetVal(sp,sp->val+halfpage);
+ else
+ SCSetVal(sp,sp->max);
+ }
+ break;
+
default: break;
}
}
-
+
*donep = done; *retvalp = retval;
}
-
+
/***********************************/
static void handleKeyEvent(event, donep, retvalp)
XEvent *event;
int *donep, *retvalp;
{
/* handles KeyPress and KeyRelease events, called from HandleEvent */
-
+
XKeyEvent *key_event;
KeySym ks;
char buf[128];
@@ -1306,26 +1553,26 @@
switch (event->type) {
case KeyRelease:
if (viewonly) break; /* ignore all user input */
-
+
stlen = XLookupString(key_event,buf,128,&ks,(XComposeStatus *) NULL);
dealt = 0;
-
+
if (key_event->window == mainW) {
u_int foo = key_event->state;
- if (ks == XK_Shift_L || ks == XK_Shift_R)
+ if (ks == XK_Shift_L || ks == XK_Shift_R)
foo = foo & (u_int) (~ShiftMask);
- if (ks == XK_Control_L || ks == XK_Control_R)
+ if (ks == XK_Control_L || ks == XK_Control_R)
foo = foo & (u_int) (~ControlMask);
- if (ks == XK_Meta_L || ks == XK_Meta_R)
+ if (ks == XK_Meta_L || ks == XK_Meta_R)
foo = foo & (u_int) (~Mod1Mask);
- if (ks == XK_Alt_L || ks == XK_Alt_R)
+ if (ks == XK_Alt_L || ks == XK_Alt_R)
foo = foo & (u_int) (~Mod1Mask);
zoomCurs(foo);
}
break;
-
+
case KeyPress:
svkeystate = key_event->state;
@@ -1343,11 +1590,11 @@
if (PUCheckEvent (event)) break; /* always check popups */
if (autoquit && key_event->window == mainW) Quit(0);
-
+
if (viewonly && !frominterrupt) break; /* ignore all user input */
-
+
if (PSCheckEvent (event)) break;
-
+
if (key_event->window == mainW) {
u_int foo = key_event->state;
@@ -1362,20 +1609,43 @@
if (JPEGCheckEvent(event)) break;
#endif
+#ifdef HAVE_JP2K
+ if (JP2KCheckEvent(event)) break;
+#endif
+
#ifdef HAVE_TIFF
if (TIFFCheckEvent(event)) break;
#endif
+#ifdef HAVE_PNG
+ if (PNGCheckEvent (event)) break;
+#endif
+
+ if (PCDCheckEvent (event)) break;
+
+#ifdef HAVE_PIC2
+ if (PIC2CheckEvent(event)) break;
+#endif
+
+#ifdef HAVE_PCD
+ if (PCDCheckEvent (event)) break;
+#endif
+
+#ifdef HAVE_MGCSFX
+ if (MGCSFXCheckEvent(event)) break;
+#endif
+
if (GamCheckEvent (event)) break;
if (BrowseCheckEvent (event, &retval, &done)) break;
if (TextCheckEvent (event, &retval, &done)) break;
- /* check for pageup/pagedown, 'p' in main window
- (you can use shift-up or shift-down if no crop rectangle drawn)
- (for viewing multipage docs) */
+ /* Support for multi-image files ("multipage docs"). Check for PgUp/PgDn
+ or 'p' in any window but control or directory; PgUp/PgDn are already
+ used to page through the file list in those windows. If no cropping
+ rectangle is active, shift-Up and shift-Down also work. */
- if (key_event->window == mainW) {
+ if (key_event->window != ctrlW && key_event->window != dirW) {
dealt = 1;
ck = CursorKey(ks, shift, 0);
@@ -1386,7 +1656,7 @@
else XBell(theDisp,0);
}
- else if (ck==CK_PAGEDOWN ||
+ else if (ck==CK_PAGEDOWN ||
(ck==CK_DOWN && shift && !but[BCROP].active)) {
if (strlen(pageBaseName) && numPages>1) {
done = 1; retval = OP_PAGEDN;
@@ -1396,9 +1666,9 @@
else if (buf[0] == 'p' && stlen>0) {
if (strlen(pageBaseName) && numPages>1) {
- int i,j, okay;
- char buf[64], txt[512];
- static char *labels[] = { "\nOk", "\033Cancel" };
+ int i,j, okay;
+ char buf[64], txt[512];
+ static const char *labels[] = { "\nOk", "\033Cancel" };
/* ask what page to go to */
sprintf(txt, "Go to page number... (1-%d)", numPages);
@@ -1429,7 +1699,7 @@
if (dealt) break;
}
-
+
/* check for crop rect keys */
@@ -1468,15 +1738,17 @@
if (theList == &dList && dealt) { /* changed dir selection */
SelectDir(-1); /* nothing was double-clicked */
}
-
+
if (dealt) break;
}
/* check dir filename arrows */
- ck = CursorKey(ks, shift, 1);
- if (key_event->window == dirW && ck==CK_LEFT) { DirKey('\002'); break; }
- if (key_event->window == dirW && ck==CK_RIGHT) { DirKey('\006'); break; }
+ if (key_event->window == dirW) {
+ ck = CursorKey(ks, shift, 1);
+ if (ck==CK_LEFT) { DirKey('\002'); break; }
+ if (ck==CK_RIGHT) { DirKey('\006'); break; }
+ }
/* check for preset keys (meta-1, meta-2, meta-3, meta-4, meta-0)
@@ -1491,7 +1763,7 @@
else if (ks==XK_2) FakeButtonPress(&gbut[G_B2]);
else if (ks==XK_3) FakeButtonPress(&gbut[G_B3]);
else if (ks==XK_4) FakeButtonPress(&gbut[G_B4]);
- else if (ks==XK_r || ks==XK_0)
+ else if (ks==XK_r || ks==XK_0)
FakeButtonPress(&gbut[G_BRESET]);
else if (ks==XK_x) FakeButtonPress(&but[BCUT]);
@@ -1521,7 +1793,7 @@
else if (ks==XK_a) FakeButtonPress(&gbut[G_BAPPLY]);
- else if (ks==XK_8) {
+ else if (ks==XK_8) {
if (picType==PIC8) Select24to8MB(CONV24_24BIT);
else Select24to8MB(CONV24_8BIT);
}
@@ -1530,20 +1802,47 @@
if (dealt) break;
}
-
+
+ /* Check for function keys */
+ if (key_event->window == ctrlW || key_event->window == mainW) {
+ if (ks >= XK_F1 && ks <= XK_F1 + FSTRMAX - 1) {
+ int fkey = ks - XK_F1;
+ if (fkeycmds[fkey] && fullfname[0]) {
+#define CMDLEN 4096
+ char cmd[CMDLEN];
+ /* If a command begins with '@', we do not reload the current file */
+ int noreload = (fkeycmds[fkey][0] == '@');
+ int x = 0, y = 0, w = 0, h = 0;
+ if (HaveSelection())
+ GetSelRCoords(&x, &y, &w, &h);
+ snprintf(cmd, CMDLEN, fkeycmds[fkey] + noreload, fullfname, x, y, w, h);
+#undef CMDLEN
+ if (DEBUG) fprintf(stderr, "Executing '%s'\n", cmd);
+ WaitCursor();
+ system(cmd);
+ SetCursors(-1);
+ if (!noreload) {
+ retval = RELOAD;
+ done = 1;
+ }
+ break;
+ }
+ }
+ }
+
if (!stlen) break;
-
+
if (key_event->window == dirW) {
if (DirKey(buf[0])) XBell(theDisp,0);
}
else { /* commands valid in any window */
switch (buf[0]) {
-
+
/* things in dispMB */
case 'r': SelectDispMB(DMB_RAW); break;
case 'd': SelectDispMB(DMB_DITH); break;
case 's': SelectDispMB(DMB_SMOOTH); break;
-
+
/* things in sizeMB */
case 'n': SelectSizeMB(SZMB_NORM); break;
case 'm': SelectSizeMB(SZMB_MAXPIC); break;
@@ -1556,7 +1855,7 @@
case 'a': SelectSizeMB(SZMB_ASPECT); break;
case '4': SelectSizeMB(SZMB_4BY3); break;
case 'I': SelectSizeMB(SZMB_INTEXP); break;
-
+
/* things in windowMB */
case '\026':
case 'V': SelectWindowMB(WMB_BROWSE); break; /* ^V or V */
@@ -1565,36 +1864,36 @@
case '\003': SelectWindowMB(WMB_COMMENT); break; /* ^C */
case '\024': SelectWindowMB(WMB_TEXTVIEW); break; /* ^T */
case '\001': SelectWindowMB(WMB_ABOUTXV); break; /* ^A */
-
-
-
+
+
+
/* buttons in ctrlW */
case '\t':
case ' ': FakeButtonPress(&but[BNEXT]); break;
-
+
case '\r':
case '\n':
if (nList.selected >= 0 && nList.selected < nList.nstr) {
- done = 1; retval = nList.selected;
+ done = 1; retval = nList.selected;
if (frominterrupt) retval = RELOAD;
}
break;
-
- case '\010':
- case '\177': FakeButtonPress(&but[BPREV]); break;
-
-
+
+ case '\010': FakeButtonPress(&but[BPREV]); break;
+
+
case '\014': FakeButtonPress(&but[BLOAD]); break; /* ^L */
case '\023': FakeButtonPress(&but[BSAVE]); break; /* ^S */
case '\020': FakeButtonPress(&but[BPRINT]); break; /* ^P */
+ case '\177':
case '\004': FakeButtonPress(&but[BDELETE]); break; /* ^D */
-
+
/* BCOPY, BCUT, BPASTE, BCLEAR handled in 'meta' case */
-
+
case '\007': FakeButtonPress(&but[BGRAB]); break; /* ^G */
-
+
/* BUP10, BDN10 handled in sizeMB case */
-
+
case 'T': FakeButtonPress(&but[BROTL]); break;
case 't': FakeButtonPress(&but[BROTR]); break;
case 'h': FakeButtonPress(&but[BFLIPH]); break;
@@ -1604,24 +1903,24 @@
case 'C': FakeButtonPress(&but[BACROP]); break;
case 'P': FakeButtonPress(&but[BPAD]); break;
case 'A': FakeButtonPress(&but[BANNOT]); break;
-
+
/* BABOUT handled in windowMB case */
-
+
case '\021': /* ^Q */
case 'q': FakeButtonPress(&but[BQUIT]); break;
-
+
case '?': if (!useroot) CtrlBox(!ctrlUp); break;
-
+
/* things in color editor */
case 'R': FakeButtonPress(&gbut[G_BRESET]); break;
case 'H': FakeButtonPress(&gbut[G_BHISTEQ]); break;
case 'N': FakeButtonPress(&gbut[G_BMAXCONT]); break;
-
+
default: break;
}
}
}
-
+
*donep = done; *retvalp = retval;
}
@@ -1657,7 +1956,7 @@
else name = namelist[i];
TextView(name);
-
+
if (name != namelist[i]) free(name);
}
@@ -1668,10 +1967,10 @@
/* open 'set size' prompt window, get a string, parse it, and try to
set the window size accordingly */
- int i, arg1, arg2, numargs, pct1, pct2, state, neww, newh;
- char txt[512], buf[64], *sp, ch;
- static char *labels[] = { "\nOk", "\033Cancel" };
-
+ int i, arg1, arg2, numargs, pct1, pct2, state, neww, newh;
+ char txt[512], buf[64], *sp, ch;
+ static const char *labels[] = { "\nOk", "\033Cancel" };
+
sprintf(txt, "Enter new image display size (ex. '400 x 300'),\n");
strcat (txt, "expansion ratio (ex. '75%'),\n");
strcat (txt, "or expansion ratios (ex. '200% x 125%'):");
@@ -1685,7 +1984,7 @@
/* attempt to parse the string accordingly...
- * parses strings of the type: [%] [ x [%] ]
+ * parses strings of the type: [%] [ x [%] ]
* (-ish. all by itself isn't legal)
* there may be any # of spaces between items, including zero
*/
@@ -1825,7 +2124,7 @@
if (theImage)
XPutImage(theDisp,mainW,theGC,theImage,x,y,x,y, (u_int) w, (u_int) h);
- else
+ else
if (DEBUG) fprintf(stderr,"Tried to DrawWindow when theImage was NULL\n");
}
@@ -1845,12 +2144,14 @@
return;
}
+ GetWindowPos(&xwa);
+
/* determine if new size goes off edge of screen. if so move window so it
doesn't go off screen */
-
- GetWindowPos(&xwa);
if (xwa.x + w > vrWIDE) xwa.x = vrWIDE - w;
if (xwa.y + h > vrHIGH) xwa.y = vrHIGH - h;
+ if (xwa.x < 0) xwa.x = 0;
+ if (xwa.y < 0) xwa.y = 0;
if (DEBUG) fprintf(stderr,"%s: resizing window to %d,%d at %d,%d\n",
cmd,w,h,xwa.x,xwa.y);
@@ -1872,7 +2173,7 @@
XWindowAttributes xwa;
xvbzero((char *) &xwa, sizeof(XWindowAttributes));
xwa.x = xwa.y = 0;
- xwa.width = dispWIDE;
+ xwa.width = dispWIDE;
xwa.height = dispHIGH;
SetWindowPos(&xwa);
}
@@ -1898,14 +2199,14 @@
rotatesLeft++;
XClearWindow(theDisp, mainW); /* get rid of old bits */
GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH);
- { int ew, eh;
+ { int ew, eh;
ew = eWIDE; eh = eHIGH;
WResize(eWIDE, eHIGH);
if (ew>maxWIDE || eh>maxHIGH) { /* rotated pic too big, scale down */
double r,wr,hr;
wr = ((double) ew) / maxWIDE;
hr = ((double) eh) / maxHIGH;
-
+
r = (wr>hr) ? wr : hr; /* r is the max(wr,hr) */
ew = (int) ((ew / r) + 0.5);
eh = (int) ((eh / r) + 0.5);
@@ -1920,7 +2221,7 @@
void WCrop(w,h,dx,dy)
int w,h,dx,dy;
{
- int cx, cy, cw, ch, ex, ey;
+ int ex, ey;
XWindowAttributes xwa;
if (useroot) {
@@ -1931,7 +2232,7 @@
else {
/* we want to move window to old x,y + dx,dy (in pic coords) */
GetWindowPos(&xwa);
-
+
if (!origcropvalid) { /* first crop. remember win pos */
origcropvalid = 1;
origcropx = xwa.x;
@@ -1939,7 +2240,7 @@
}
CoordC2E(dx, dy, &ex, &ey);
-
+
xwa.x += ex; xwa.y += ey;
xwa.width = w; xwa.height = h;
GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH);
@@ -1974,13 +2275,14 @@
xwa.y = origcropy;
}
- if (xwa.x + w > vrWIDE) xwa.x = vrWIDE - w; /* keep on screen */
+ /* keep on screen */
+ if (xwa.x + w > vrWIDE) xwa.x = vrWIDE - w;
if (xwa.y + h > vrHIGH) xwa.y = vrHIGH - h;
+ if (xwa.x < 0) xwa.x = 0;
+ if (xwa.y < 0) xwa.y = 0;
- if (xwa.x<0) xwa.x = 0;
- if (xwa.y<0) xwa.y = 0;
xwa.width = w; xwa.height = h;
-
+
if (!useroot) {
SetWindowPos(&xwa);
GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH);
@@ -1995,8 +2297,8 @@
XWindowAttributes *xwa;
{
Window child;
-
- /* returns the x,y,w,h coords of mainW. x,y are relative to rootW
+
+ /* returns the x,y,w,h coords of mainW. x,y are relative to rootW
the border is not included (x,y map to top-left pixel in window) */
/* Get the window width/height */
@@ -2023,36 +2325,58 @@
/* if we're less than max size in one axis, allow window manager doohickeys
on the screen */
-
+
if (xwa->width < dispWIDE && xwc.x < p_offx) xwc.x = p_offx;
if (xwa->height < dispHIGH && xwc.y < p_offy) xwc.y = p_offy;
+ /* Try to keep bottom right decorations inside */
+#ifdef CRAP
+ if (xwc.x+eWIDE-debkludge_offx>dispWIDE) {
+ xwc.x=dispWIDE-eWIDE+debkludge_offx;
+ if (xwc.x<0) xwc.x=0;
+ }
+ if (xwc.y+eHIGH-debkludge_offy>dispHIGH) {
+ xwc.y=dispHIGH-eHIGH+debkludge_offy;
+ if (xwc.y<0) xwc.y=0;
+ }
+#else
+ if (xwc.x+eWIDE+p_offx>dispWIDE) {
+ xwc.x=dispWIDE-(eWIDE+debkludge_offx);
+ if (xwc.x<0) xwc.x=0;
+ }
+ if (xwc.y+eHIGH+p_offy>dispHIGH) {
+ xwc.y=dispHIGH-(eHIGH+debkludge_offy);
+ if (xwc.y<0) xwc.y=0;
+ }
+#endif
+
xwc.width = xwa->width;
xwc.height = xwa->height;
-
+#define BAD_IDEA
#ifdef BAD_IDEA
/* if there is a virtual window manager running, then we should translate
the coordinates that are in terms of 'real' screen into coordinates
- that are in terms of the 'virtual' root window
+ that are in terms of the 'virtual' root window
from: Daren W. Latham */
-
+
if (vrootW != rootW) { /* virtual window manager running */
int x1,y1;
Window child;
- XTranslateCoordinates(theDisp, rootW, vrootW,xwc.x,xwc.y,&x1,&y1,&child);
+
+ XTranslateCoordinates(theDisp, rootW, vrootW, xwc.x, xwc.y, &x1, &y1, &child);
if (DEBUG) fprintf(stderr,"SWP: translate: %d,%d -> %d,%d\n",
- xwc.x,xwc.y,x1,y1);
+ xwc.x, xwc.y, x1, y1);
xwc.x = x1; xwc.y = y1;
}
-#endif
+#endif
if (DEBUG) {
fprintf(stderr,
"SWP: xwa=%d,%d %dx%d xwc=%d,%d %dx%d off=%d,%d bw=%d klg=%d,%d\n",
xwa->x, xwa->y, xwa->width, xwa->height,
- xwc.x, xwc.y, xwc.width, xwc.height, p_offx, p_offy,
+ xwc.x, xwc.y, xwc.width, xwc.height, p_offx, p_offy,
xwa->border_width, kludge_offx, kludge_offy);
}
@@ -2080,7 +2404,7 @@
/* all non-DXWM window managers (?) */
/* Move/Resize the window. */
- XConfigureWindow(theDisp, mainW,
+ XConfigureWindow(theDisp, mainW,
CWX | CWY | CWWidth | CWHeight /*| CWBorderWidth*/, &xwc);
}
@@ -2090,7 +2414,7 @@
static void CropKey(dx,dy,grow,crop)
int dx,dy,grow,crop;
{
- int x1,x2,y1,y2,active, ocx, ocy;
+ int ocx, ocy;
if (crop) { /* chop off a pixel from the appropriate edge */
int dealt=1;
@@ -2112,7 +2436,7 @@
}
return;
}
-
+
if (grow) MoveGrowSelection(0, 0, dx, dy);
else MoveGrowSelection(dx, dy, 0, 0);
}
@@ -2128,7 +2452,7 @@
u_long wh, bl;
int ty, w, ecol, done1;
char foo[128];
- char *str =
+ const char *str =
"8888,8888 = 123,123,123 #123456 (123,123,123 HSV) [-2345,-2345]";
ecol = 0; wh = infobg; bl = infofg;
@@ -2136,14 +2460,14 @@
if (!dropper) {
Pixmap pix, mask;
XColor cfg, cbg;
-
+
cfg.red = cfg.green = cfg.blue = 0x0000;
cbg.red = cbg.green = cbg.blue = 0xffff;
-
+
pix = MakePix1(rootW, dropper_bits, dropper_width, dropper_height);
mask= MakePix1(rootW, dropperm_bits, dropperm_width, dropperm_height);
- if (pix && mask)
- dropper = XCreatePixmapCursor(theDisp, pix, mask, &cfg, &cbg,
+ if (pix && mask)
+ dropper = XCreatePixmapCursor(theDisp, pix, mask, &cfg, &cbg,
dropper_x_hot, dropper_y_hot);
if (pix) XFreePixmap(theDisp, pix);
if (mask) XFreePixmap(theDisp, mask);
@@ -2151,7 +2475,7 @@
if (dropper) XDefineCursor(theDisp, mainW, dropper);
- /* do a colormap search for black and white if LocalCmap
+ /* do a colormap search for black and white if LocalCmap
and use those colors instead of infobg and infofg */
if (LocalCmap) {
@@ -2159,7 +2483,7 @@
for (i=0; iascent + mfinfo->descent)-4;
XSetForeground(theDisp, theGC, bl);
- XFillRectangle(theDisp, mainW, theGC, 0, ty, (u_int) w + 8,
+ XFillRectangle(theDisp, mainW, theGC, 0, ty, (u_int) w + 8,
(u_int) (monofinfo->ascent+monofinfo->descent) + 4);
XSetForeground(theDisp, theGC, wh);
XSetBackground(theDisp, theGC, bl);
@@ -2198,15 +2522,15 @@
if (!XQueryPointer(theDisp,mainW,&rW,&cW,&rx,&ry,&x,&y,&mask)) continue;
if (done1 && !(mask & Button2Mask)) break; /* button released */
-
+
CoordE2P(x,y, &px, &py);
- RANGE(px,0,pWIDE-1);
+ RANGE(px,0,pWIDE-1);
RANGE(py,0,pHIGH-1);
-
+
if (px!=ox || py!=oy || !done1) { /* moved, or firsttime. erase & draw */
double h1, s1, v1;
int rval, gval, bval;
-
+
if (picType == PIC8) {
ecol = pix = pic[py * pWIDE + px];
rval = rcmap[pix]; gval = gcmap[pix]; bval = bcmap[pix];
@@ -2216,7 +2540,7 @@
gval = pic[py * pWIDE * 3 + px * 3 + 1];
bval = pic[py * pWIDE * 3 + px * 3 + 2];
}
-
+
clearR = rval; clearG = gval; clearB = bval;
rgb2hsv(rval, gval, bval, &h1, &s1, &v1);
@@ -2229,8 +2553,8 @@
px, py, rval, gval, bval, rval, gval, bval,
(int) h1, (int) (s1 * 100), (int) (v1 * 100),
px-orgx, py-orgy);
-
- XDrawImageString(theDisp,mainW,theGC, 4, ty + 2 + monofinfo->ascent,
+
+ XDrawImageString(theDisp,mainW,theGC, 4, ty + 2 + monofinfo->ascent,
foo, (int) strlen(foo));
ox = px; oy = py;
done1 = 1;
@@ -2275,7 +2599,7 @@
/* returns true if there's a config event in which mainW changes size
in the event queue */
-
+
XSync(theDisp, False);
foo = 0;
XCheckIfEvent(theDisp, &ev, IsConfig, &foo);
@@ -2328,7 +2652,7 @@
* BadMatch errors on XGetImage
*/
- if ((xerrcode == BadAlloc) ||
+ if ((xerrcode == BadAlloc) ||
(xerrcode == BadAccess && err->request_code==88 /* X_FreeColors */ ) ||
(err->request_code == 113 /* X_KillClient */ ) ||
(xerrcode == BadLength && err->request_code==18 /* X_ChangeProp */ ) ||
@@ -2361,17 +2685,39 @@
{
/* but first, if any input-grabbing popups are active, we have to 'cancel'
them. */
-
+
if (psUp) PSDialog(0); /* close PS window */
#ifdef HAVE_JPEG
if (jpegUp) JPEGDialog(0); /* close jpeg window */
#endif
+#ifdef HAVE_JP2K
+ if (jp2kUp) JP2KDialog(0); /* close jpeg 2000 window */
+#endif
+
#ifdef HAVE_TIFF
if (tiffUp) TIFFDialog(0); /* close tiff window */
#endif
+#ifdef HAVE_PNG
+ if (pngUp) PNGDialog(0); /* close png window */
+#endif
+
+ if (pcdUp) PCDDialog(0); /* close pcd window */
+
+#ifdef HAVE_PIC2
+ if (pic2Up) PIC2Dialog(0); /* close pic2 window */
+#endif
+
+#ifdef HAVE_PCD
+ if (pcdUp) PCDDialog(0); /* close pcd window */
+#endif
+
+#ifdef HAVE_MGCSFX
+ if (mgcsfxUp) MGCSFXDialog(0); /* close mgcsfx window */
+#endif
+
ClosePopUp();
/* make the interrupt signal look like a '\n' keypress in ctrlW */
@@ -2400,14 +2746,14 @@
if (!pen) {
Pixmap pix, pmask;
XColor cfg, cbg;
-
+
cfg.red = cfg.green = cfg.blue = 0x0000;
cbg.red = cbg.green = cbg.blue = 0xffff;
-
+
pix = MakePix1(rootW, pen_bits, pen_width, pen_height);
pmask= MakePix1(rootW, penm_bits, penm_width, penm_height);
- if (pix && pmask)
- pen = XCreatePixmapCursor(theDisp, pix, pmask, &cfg, &cbg,
+ if (pix && pmask)
+ pen = XCreatePixmapCursor(theDisp, pix, pmask, &cfg, &cbg,
pen_x_hot, pen_y_hot);
if (pix) XFreePixmap(theDisp, pix);
if (pmask) XFreePixmap(theDisp, pmask);
@@ -2416,7 +2762,7 @@
if (pen) XDefineCursor(theDisp, mainW, pen);
- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
+ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
| StructureNotifyMask /* | ButtonPressMask */
| KeyReleaseMask | ColormapChangeMask
| EnterWindowMask | LeaveWindowMask );
@@ -2435,7 +2781,7 @@
switch (state) {
case 0: /* initial state: make sure we do one pixel */
- px1 = lx = px; py1 = ly = py;
+ px1 = lx = px; py1 = ly = py;
paintPixel(px, py);
if (nmask & ShiftMask ) state = 99;
@@ -2444,7 +2790,7 @@
else state = 10;
break;
-
+
case 1: /* waiting for click */
if (nmask & ShiftMask) state = 99;
else if ( mask & Button2Mask) {
@@ -2459,7 +2805,7 @@
}
break;
-
+
case 10: /* in freehand drawing mode */
if (nmask & ShiftMask ) state = 99;
else if (nmask & Button2Mask) state = 1;
@@ -2507,11 +2853,11 @@
XSync(theDisp, False);
Timer(100);
}
-
+
if (nmask & Button2Mask) seenRelease = 1;
}
break;
-
+
case 99: /* EXIT loop: cleanup */
if (line) { /* erase old xor-line */
paintXLine(lx, ly, px1, py1, 0);
@@ -2521,11 +2867,11 @@
break;
}
}
-
-
+
+
WaitCursor();
-
- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
+
+ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
| StructureNotifyMask | ButtonPressMask
| KeyReleaseMask | ColormapChangeMask
| EnterWindowMask | LeaveWindowMask );
@@ -2557,17 +2903,17 @@
byte *pp = pic + (y * pWIDE + x) * 3;
pp[0] = clearR; pp[1] = clearG; pp[2] = clearB;
}
-
+
/* visual feedback */
CoordP2E(x, y, &ex, &ey);
CoordP2E(x+1, y+1, &ex1, &ey1);
-
+
ew = ex1-ex; eh = ey1-ey;
-
+
if (picType == PIC8) XSetForeground(theDisp, theGC, cols[editColor]);
else XSetForeground(theDisp, theGC, RGBToXColor(clearR, clearG, clearB));
-
- if (ew>0 && eh>0)
+
+ if (ew>0 && eh>0)
XFillRectangle(theDisp,mainW,theGC, ex,ey, (u_int) ew, (u_int) eh);
}
@@ -2576,29 +2922,46 @@
static void paintLine(x,y,x1,y1)
int x,y,x1,y1;
{
- int dx,dy,i,lx,ly,adx,ady;
-
- dx = x1-x; dy = y1-y;
- adx = abs(dx); ady = abs(dy);
-
- if (dx == 0 && dy == 0) paintPixel(x,y);
-
- else if (adx > ady) { /* X is major axis */
- for (i=0; i<=adx; i++) {
- lx = x + (i * dx + (adx/2)) / abs(dx);
- ly = y + (i * dy + (adx/2)) / abs(dx);
- paintPixel(lx,ly);
+ int t,dx,dy,d,dd;
+
+ dx = abs(x1-x); dy = abs(y1-y);
+
+ if (dx >= dy) { /* X is major axis */
+ if (x > x1) {
+ t = x; x = x1; x1 = t;
+ t = y; y = y1; y1 = t;
+ }
+ d = dy + dy - dx;
+ dd = y < y1 ? 1 : -1;
+ while (x <= x1) {
+ paintPixel(x,y);
+ if (d > 0) {
+ y += dd;
+ d -= dx + dx;
+ }
+ ++x;
+ d += dy + dy;
}
}
else { /* Y is major axis */
- for (i=0; i<=ady; i++) {
- lx = x + (i * dx + (ady/2)) / ady;
- ly = y + (i * dy + (ady/2)) / ady;
- paintPixel(lx,ly);
+ if (y > y1) {
+ t = x; x = x1; x1 = t;
+ t = y; y = y1; y1 = t;
+ }
+ d = dx + dx - dy;
+ dd = x < x1 ? 1 : -1;
+ while (y <= y1) {
+ paintPixel(x,y);
+ if (d > 0) {
+ x += dd;
+ d -= dy + dy;
+ }
+ ++y;
+ d += dx + dx;
}
}
-
+
}
@@ -2618,14 +2981,14 @@
CoordP2E(x+1,y+1,&tx1,&ty1);
ex = tx + (tx1 - tx)/2;
ey = ty + (ty1 - ty)/2;
-
+
CoordP2E(x1, y1, &tx, &ty);
CoordP2E(x1+1,y1+1,&tx1,&ty1);
ex1 = tx + (tx1 - tx)/2;
ey1 = ty + (ty1 - ty)/2;
-
+
if (ex==ex1 && ey==ey1) return;
-
+
XSetPlaneMask(theDisp, theGC, xorMasks[pntxlcol]);
XSetFunction(theDisp, theGC, GXinvert);
XDrawLine(theDisp, mainW, theGC, ex, ey, ex1, ey1);
@@ -2638,10 +3001,8 @@
static void BlurPaint()
{
Window rW,cW;
- int rx,ry,ox,oy,x,y, px,py, ex,ey, ex1,ey1, ew, eh, done1, dragging;
- int uppedpic;
+ int rx,ry,ox,oy,x,y, px,py, done1, dragging;
u_int mask;
- byte *pp;
/* blurs pixels in either editCol (PIC8) or clear{R,G,B} (PIC24) until
'shift' key is released. */
@@ -2653,14 +3014,14 @@
if (!blur) {
Pixmap pix, mask;
XColor cfg, cbg;
-
+
cfg.red = cfg.green = cfg.blue = 0x0000;
cbg.red = cbg.green = cbg.blue = 0xffff;
-
+
pix = MakePix1(rootW, blur_bits, blur_width, blur_height);
mask= MakePix1(rootW, blurm_bits, blurm_width, blurm_height);
- if (pix && mask)
- blur = XCreatePixmapCursor(theDisp, pix, mask, &cfg, &cbg,
+ if (pix && mask)
+ blur = XCreatePixmapCursor(theDisp, pix, mask, &cfg, &cbg,
blur_x_hot, blur_y_hot);
if (pix) XFreePixmap(theDisp, pix);
if (mask) XFreePixmap(theDisp, mask);
@@ -2669,7 +3030,7 @@
if (blur) XDefineCursor(theDisp, mainW, blur);
- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
+ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
| StructureNotifyMask /* | ButtonPressMask */
| KeyReleaseMask | ColormapChangeMask
| EnterWindowMask | LeaveWindowMask );
@@ -2682,12 +3043,12 @@
if (!(mask & Button3Mask)) { dragging = 0; continue; }
CoordE2P(x,y, &px, &py);
-
+
if (!dragging || (dragging && (px!=ox || py!=oy))) { /* click or drag */
if (!dragging) blurPixel(px,py);
else {
int dx,dy,i,lx,ly;
-
+
dx = px-ox; dy = py-oy; /* at least one will be non-zero */
if (abs(dx) > abs(dy)) { /* X is major axis */
for (i=0; i<=abs(dx); i++) {
@@ -2707,10 +3068,10 @@
done1 = 1; dragging = 1; ox = px; oy = py;
}
}
-
+
WaitCursor();
-
- XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
+
+ XSelectInput(theDisp, mainW, ExposureMask | KeyPressMask
| StructureNotifyMask | ButtonPressMask
| KeyReleaseMask | ColormapChangeMask
| EnterWindowMask | LeaveWindowMask );
@@ -2731,9 +3092,9 @@
{
/* returns position of highest set bit in 'ul' as an integer (0-31),
or -1 if none */
-
+
int i; unsigned long hb;
-
+
hb = 0x80; hb = hb << 24; /* hb = 0x80000000UL */
for (i=31; ((ul & hb) == 0) && i>=0; i--, ul<<=1);
return i;
@@ -2757,7 +3118,7 @@
d = 3*(256*256); j=0;
for (i=0; iclass==TrueColor || theVisual->class==DirectColor) {
unsigned long rmask, gmask, bmask;
int rshift, gshift, bshift, cshift, maplen;
-
+
/* compute various shifting constants that we'll need... */
-
+
rmask = theVisual->red_mask;
gmask = theVisual->green_mask;
bmask = theVisual->blue_mask;
-
+
rshift = 7 - highbit(rmask);
gshift = 7 - highbit(gmask);
bshift = 7 - highbit(bmask);
-
+
if (theVisual->class == DirectColor) {
maplen = theVisual->map_entries;
if (maplen>256) maplen=256;
cshift = 7 - highbit((u_long) (maplen-1));
-
+
r = (u_long) directConv[(r>>cshift) & 0xff] << cshift;
g = (u_long) directConv[(g>>cshift) & 0xff] << cshift;
b = (u_long) directConv[(b>>cshift) & 0xff] << cshift;
}
-
-
+
+
/* shift the bits around */
if (rshift<0) r = r << (-rshift);
else r = r >> rshift;
-
+
if (gshift<0) g = g << (-gshift);
else g = g >> gshift;
-
+
if (bshift<0) b = b << (-bshift);
else b = b >> bshift;
-
+
r = r & rmask;
g = g & gmask;
b = b & bmask;
-
+
rv =r | g | b;
}
-
+
else { /* non-TrueColor/DirectColor visual */
if (!ncols)
rv = ((r + g + b >= 128*3) ? white : black);
@@ -2820,14 +3181,14 @@
return rv;
}
-
-
+
+
/***********************/
static void blurPixel(x,y)
int x,y;
{
/* blurs pixel x,y (pic coords) into pic in editColor (PIC8) or clearR,G,B
- (PIC24) and does appropriate screen feedback. Does a 3x3 average
+ (PIC24) and does appropriate screen feedback. Does a 3x3 average
around the pixel, and replaces it with the average value (PIC24), or
the closest existing color to the average value (PIC8) */
@@ -2861,7 +3222,7 @@
if (picType == PIC8) { /* find nearest actual color */
d = 3*(256*256); j=0;
for (i=0; i0 && eh>0)
+
+ if (ew>0 && eh>0)
XFillRectangle(theDisp,mainW,theGC, ex,ey, (u_int) ew, (u_int) eh);
}
@@ -2895,19 +3256,19 @@
/***********************/
static void annotatePic()
{
- int i, w,h, len;
- byte *cimg;
- char txt[256];
- static char buf[256] = {'\0'};
- static char *labels[] = {"\nOk", "\033Cancel" };
+ int i, w,h, len;
+ byte *cimg;
+ char txt[256];
+ static char buf[256] = {'\0'};
+ static const char *labels[] = {"\nOk", "\033Cancel" };
- sprintf(txt, "Image Annotation:\n\n%s",
+ sprintf(txt, "Image Annotation:\n\n%s",
"Enter string to be placed on image.");
-
+
i = GetStrPopUp(txt, labels, 2, buf, 256, "", 0);
if (i==1 || strlen(buf)==0) return;
-
-
+
+
/* build a 'cimg' array to be pasted on clipboard */
w = strlen(buf) * 6 - 1; h = 9;
len = CIMG_PIC8 + w*h;
diff -ru xv-3.10a/xvfits.c xv-3.10a-enhancements/xvfits.c
--- xv-3.10a/xvfits.c 1994-12-27 23:43:29.000000000 -0800
+++ xv-3.10a-enhancements/xvfits.c 2007-05-12 15:46:55.000000000 -0700
@@ -14,7 +14,7 @@
* provided "as is" without express or implied warranty.
*/
-
+#define NEEDSDIR /* for S_IRUSR|S_IWUSR */
#include "xv.h"
#define NCARDS (36)
@@ -39,17 +39,17 @@
static char *fits_block=NULL;
-static int splitfits PARM((byte *, char *, int, int, int, char *));
-static char *ftopen3d PARM((FITS *, char *, int *, int *, int *, int *));
-static void ftclose PARM((FITS *));
-static int ftgbyte PARM((FITS *, byte *, int));
-static char *rdheader PARM((FITS *));
-static char *wrheader PARM((FILE *, int, int, char *));
-static char *rdcard PARM((char *, char *, DATTYPE, long int *));
-static void wrcard PARM((char *, char *, DATTYPE, int, char *));
-static int ftgdata PARM((FITS *, void *, int));
-static void ftfixdata PARM((FITS *, void *, int));
-static void flip PARM((byte *, int, int));
+static int splitfits PARM((byte *, char *, int, int, int, char *));
+static const char *ftopen3d PARM((FITS *, char *, int *, int *, int *, int *));
+static void ftclose PARM((FITS *));
+static int ftgbyte PARM((FITS *, byte *, int));
+static const char *rdheader PARM((FITS *));
+static const char *wrheader PARM((FILE *, int, int, char *));
+static const char *rdcard PARM((char *, const char *, DATTYPE, long int *));
+static void wrcard PARM((char *, const char *, DATTYPE, int, char *));
+static int ftgdata PARM((FITS *, void *, int));
+static void ftfixdata PARM((FITS *, void *, int));
+static void flip PARM((byte *, int, int));
@@ -63,16 +63,16 @@
/* returns '1' on success */
FITS fs;
- int i, nx, ny, nz, bitpix, np, nrd, ioerror;
+ int i, nx, ny, nz, bitpix, nrd, ioerror, npixels, bufsize;
byte *image;
- char *error;
+ const char *error;
char basename[64];
if (fits_block == NULL) {
fits_block = (char *) malloc((size_t) BLOCKSIZE);
if (!fits_block) FatalError("Insufficient memory for FITS block buffer");
}
-
+
error = ftopen3d(&fs, fname, &nx, &ny, &nz, &bitpix);
if (error) {
SetISTR(ISTR_WARNING, "%s", error);
@@ -80,9 +80,15 @@
}
if (quick) nz = 1; /* only load first plane */
- np = nx * ny * nz;
+ npixels = nx * ny;
+ bufsize = nz * npixels;
+ if (nx <= 0 || ny <= 0 || npixels/nx != ny || bufsize/nz != npixels) {
+ SetISTR(ISTR_WARNING, "FITS image dimensions out of range (%dx%dx%d)",
+ nx, ny, nz);
+ return 0;
+ }
- image = (byte *) malloc((size_t) np);
+ image = (byte *) malloc((size_t) bufsize);
if (!image) FatalError("Insufficient memory for image");
/*
@@ -90,7 +96,7 @@
* to ensure that we get that same scaling for all planes.
*/
- nrd = ftgbyte(&fs, image, np);
+ nrd = ftgbyte(&fs, image, bufsize);
ioerror = ferror(fs.fp);
ftclose(&fs);
@@ -104,33 +110,32 @@
return 0;
}
- else if (nrd < np) { /* read partial image */
+ else if (nrd < bufsize) { /* read partial image */
if (ioerror)
SetISTR(ISTR_WARNING, "%s", "Truncated FITS file due to I/O error");
else
SetISTR(ISTR_WARNING, "%s", "Truncated FITS file");
-
+
{ byte *foo;
- for (foo=image+nrd; foo 1) {
/* how many planes do we actually have? */
- nz = (nrd-1)/(nx*ny) + 1;
+ nz = (nrd-1)/(npixels) + 1;
/* returns how many sub-files created */
nz = splitfits(image, fs.comment, nx, ny, nz, basename);
- np = nx * ny;
- image = (byte *)realloc(image, (size_t) np); /* toss all but first */
+ image = (byte *)realloc(image, (size_t) npixels); /* toss all but first */
}
-
+
/* There seems to be a convention that fits files be displayed using
* a cartesian coordinate system. Thus the first pixel is in the lower left
* corner. Fix this by reflecting in the line y=ny/2.
*/
flip(image, nx, ny);
-
+
/* Success! */
pinfo->pic = image;
pinfo->type = PIC8;
@@ -149,12 +154,12 @@
pinfo->numpages = nz;
strcpy(pinfo->pagebname, basename);
}
-
+
return 1;
-}
+}
+
-
/*******************************************/
int WriteFITS(fp,pic,ptype,w,h,rmap,gmap,bmap,numcols,colorstyle,comment)
FILE *fp;
@@ -164,16 +169,16 @@
int numcols, colorstyle;
char *comment;
{
- int i, j, np, nend;
+ int i, j, npixels, nend;
byte *ptr;
- char *error;
+ const char *error;
byte rgb[256];
-
+
if (!fits_block) {
fits_block = (char *) malloc((size_t) BLOCKSIZE);
if (!fits_block) FatalError("Insufficient memory for FITS block buffer");
}
-
+
error = wrheader(fp, w, h, comment);
if (error) {
SetISTR(ISTR_WARNING, "%s", error);
@@ -197,12 +202,12 @@
}
}
- np = w*h;
+ npixels = w*h;
/* nend is the number of padding characters at the end of the last block */
- nend = ((np+BLOCKSIZE-1)/BLOCKSIZE)*BLOCKSIZE - np;
+ nend = ((npixels+BLOCKSIZE-1)/BLOCKSIZE)*BLOCKSIZE - npixels;
if (nend) for (i=0; ifp = fp;
fs->bitpix = 0;
fs->naxis = 0;
fs->cpos = 0;
-
+
/* read header */
error = rdheader(fs);
if (error) {
ftclose(fs);
return error;
}
-
+
naxis = fs->naxis;
-
+
/* get number of data */
fs->ndata = 1;
- for (i=0; indata = fs->ndata * fs->axes[i];
-
+
*nx = fs->axes[0];
*ny = fs->axes[1];
if (naxis == 2) *nz = 1;
else *nz = fs->axes[2];
-
+
*bitpix = fs->bitpix;
-
+
return NULL;
}
@@ -406,7 +423,7 @@
/************************************/
-static char *rdheader(fs)
+static const char *rdheader(fs)
FITS *fs;
{
/* reads the fits header, and updates the FITS structure fs.
@@ -416,13 +433,13 @@
int i, j, res, commlen, commsize;
char name[9];
char *block=fits_block, *p;
- char *error;
+ const char *error;
long int val; /* the value */
-
+
fs->comment = NULL;
commlen = 0;
commsize = 256;
-
+
res = fread(block, sizeof(char), (size_t) BLOCKSIZE, fs->fp);
if (res != BLOCKSIZE) return "Error reading FITS file";
i = 0;
@@ -464,13 +481,13 @@
if (res != BLOCKSIZE) return "Error reading FITS file";
i = 0;
}
-
+
sprintf(name, "NAXIS%d", j+1);
error = rdcard(&block[i*80], name, T_INT, &val);
if (error) return error;
if (val < 0) return "Bad NAXISn value in FITS file";
if (val == 0) return "FITS file does not contain an image";
-
+
if (j < 3) fs->axes[j] = val;
else if (val != 1) return "FITS file has more than three dimensions";
i++;
@@ -488,21 +505,21 @@
if (res != BLOCKSIZE) return "Unexpected eof in FITS file";
i = 0;
}
-
+
p = &block[i*80];
if (strncmp(p, "END ", (size_t) 8) == 0) break;
- if (strncmp(p, "HISTORY ", (size_t) 8) == 0 ||
+ if (strncmp(p, "HISTORY ", (size_t) 8) == 0 ||
strncmp(p, "COMMENT ", (size_t) 8) == 0) {
p += 8; /* skip keyword */
for (j=71; j >= 0; j--) if (p[j] != ' ') break;
j++; /* make j length of comment */
if (j > 0) { /* skip blank comment cards */
if (fs->comment == NULL) {
- fs->comment = (char *) malloc((size_t) commsize);
+ fs->comment = (char *) malloc((size_t) commsize); /* initially 256 */
if (fs->comment == NULL)
FatalError("Insufficient memory for comment buffer");
}
-
+
if (commlen + j + 2 > commsize) { /* if too small */
char *new;
commsize += commsize; /* double size of array */
@@ -515,7 +532,7 @@
free(fs->comment);
fs->comment = new;
}
-
+
xvbcopy(p, &fs->comment[commlen], (size_t) j); /* add string */
commlen += j;
fs->comment[commlen++] = '\n'; /* with trailing cr */
@@ -531,7 +548,8 @@
/************************************/
static void wrcard(card, name, dtype, kvalue, svalue)
- char *card, *name;
+ char *card;
+ const char *name;
DATTYPE dtype; /* type of value */
int kvalue;
char *svalue;
@@ -556,9 +574,9 @@
l = strlen(name);
if (l) xvbcopy(name, card, (size_t) l); /* copy name */
-
+
if (dtype == T_NOVAL) return;
-
+
if (dtype == T_STR) {
l = kvalue;
if (l <= 0) return;
@@ -566,9 +584,9 @@
xvbcopy(svalue, &card[8], (size_t) l);
return;
}
-
+
card[8] = '=';
-
+
if (dtype == T_LOG)
card[29] = kvalue ? 'T' : 'F';
else { /* T_INT */
@@ -579,8 +597,9 @@
/************************************/
-static char *rdcard(card, name, dtype, kvalue)
- char *card, *name;
+static const char *rdcard(card, name, dtype, kvalue)
+ char *card;
+ const char *name;
DATTYPE dtype; /* type of value */
long int *kvalue;
{
@@ -599,7 +618,7 @@
int i, ptr;
char namestr[9];
static char error[45];
-
+
xvbcopy(card, namestr, (size_t) 8);
for (i=7; i>=0 && namestr[i] == ' '; i--);
@@ -609,24 +628,24 @@
sprintf(error, "Keyword %s not found in FITS file", name);
return error;
}
-
+
/* get start of value */
ptr = 10;
while (ptr < 80 && card[ptr] == ' ') ptr++;
if (ptr == 80) return "FITS file has missing keyword value"; /* no value */
-
+
if (dtype == T_LOG) {
if (ptr != 29 || (card[29] != 'T' && card[29] != 'F'))
return "Keyword has bad logical value in FITS file";
*kvalue = (card[29] == 'T');
- }
+ }
else { /* an integer */
int j;
long int ival;
char num[21];
-
+
if (ptr > 29) return "Keyword has bad integer value in FITS file";
xvbcopy(&card[ptr], num, (size_t) (30-ptr));
num[30-ptr] = '\0';
@@ -634,7 +653,7 @@
if (j != 1) return "Keyword has bad integer value in FITS file";
*kvalue = ival;
}
-
+
return NULL;
}
@@ -660,13 +679,13 @@
*/
int res;
-
+
if (nelem == 0) return 0;
-
+
res = fread(buffer, (size_t) fs->size, (size_t) nelem, fs->fp);
/* if failed to read all the data because at end of file */
if (res != nelem && feof(fs->fp)) {
- /* nblock is the number of elements in a record.
+ /* nblock is the number of elements in a record.
size is always a factor of BLOCKSIZE */
int loffs, nblock=BLOCKSIZE/fs->size;
@@ -714,7 +733,7 @@
byte *ptr=buffer;
/*
- * conversions. Although the data may be signed, reverse using unsigned
+ * conversions. Although the data may be signed, reverse using unsigned
* variables.
* Because the native int types may be larger than the types in the file,
* we start from the end and work backwards to avoid overwriting data
@@ -741,12 +760,12 @@
((unsigned int)ptr[2] << 8) |
((unsigned int)ptr[3]);
}
-
+
/* convert from IEE 754 single precision to native form */
else if (fs->bitpix == -32) {
int j, k, expo;
static float *exps=NULL;
-
+
if (exps == NULL) {
exps = (float *)malloc(256 * sizeof(float));
if (exps == NULL) FatalError("Insufficient memory for exps store");
@@ -754,7 +773,7 @@
for (i=151; i < 256; i++) exps[i] = 2.*exps[i-1];
for (i=149; i >= 0; i--) exps[i] = 0.5*exps[i+1];
}
-
+
for (i=0; i < n; i++, ptr+=4) {
k = (int)*ptr;
j = ((int)ptr[1] << 16) | ((int)ptr[2] << 8) | (int)ptr[3];
@@ -765,13 +784,13 @@
}
}
-
+
/* convert from IEE 754 double precision to native form */
else if (fs->bitpix == -64) {
int expo, k, l;
unsigned int j;
static double *exps=NULL;
-
+
if (exps == NULL) {
exps = (double *)malloc(2048 * sizeof(double));
if (exps == NULL) FatalError("Insufficient memory for exps store");
@@ -779,7 +798,7 @@
for (i=1076; i < 2048; i++) exps[i] = 2.*exps[i-1];
for (i=1074; i >= 0; i--) exps[i] = 0.5*exps[i+1];
}
-
+
for (i=0; i < n; i++, ptr+=8) {
k = (int)*ptr;
j = ((unsigned int)ptr[1] << 24) | ((unsigned int)ptr[2] << 16) |
@@ -813,23 +832,36 @@
*/
void *voidbuff;
- int i, n, nrd;
+ int i, n, nrd, bufsize, overflow=0;
/* if the data is byte, then read it directly */
if (fs->bitpix == 8)
return ftgdata(fs, cbuff, nelem);
-
+
/* allocate a buffer to store the image */
- if (fs->bitpix == 16)
- voidbuff = (void *)malloc(nelem * sizeof(short int));
- else if (fs->bitpix == 32)
- voidbuff = (void *)malloc(nelem * sizeof(int));
- else
- voidbuff = (void *)malloc(nelem * (size_t) fs->size); /* float, double */
+ if (fs->bitpix == 16) {
+ bufsize = nelem * sizeof(short int);
+ if (bufsize/nelem != (int)sizeof(short int))
+ overflow = 1;
+ } else if (fs->bitpix == 32) {
+ bufsize = nelem * sizeof(int);
+ if (bufsize/nelem != (int)sizeof(short int))
+ overflow = 1;
+ } else {
+ bufsize = nelem * fs->size; /* float, double */
+ if (bufsize/nelem != fs->size)
+ overflow = 1;
+ }
+ if (overflow) {
+ SetISTR(ISTR_WARNING, "FITS image dimensions out of range");
+ return 0;
+ }
+
+ voidbuff = (void *)malloc((size_t) bufsize);
if (voidbuff == NULL) {
char emess[60];
- sprintf(emess, "Insufficient memory for raw image of %d bytes",
+ sprintf(emess, "Insufficient memory for raw image of %d bytes",
nelem*fs->size);
FatalError(emess);
}
@@ -843,28 +875,28 @@
short int *buffer=voidbuff;
int max, min, maxmin_t;
float scale;
-
+
min = max = buffer[0];
for (i=1; i < n; i++, buffer++) maxmin(*buffer, max, min);
scale = (max == min) ? 0. : 255./(float)(max-min);
-
+
/* rescale and convert */
for (i=0, buffer=voidbuff; i < n; i++)
cbuff[i] = (byte)(scale*(float)((int)buffer[i]-min));
-
+
/* convert long int to byte */
- }
+ }
else if (fs->bitpix == 32) {
int *buffer=voidbuff;
int max, min, maxmin_t;
float scale, fmin;
-
+
min = max = buffer[0];
for (i=1; i < n; i++, buffer++) maxmin(*buffer, max, min);
scale = (max == min) ? 1. : 255./((double)max-(double)min);
fmin = (float)min;
-
+
/* rescale and convert */
if (scale < 255./2.1e9) /* is max-min too big for an int ? */
for (i=0, buffer=voidbuff; i < n; i++)
@@ -872,34 +904,34 @@
else /* use integer subtraction */
for (i=0, buffer=voidbuff; i < n; i++)
cbuff[i] = (byte)(scale*(float)(buffer[i]-min));
-
-
- }
+
+
+ }
/* convert float to byte */
else if (fs->bitpix == -32) {
float *buffer=voidbuff;
float max, min, maxmin_t, scale;
-
+
min = max = buffer[0];
for (i=1; i < n; i++, buffer++) maxmin(*buffer, max, min);
scale = (max == min) ? 0. : 255./(max-min);
-
+
/* rescale and convert */
for (i=0, buffer=voidbuff; i < n; i++)
cbuff[i] = (byte)(scale*(buffer[i]-min));
-
- }
+
+ }
/* convert double to byte */
else if (fs->bitpix == -64) {
double *buffer=voidbuff;
double max, min, maxmin_t, scale;
-
+
min = max = buffer[0];
for (i=1; i < n; i++, buffer++) maxmin(*buffer, max, min);
scale = (max == min) ? 0. : 255./(max-min);
-
+
/* rescale and convert */
for (i=0, buffer=voidbuff; i < n; i++)
cbuff[i] = (byte)(scale*(buffer[i]-min));
@@ -923,7 +955,7 @@
int i;
int j, v;
byte *buff1, *buff2;
-
+
for (i=0; i < ny/2; i++) {
buff1 = &buffer[i*nx];
buff2 = &buffer[(ny-1-i)*nx];
diff -ru xv-3.10a/xvgam.c xv-3.10a-enhancements/xvgam.c
--- xv-3.10a/xvgam.c 1995-01-13 11:51:14.000000000 -0800
+++ xv-3.10a-enhancements/xvgam.c 2007-05-13 14:12:04.000000000 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* xvgam.c
*
* callable functions:
@@ -87,7 +87,7 @@
GRAF_STATE istate, rstate, gstate, bstate;
};
-static struct gamstate undo[MAXUNDO], preset[4], defstate;
+static struct gamstate undo[MAXUNDO], preset[4], defstate;
static struct gamstate *defLoadState;
static int uptr, uhead, utail;
@@ -99,7 +99,7 @@
int stval; /* start of range (ONLY val ifnot range) */
int enval; /* end of range */
int ccwise; /* 1 if range goes ccwise, 0 if cwise */
- char *str; /* title string */
+ const char *str; /* title string */
u_long fg,bg; /* colors */
int satval; /* saturation value on non-range dial */
BUTT hdbutt[N_HDBUTT];
@@ -122,7 +122,7 @@
static int defAutoApply;
static int hsvnonlinear = 0;
-static void printUTime PARM((char *));
+static void printUTime PARM((const char *));
static void computeHSVlinear PARM((void));
static void changedGam PARM((void));
@@ -153,8 +153,8 @@
static void dragHueDial PARM((void));
static void dragEditColor PARM((void));
-static void HDCreate PARM((HDIAL *, Window, int, int, int, int,
- int, int, char *, u_long, u_long));
+static void HDCreate PARM((HDIAL *, Window, int, int, int, int,
+ int, int, const char *, u_long, u_long));
static void HDRedraw PARM((HDIAL *, int));
static int HDClick PARM((HDIAL *, int, int));
@@ -191,10 +191,11 @@
/***************************/
static void printUTime(str)
- char *str;
+ const char *str;
{
#ifdef TIMING_TEST
- int i; struct rusage ru;
+ int i;
+ struct rusage ru;
i = getrusage(RUSAGE_SELF, &ru);
fprintf(stderr,"%s: utime = %ld.%ld seconds\n",
@@ -206,19 +207,19 @@
/***************************************************/
void CreateGam(geom, gam, rgam, ggam, bgam, defpreset)
- char *geom;
- double gam, rgam, ggam, bgam;
- int defpreset;
+ const char *geom;
+ double gam, rgam, ggam, bgam;
+ int defpreset;
{
XSetWindowAttributes xswa;
- gamW = CreateWindow("xv color editor", "XVcedit", geom,
+ gamW = CreateWindow("xv color editor", "XVcedit", geom,
GAMW, GAMH, infofg,infobg, 0);
if (!gamW) FatalError("can't create cedit window!");
-
+
cmapF = XCreateSimpleWindow(theDisp,gamW, 10, 8,CMAPF_WIDE,CMAPF_HIGH,
1,infofg,infobg);
- butF = XCreateSimpleWindow(theDisp,gamW, 10, 336,BUTF_WIDE,BUTF_HIGH,
+ butF = XCreateSimpleWindow(theDisp,gamW, 10, 336,BUTF_WIDE,BUTF_HIGH,
1,infofg,infobg);
modF = XCreateSimpleWindow(theDisp,gamW, 10, 438,MODF_WIDE,MODF_HIGH,
1,infofg,infobg);
@@ -227,7 +228,7 @@
rgbF = XCreateSimpleWindow(theDisp,gamW, 467, 8,RGBF_WIDE,RGBF_HIGH,
1,infofg,infobg);
- if (!cmapF || !butF || !modF || !hsvF || !rgbF)
+ if (!cmapF || !butF || !modF || !hsvF || !rgbF)
FatalError("couldn't create frame windows");
#ifdef BACKING_STORE
@@ -251,25 +252,25 @@
/********** COLORMAP editing doo-wahs ***********/
- BTCreate(&gbut[G_BCOLUNDO], cmapF, 5, 165, 66, BUTTH,
+ BTCreate(&gbut[G_BCOLUNDO], cmapF, 5, 165, 66, BUTTH,
"ColUndo", infofg, infobg, hicol, locol);
- BTCreate(&gbut[G_BCOLREV], cmapF, 5 + 66 + 1, 165, 67, BUTTH,
+ BTCreate(&gbut[G_BCOLREV], cmapF, 5 + 66 + 1, 165, 67, BUTTH,
"Revert", infofg, infobg, hicol, locol);
- BTCreate(&gbut[G_BHSVRGB], cmapF, 5+66+67+2, 165, 66, BUTTH,
+ BTCreate(&gbut[G_BHSVRGB], cmapF, 5+66+67+2, 165, 66, BUTTH,
"RGB/HSV", infofg, infobg, hicol, locol);
- BTCreate(&gbut[G_BMONO], cmapF, 5, 189, 66, BUTTH,
+ BTCreate(&gbut[G_BMONO], cmapF, 5, 189, 66, BUTTH,
"Grey", infofg, infobg, hicol, locol);
- BTCreate(&gbut[G_BRV], cmapF, 5 + 66 + 1, 189, 67, BUTTH,
+ BTCreate(&gbut[G_BRV], cmapF, 5 + 66 + 1, 189, 67, BUTTH,
"RevVid", infofg, infobg, hicol, locol);
- BTCreate(&gbut[G_BRNDCOL], cmapF, 5 + 66 + 67 + 2, 189, 66, BUTTH,
+ BTCreate(&gbut[G_BRNDCOL], cmapF, 5 + 66 + 67 + 2, 189, 66, BUTTH,
"Random", infofg, infobg, hicol, locol);
- DCreate(&rhDial, cmapF, 5, 215, 66, 100, 0,360,180, 5,
+ DCreate(&rhDial, cmapF, 5, 215, 66, 100, 0.0, 360.0, 180.0, 1.0, 5.0,
infofg, infobg, hicol, locol, "Hue", NULL);
- DCreate(&gsDial, cmapF, 72, 215, 66, 100, 0,360,180, 5,
+ DCreate(&gsDial, cmapF, 72, 215, 66, 100, 0.0, 360.0, 180.0, 1.0, 5.0,
infofg, infobg, hicol, locol, "Sat.", NULL);
- DCreate(&bvDial, cmapF, 139, 215, 66, 100, 0,360,180, 5,
+ DCreate(&bvDial, cmapF, 139, 215, 66, 100, 0.0, 360.0, 180.0, 1.0, 5.0,
infofg, infobg, hicol, locol, "Value", NULL);
rhDial.drawobj = gsDial.drawobj = bvDial.drawobj = dragEditColor;
@@ -291,44 +292,44 @@
#define BY2 (BY0 + BYSPACE*2)
#define BY3 (BY0 + BYSPACE*3)
- BTCreate(&gbut[G_BAPPLY], butF, BX0,BY0, 52,BUTTH,"Apply",
+ BTCreate(&gbut[G_BAPPLY], butF, BX0,BY0, 52,BUTTH,"Apply",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_BNOGAM], butF, BX0,BY1, 52,BUTTH,"NoMod",
+ BTCreate(&gbut[G_BNOGAM], butF, BX0,BY1, 52,BUTTH,"NoMod",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_BMAXCONT],butF, BX0,BY2, 52,BUTTH,"Norm",
+ BTCreate(&gbut[G_BMAXCONT],butF, BX0,BY2, 52,BUTTH,"Norm",
infofg,infobg,hicol,locol);
BTCreate(&gbut[G_BHISTEQ], butF, BX0,BY3, 52,BUTTH,"HistEq",
infofg,infobg,hicol,locol);
BTCreate(&gbut[G_BUP_BR],butF, BX1,BY0, 52,BUTTH,"Brite",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_BDN_BR],butF, BX1,BY1, 52,BUTTH,"Dim",
+ BTCreate(&gbut[G_BDN_BR],butF, BX1,BY1, 52,BUTTH,"Dim",
infofg,infobg,hicol,locol);
BTCreate(&gbut[G_BUP_CN],butF, BX1,BY2, 52,BUTTH,"Sharp",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_BDN_CN],butF, BX1,BY3, 52,BUTTH,"Dull",
+ BTCreate(&gbut[G_BDN_CN],butF, BX1,BY3, 52,BUTTH,"Dull",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_BRESET],butF, BX2, BY0, 52,BUTTH,"Reset",
+ BTCreate(&gbut[G_BRESET],butF, BX2, BY0, 52,BUTTH,"Reset",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_B1], butF, BX2, BY1, 25,BUTTH,"1",
+ BTCreate(&gbut[G_B1], butF, BX2, BY1, 25,BUTTH,"1",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_B2], butF, BX2+26,BY1, 26,BUTTH,"2",
+ BTCreate(&gbut[G_B2], butF, BX2+26,BY1, 26,BUTTH,"2",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_B3], butF, BX2, BY2, 25,BUTTH,"3",
+ BTCreate(&gbut[G_B3], butF, BX2, BY2, 25,BUTTH,"3",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_B4], butF, BX2+26,BY2, 26,BUTTH,"4",
+ BTCreate(&gbut[G_B4], butF, BX2+26,BY2, 26,BUTTH,"4",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_BSET], butF, BX2, BY3, 52,BUTTH,"Set",
+ BTCreate(&gbut[G_BSET], butF, BX2, BY3, 52,BUTTH,"Set",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_BUNDO], butF, BX3, BY0, 52,BUTTH,"Undo",
+ BTCreate(&gbut[G_BUNDO], butF, BX3, BY0, 52,BUTTH,"Undo",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_BREDO], butF, BX3, BY1, 52,BUTTH,"Redo",
+ BTCreate(&gbut[G_BREDO], butF, BX3, BY1, 52,BUTTH,"Redo",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_BGETRES],butF,BX3, BY2, 52,BUTTH,"CutRes",
+ BTCreate(&gbut[G_BGETRES],butF,BX3, BY2, 52,BUTTH,"CutRes",
infofg,infobg,hicol,locol);
- BTCreate(&gbut[G_BCLOSE],butF, BX3, BY3, 52,BUTTH,"Close",
+ BTCreate(&gbut[G_BCLOSE],butF, BX3, BY3, 52,BUTTH,"Close",
infofg,infobg,hicol,locol);
@@ -338,11 +339,11 @@
CBCreate(&enabCB, modF,2,2, "Display with HSV/RGB mods.",
infofg,infobg,hicol,locol);
- CBCreate(&autoCB, modF,2,2+17, "Auto-apply HSV/RGB mods.",
+ CBCreate(&autoCB, modF,2,2+17, "Auto-apply HSV/RGB mods.",
infofg,infobg,hicol,locol);
CBCreate(&dragCB, modF,2,2+17*2,"Auto-apply while dragging.",
infofg,infobg,hicol,locol);
- CBCreate(&resetCB,modF,2,2+17*3,"Auto-reset on new image.",
+ CBCreate(&resetCB,modF,2,2+17*3,"Auto-reset on new image.",
infofg,infobg,hicol,locol);
enabCB.val = autoCB.val = resetCB.val = dragCB.val = 1;
@@ -359,23 +360,23 @@
srcHD.drawobj = dstHD.drawobj = whtHD.drawobj = dragHueDial;
- DCreate(&satDial, hsvF, 100, 199, 100, 121, -100, 100, 0, 5,
+ DCreate(&satDial, hsvF, 100, 199, 100, 121, -100.0, 100.0, 0.0, 1.0, 5.0,
infofg, infobg,hicol,locol, "Saturation", "%");
- hueRB = RBCreate(NULL, hsvF, 7, 153, "1",
+ hueRB = RBCreate(NULL, hsvF, 7, 153, "1",
infofg, infobg,hicol,locol);
- RBCreate (hueRB,hsvF, 47, 153, "2",
+ RBCreate (hueRB,hsvF, 47, 153, "2",
infofg, infobg,hicol,locol);
- RBCreate (hueRB,hsvF, 87, 153, "3",
+ RBCreate (hueRB,hsvF, 87, 153, "3",
infofg, infobg,hicol,locol);
- RBCreate (hueRB,hsvF, 7, 170, "4",
+ RBCreate (hueRB,hsvF, 7, 170, "4",
infofg, infobg,hicol,locol);
- RBCreate (hueRB,hsvF, 47, 170, "5",
+ RBCreate (hueRB,hsvF, 47, 170, "5",
infofg, infobg,hicol,locol);
- RBCreate (hueRB,hsvF, 87, 170, "6",
+ RBCreate (hueRB,hsvF, 87, 170, "6",
infofg, infobg,hicol,locol);
- BTCreate(&hueclrB, hsvF, 127, 158, 70, BUTTH, "Reset",
+ BTCreate(&hueclrB, hsvF, 127, 158, 70, BUTTH, "Reset",
infofg, infobg,hicol,locol);
initHmap();
@@ -394,13 +395,13 @@
InitGraf(&gGraf);
CreateGraf(&gGraf, rgbF, 10, 179, infofg, infobg, "Green");
-
+
InitGraf(&bGraf);
CreateGraf(&bGraf, rgbF, 10, 338, infofg, infobg, "Blue");
satDial.drawobj = dragGamma;
intGraf.drawobj = rGraf.drawobj = gGraf.drawobj = bGraf.drawobj = dragGamma;
-
+
SetHSVmode();
ctrls2gamstate(&defstate);
@@ -415,14 +416,14 @@
Str2Graf(&preset[1].rstate,"L 4 : 0,0 : 127,0 : 128,255 : 255,255");
Str2Graf(&preset[1].gstate,"L 4 : 0,0 : 127,0 : 128,255 : 255,255");
Str2Graf(&preset[1].bstate,"L 4 : 0,0 : 127,0 : 128,255 : 255,255");
-
+
/* set up preset2 as a 'temperature' pseudo-color preset */
ctrls2gamstate(&preset[2]);
Str2Graf(&preset[2].rstate,"S 4 : 0,0 : 105,0 : 155,140 : 255,255");
Str2Graf(&preset[2].gstate,"S 5 : 0,0 : 57,135 : 127,255 : 198,135 : 255,0");
Str2Graf(&preset[2].bstate,"S 4 : 0,255 : 100,140 : 150,0 : 255,0");
-
+
/* set up preset3 as a 'map' pseudo-color preset */
ctrls2gamstate(&preset[3]);
@@ -480,7 +481,7 @@
computeHSVlinear();
}
-
+
/***************************************************/
int GamCheckEvent(xev)
@@ -492,14 +493,14 @@
int rv;
rv = 1;
-
+
if (xev->type == Expose) {
int x,y,w,h;
XExposeEvent *e = (XExposeEvent *) xev;
x = e->x; y = e->y; w = e->width; h = e->height;
/* throw away excess redraws for 'dumb' windows */
- if (e->count > 0 &&
+ if (e->count > 0 &&
(e->window == satDial.win || e->window == rhDial.win ||
e->window == gsDial.win || e->window == bvDial.win ||
e->window == cmapF || e->window == modF ||
@@ -600,7 +601,7 @@
else if (e->window == hsvF) {
- if (HDClick(&srcHD, x,y) || HDClick(&dstHD, x,y)) {
+ if (HDClick(&srcHD, x,y) || HDClick(&dstHD, x,y)) {
dials2hmap();
build_hremap();
changedGam();
@@ -654,7 +655,7 @@
e->window == gsDial.win ||
e->window == bvDial.win) {
- if ((e->window == rhDial.win && DTrack(&rhDial, x,y)) ||
+ if ((e->window == rhDial.win && DTrack(&rhDial, x,y)) ||
(e->window == gsDial.win && DTrack(&gsDial, x,y)) ||
(e->window == bvDial.win && DTrack(&bvDial, x,y))) {
saveCMap(&prevcmap);
@@ -683,7 +684,7 @@
XKeyEvent *e = (XKeyEvent *) xev;
char buf[128]; KeySym ks;
int stlen;
-
+
stlen = XLookupString(e,buf,128,&ks,(XComposeStatus *) NULL);
buf[stlen] = '\0';
@@ -722,7 +723,7 @@
if (whtHD.enabCB.val && whtHD.satval) hsvnonlinear++;
- if (satDial.val != 0) hsvnonlinear++;
+ if (satDial.val != 0.0) hsvnonlinear++;
/* check intensity graf */
for (i=0; i<256 && intGraf.func[i]==i; i++);
@@ -792,7 +793,7 @@
int x,y;
{
XPoint pts[8];
-
+
pts[0].x = x+10; pts[0].y = y;
pts[1].x = x-4; pts[1].y = y-100;
pts[2].x = x-4; pts[2].y = y-40;
@@ -873,11 +874,11 @@
XSetForeground(theDisp, theGC, infofg);
if (picType != PIC8) {
- CenterString(cmapF, CMAPX + CMAPW/2, CMAPY + CMAPH/2,
+ CenterString(cmapF, CMAPX + CMAPW/2, CMAPY + CMAPH/2,
"No colormap in 24-bit mode.");
return;
}
-
+
for (i=0; iwin == butF && PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) break;
}
- /* if 'Set' is lit, and we didn't click 'set' or 'Reset' or '1'..'4',
+ /* if 'Set' is lit, and we didn't click 'set' or 'Reset' or '1'..'4',
turn it off */
if (i!=G_BSET && i!=G_B1 && i!=G_B2 && i!=G_B3 && i!=G_B4 && i!=G_BRESET
&& gbut[G_BSET].lit) {
- gbut[G_BSET].lit = 0;
+ gbut[G_BSET].lit = 0;
BTRedraw(&gbut[G_BSET]);
}
-
+
if (i0, clicked on something in same group
remove target from group
curgroup>0, clicked on something in different group
- merge groups. (target group gets
+ merge groups. (target group gets
set equal to current values)
curgroup>0, clicked on something in no group
add target to curgroup
curgroup=0, clicked on something in a group
- add editColor to target group,
+ add editColor to target group,
set curgroup = target group
target group gets current values
curgroup=0, clicked on something in no group
@@ -1185,7 +1186,7 @@
}
}
- else if ((mode!=DELONLY) && cellgroup[cnum] != curgroup &&
+ else if ((mode!=DELONLY) && cellgroup[cnum] != curgroup &&
cellgroup[cnum]>0) {
/* merge clicked-on group into curgroup */
mode = ADDONLY;
@@ -1196,11 +1197,11 @@
selectCell(i,1);
rcmap[i] = rcmap[editColor];
gcmap[i] = gcmap[editColor];
- bcmap[i] = bcmap[editColor];
+ bcmap[i] = bcmap[editColor];
}
}
}
-
+
else if ((mode!=DELONLY) && cellgroup[cnum] == 0) {
/* merge clicked-on cell into curgroup */
mode = ADDONLY;
@@ -1209,7 +1210,7 @@
selectCell(cnum,1);
rcmap[cnum] = rcmap[editColor];
gcmap[cnum] = gcmap[editColor];
- bcmap[cnum] = bcmap[editColor];
+ bcmap[cnum] = bcmap[editColor];
}
}
@@ -1224,14 +1225,14 @@
selectCell(i,1);
rcmap[i] = rcmap[editColor];
gcmap[i] = gcmap[editColor];
- bcmap[i] = bcmap[editColor];
+ bcmap[i] = bcmap[editColor];
}
}
curgroup = cellgroup[cnum];
cellgroup[editColor] = curgroup;
}
-
- else if ((mode!=DELONLY) && (cellgroup[cnum] == 0)
+
+ else if ((mode!=DELONLY) && (cellgroup[cnum] == 0)
&& (cnum != editColor)) {
/* create new group for these two cells (cnum and editColor) */
mode = ADDONLY;
@@ -1247,14 +1248,14 @@
}
return rv;
-}
-
+}
+
/*********************/
void ChangeEC(num)
int num;
{
- /* given a color # that is to become the new editColor, do all
+ /* given a color # that is to become the new editColor, do all
highlighting/unhighlighting, copy editColor's rgb values to
the rgb/hsv dials */
@@ -1291,18 +1292,18 @@
rgb2hsv(rcmap[editColor], gcmap[editColor], bcmap[editColor], &h, &s, &v);
if (h<0) h = 0;
- DSetVal(&rhDial, (int) h);
- DSetVal(&gsDial, (int) (s*100));
- DSetVal(&bvDial, (int) (v*100));
+ DSetVal(&rhDial, h);
+ DSetVal(&gsDial, s*100);
+ DSetVal(&bvDial, v*100);
}
else {
- DSetVal(&rhDial, rcmap[editColor]);
- DSetVal(&gsDial, gcmap[editColor]);
- DSetVal(&bvDial, bcmap[editColor]);
+ DSetVal(&rhDial, (double)rcmap[editColor]);
+ DSetVal(&gsDial, (double)gcmap[editColor]);
+ DSetVal(&bvDial, (double)bcmap[editColor]);
}
}
-
-
+
+
/*********************/
void ApplyECctrls()
{
@@ -1310,16 +1311,15 @@
if (hsvmode) {
int rv, gv, bv;
- hsv2rgb((double) rhDial.val, ((double) gsDial.val) / 100.0,
- ((double) bvDial.val) / 100.0, &rv, &gv, &bv);
+ hsv2rgb(rhDial.val, gsDial.val / 100.0, bvDial.val / 100.0, &rv, &gv, &bv);
rcmap[editColor] = rv;
gcmap[editColor] = gv;
bcmap[editColor] = bv;
}
else {
- rcmap[editColor] = rhDial.val;
- gcmap[editColor] = gsDial.val;
- bcmap[editColor] = bvDial.val;
+ rcmap[editColor] = (int)rhDial.val;
+ gcmap[editColor] = (int)gsDial.val;
+ bcmap[editColor] = (int)bvDial.val;
}
}
@@ -1330,7 +1330,7 @@
{
/* this function generates the Floyd-Steinberg gamma curve (fsgamcr)
- This function generates a 4 point spline curve to be used as a
+ This function generates a 4 point spline curve to be used as a
non-linear grey 'colormap'. Two of the points are nailed down at 0,0
and 255,255, and can't be changed. You specify the other two. If
you specify points on the line (0,0 - 255,255), you'll get the normal
@@ -1345,7 +1345,7 @@
double yf[4];
InitSpline(x, y, 4, yf);
-
+
for (i=0; i<256; i++) {
j = (int) EvalSpline(x, y, yf, 4, (double) i);
if (j<0) j=0;
@@ -1364,14 +1364,14 @@
switch (cmd) {
- case G_BAPPLY:
+ case G_BAPPLY:
if (enabCB.val != 1) { enabCB.val = 1; CBRedraw(&enabCB); }
- applyGamma(0);
+ applyGamma(0);
break;
case G_BNOGAM:
if (enabCB.val != 0) { enabCB.val = 0; CBRedraw(&enabCB); }
- applyGamma(0);
+ applyGamma(0);
break;
case G_BUNDO: gamUndo(); break;
@@ -1383,7 +1383,7 @@
- case G_BDN_BR:
+ case G_BDN_BR:
case G_BUP_BR: GetGrafState(&intGraf, &gs);
for (i=0; i < gs.nhands; i++) {
if (cmd==G_BUP_BR) gs.hands[i].y += 10;
@@ -1434,7 +1434,7 @@
else if (cmd==G_B3) ptr = &preset[2];
else if (cmd==G_B4) ptr = &preset[3];
else if (cmd==G_BRESET) ptr = &defstate;
-
+
if (gbut[G_BSET].lit) {
ctrls2gamstate(ptr);
gbut[G_BSET].lit = 0;
@@ -1454,7 +1454,7 @@
break;
- case G_BCOLREV:
+ case G_BCOLREV:
{
struct cmapstate tmp1cmap;
int gchg;
@@ -1463,9 +1463,9 @@
gchg = (i!=numcols);
saveCMap(&tmpcmap); /* buffer current cmapstate */
-
+
for (i=0; i0 && !hist[i]; i--);
*rmaxv = i;
}
-
+
else { /* PIC24 */
int v,minv,maxv;
@@ -1724,7 +1724,7 @@
hist[v]++;
}
}
-
+
*rminv = minv; *rmaxv = maxv;
}
@@ -1764,13 +1764,13 @@
int i, histeq[256], minv, maxv;
calcHistEQ(histeq, &minv, &maxv); /* ignore minv,maxv */
-
- for (i=0; i<256; i++)
+
+ for (i=0; i<256; i++)
intGraf.func[i] = histeq[i];
-
+
for (i=0; i< intGraf.nhands; i++)
intGraf.hands[i].y = intGraf.func[intGraf.hands[i].x];
-
+
intGraf.entergamma = 0;
if (gamUp) {
@@ -1797,7 +1797,7 @@
if (v>maxv) maxv = v;
}
}
- else {
+ else {
int histeq[256];
calcHistEQ(histeq, &minv, &maxv); /* ignore histeq */
}
@@ -1833,11 +1833,11 @@
for (i=0; i= 128*3)
? white : black;
}
@@ -1875,7 +1875,7 @@
if (DEBUG>1) fprintf(stderr," (v=%f)",v);
if (h>=0) {
- hi = (int) h;
+ hi = (int) h;
if (hi<0) hi += 360;
if (hi>=360) hi -= 360;
h = (double) hremap[hi];
@@ -1884,14 +1884,14 @@
if (whtHD.enabCB.val) {
h = (double) whtHD.stval;
s = (double) whtHD.satval / 100.0;
-
+
/* special case: if stval = satval = 0, set hue = -1 */
if (whtHD.stval == 0 && whtHD.satval == 0) h = -1.0;
}
}
/* apply satDial value to s */
- s = s + ((double) satDial.val) / 100.0;
+ s = s + satDial.val / 100.0;
if (s<0.0) s = 0.0;
if (s>1.0) s = 1.0;
@@ -1899,13 +1899,13 @@
if (DEBUG>1) fprintf(stderr," -> %d,%d,%d",rv,gv,bv);
}
- rMap[col] = rGraf.func[rv];
+ rMap[col] = rGraf.func[rv];
gMap[col] = gGraf.func[gv];
bMap[col] = bGraf.func[bv];
- if (!ncols)
- cols[col] =
- (((int)rMap[col]) + ((int)gMap[col]) + ((int)bMap[col]) >= 128*3)
+ if (!ncols)
+ cols[col] =
+ (((int)rMap[col]) + ((int)gMap[col]) + ((int)bMap[col]) >= 128*3)
? white : black;
if (DEBUG>1) fprintf(stderr," -> %d,%d,%d\n",rMap[col],gMap[col],bMap[col]);
@@ -2001,13 +2001,13 @@
{
xvbcopy((char *) hmap, (char *) gs->hmap, sizeof(hmap));
- gs->wht_stval = whtHD.stval;
- gs->wht_satval = whtHD.satval;
+ gs->wht_stval = whtHD.stval;
+ gs->wht_satval = whtHD.satval;
gs->wht_enab = whtHD.enabCB.val;
gs->hueRBnum = RBWhich(hueRB);
- gs->satval = satDial.val;
+ gs->satval = (int)satDial.val;
GetGrafState(&intGraf,&gs->istate);
GetGrafState(&rGraf, &gs->rstate);
GetGrafState(&gGraf, &gs->gstate);
@@ -2042,7 +2042,7 @@
srcHD.ccwise = hm->src_ccw;
HDRedraw(&srcHD, HD_ALL | HD_CLEAR);
}
-
+
if (dstHD.stval != hm->dst_st ||
dstHD.enval != hm->dst_en ||
dstHD.ccwise != hm->dst_ccw) {
@@ -2051,7 +2051,7 @@
dstHD.ccwise = hm->dst_ccw;
HDRedraw(&dstHD, HD_ALL | HD_CLEAR);
}
- }
+ }
if (whtHD.stval != gs->wht_stval || whtHD.satval != gs->wht_satval ||
@@ -2063,9 +2063,9 @@
HDRedraw(&whtHD, HD_ALL | HD_CLEAR);
changed++;
}
-
- if (gs->satval != satDial.val) {
- DSetVal(&satDial,gs->satval);
+
+ if (gs->satval != (int)satDial.val) {
+ DSetVal(&satDial,(double)gs->satval);
changed++;
}
@@ -2203,7 +2203,7 @@
}
-
+
/*********************/
static void parseResources()
@@ -2226,7 +2226,7 @@
if (i) { sprintf(gname,"preset%d",i); gsp = &preset[i-1]; }
else { sprintf(gname,"default"); gsp = &defstate; }
- xvbcopy((char *) gsp, (char *) &gs,
+ xvbcopy((char *) gsp, (char *) &gs,
sizeof(struct gamstate)); /* load 'gs' with defaults */
for (j=0; j<6; j++) { /* xv.*.huemap resources */
@@ -2239,7 +2239,7 @@
lower_str(def_str);
if (sscanf(def_str,"%d %d %s %d %d %s",
&fst, &fen, fcw, &tst, &ten, tcw) != 6) {
- fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n",
+ fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n",
cmd, tmp, def_str);
}
else {
@@ -2260,7 +2260,7 @@
int wst, wsat, enab;
if (DEBUG) fprintf(stderr,"parseResource 'xv.%s: %s'\n",tmp, def_str);
if (sscanf(def_str,"%d %d %d", &wst, &wsat, &enab) != 3) {
- fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n",
+ fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n",
cmd, tmp, def_str);
}
else { /* successful parse */
@@ -2276,7 +2276,7 @@
int sat;
if (DEBUG) fprintf(stderr,"parseResource 'xv.%s: %s'\n",tmp, def_str);
if (sscanf(def_str,"%d", &sat) != 1) {
- fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n",
+ fprintf(stderr,"%s: unable to parse resource 'xv.%s: %s'\n",
cmd, tmp, def_str);
}
else { /* successful parse */
@@ -2304,7 +2304,7 @@
}
}
}
-
+
/* copy (potentially) modified gs back to default/preset */
xvbcopy((char *) &gs, (char *) gsp, sizeof(struct gamstate));
}
@@ -2324,16 +2324,16 @@
/* write out current state */
ctrls2gamstate(&gstate);
strcpy(gname, "xv.default");
-
+
/* write out huemap resources */
for (i=0; i<6; i++) {
if (1 || gstate.hmap[i].src_st != gstate.hmap[i].dst_st ||
gstate.hmap[i].src_en != gstate.hmap[i].dst_en ||
gstate.hmap[i].src_ccw != gstate.hmap[i].dst_ccw) {
- sprintf(tmp, "%s.huemap%d: %3d %3d %3s %3d %3d %3s\n", gname, i+1,
- gstate.hmap[i].src_st, gstate.hmap[i].src_en,
+ sprintf(tmp, "%s.huemap%d: %3d %3d %3s %3d %3d %3s\n", gname, i+1,
+ gstate.hmap[i].src_st, gstate.hmap[i].src_en,
gstate.hmap[i].src_ccw ? "CCW" : "CW",
- gstate.hmap[i].dst_st, gstate.hmap[i].dst_en,
+ gstate.hmap[i].dst_st, gstate.hmap[i].dst_en,
gstate.hmap[i].dst_ccw ? "CCW" : "CW");
strcat(rsrc, tmp);
}
@@ -2341,7 +2341,7 @@
/* write out whtmap resource */
if (1 || gstate.wht_stval || gstate.wht_satval || gstate.wht_enab != 1) {
- sprintf(tmp, "%s.whtmap: %d %d %d\n", gname, gstate.wht_stval,
+ sprintf(tmp, "%s.whtmap: %d %d %d\n", gname, gstate.wht_stval,
gstate.wht_satval, gstate.wht_enab);
strcat(rsrc, tmp);
}
@@ -2372,7 +2372,7 @@
NewCutBuffer(rsrc);
}
-
+
/*****************************/
static void dragGamma ()
@@ -2381,14 +2381,14 @@
while gamma ctrls are being dragged
applies change to image if dragCB.val is set
does NOT call saveGamState() (as changedGam does) */
-
+
if (dragCB.val && dragCB.active) {
hsvnonlinear = 1; /* force HSV calculations during drag */
applyGamma(0);
}
}
-
+
/*****************************/
static void dragHueDial()
{
@@ -2396,7 +2396,7 @@
while hue gamma ctrls are being dragged
applies change to image if dragCB.val is set
does NOT call saveGamState() (as changedGam does) */
-
+
if (dragCB.val && dragCB.active) {
dials2hmap();
build_hremap();
@@ -2413,14 +2413,14 @@
while color editor ctrls are being dragged
applies change to image if dragCB.val is set
does NOT call saveCMap(&prevcmap); BTSetActive(&gbut[G_BCOLUNDO],1); */
-
+
if (dragCB.val && dragCB.active) ApplyEditColor(0);
}
-
-
-
+
+
+
/**********************************************/
/************* HUE wheel functions ***********/
@@ -2435,11 +2435,11 @@
/**************************************************/
static void HDCreate(hd, win, x, y, r, st, en, ccwise, str, fg, bg)
-HDIAL *hd;
-Window win;
-int x,y,r,st,en,ccwise;
-char *str;
-u_long fg,bg;
+ HDIAL *hd;
+ Window win;
+ int x, y, r, st, en, ccwise;
+ const char *str;
+ u_long fg, bg;
{
int i;
@@ -2470,7 +2470,7 @@
hdbpix2[HDB_ROTR] = hdbpix1[HDB_ROTR];
}
-
+
#define BCOLS fg,bg,hicol,locol
if (hd->range) {
@@ -2520,13 +2520,13 @@
}
if (flags & HD_FRAME) {
- static char *colstr = "RYGCBM";
+ static const char *colstr = "RYGCBM";
char tstr[2];
XSetForeground(theDisp, theGC, hd->fg);
XDrawArc(theDisp, hd->win, theGC, hd->x - HD_RADIUS, hd->y - HD_RADIUS,
HD_RADIUS*2, HD_RADIUS*2, 0, 360*64);
-
+
for (i=0; i<6; i++) {
int kldg;
@@ -2553,8 +2553,8 @@
a = hdg2xdg(hd->stval) * DEG2RAD;
pol2xy(hd->x, hd->y, a, HD_RADIUS - 4, &x, &y);
XDrawLine(theDisp, hd->win, theGC, hd->x, hd->y, x,y);
-
- if (flags & HD_CLHNDS)
+
+ if (flags & HD_CLHNDS)
XFillRectangle(theDisp, hd->win, theGC, x-2,y-2, 5,5);
else {
XSetForeground(theDisp, theGC, hd->bg);
@@ -2567,8 +2567,8 @@
a = hdg2xdg(hd->enval) * DEG2RAD;
pol2xy(hd->x, hd->y, a, HD_RADIUS - 4, &x, &y);
XDrawLine(theDisp, hd->win, theGC, hd->x, hd->y, x,y);
-
- if (flags & HD_CLHNDS)
+
+ if (flags & HD_CLHNDS)
XFillRectangle(theDisp, hd->win, theGC, x-2,y-2, 5,5);
else {
XSetForeground(theDisp, theGC, hd->bg);
@@ -2587,7 +2587,7 @@
r = ((HD_RADIUS - 4) * hd->satval) / 100;
pol2xy(hd->x, hd->y, a, r, &x, &y);
- if (flags & HD_CLHNDS)
+ if (flags & HD_CLHNDS)
XFillRectangle(theDisp, hd->win, theGC, x-2,y-2, 5,5);
else {
XFillRectangle(theDisp, hd->win, theGC, hd->x-1, hd->y-1, 3,3);
@@ -2600,7 +2600,7 @@
}
}
}
-
+
@@ -2653,13 +2653,13 @@
XSetBackground(theDisp, theGC, hd->bg);
if (hd->range) {
- sprintf(vstr,"%3d\007,%3d\007 %s", hd->stval, hd->enval,
+ sprintf(vstr,"%3d\007,%3d\007 %s", hd->stval, hd->enval,
hd->ccwise ? "CCW" : " CW");
}
else {
sprintf(vstr,"%3d\007 %3d%%", hd->stval, hd->satval);
}
-
+
XDrawImageString(theDisp, hd->win, theGC,
hd->x - XTextWidth(monofinfo, vstr, (int) strlen(vstr))/2,
hd->y + HD_RADIUS + 24, vstr, (int) strlen(vstr));
@@ -2669,7 +2669,7 @@
if (flags & HD_TITLE) {
XSetForeground(theDisp, theGC, hd->fg);
- ULineString(hd->win, hd->x - HD_RADIUS - 15, hd->y - HD_RADIUS - 4,
+ ULineString(hd->win, hd->x - HD_RADIUS - 15, hd->y - HD_RADIUS - 4,
hd->str);
}
@@ -2694,7 +2694,7 @@
}
-
+
/**************************************************/
static int HDClick(hd,mx,my)
HDIAL *hd;
@@ -2716,7 +2716,7 @@
if (!hd->range && !hd->enabCB.val) return 0; /* disabled */
- if ( ((mx - hd->x) * (mx - hd->x) + (my - hd->y) * (my - hd->y))
+ if ( ((mx - hd->x) * (mx - hd->x) + (my - hd->y) * (my - hd->y))
< (HD_RADIUS * HD_RADIUS)) {
return HDTrack(hd,mx,my);
}
@@ -2816,14 +2816,14 @@
hd->satval--; if (hd->satval<0) hd->satval = 0;
HDRedraw(hd, HD_HANDS | HD_VALS);
}
-
+
else if (bnum == HDB_SAT && hd->satval<100) {
HDRedraw(hd, HD_CLHNDS);
hd->satval++; if (hd->satval>100) hd->satval = 100;
HDRedraw(hd, HD_HANDS | HD_VALS);
}
}
-
+
break;
}
@@ -2836,7 +2836,7 @@
}
if (bp->lit) { bp->lit = 0; BTRedraw(bp); }
-
+
return 1;
}
@@ -2872,7 +2872,7 @@
dx = x - hd->x; dy = y - hd->y;
dist = sqrt(dx*dx + dy*dy);
-
+
newsat = (int) (dist / ((double) (HD_RADIUS - 4)) * 100);
RANGE(newsat,0,100);
@@ -2899,7 +2899,7 @@
a = hdg2xdg(hd->enval) * DEG2RAD;
pol2xy(hd->x, hd->y, a, HD_RADIUS-4, &x,&y);
if (PTINRECT(mx,my,x-3,y-3,7,7)) handle = 2;
-
+
if (!handle) { /* not in either, rotate both */
@@ -2939,7 +2939,7 @@
}
rv = (origj != j);
}
-
+
else { /* in one of the handles */
if (handle==1) valp = &(hd->stval); else valp = &(hd->enval);
@@ -2958,22 +2958,22 @@
if (!hd->ccwise) {
ddist = (hd->enval - hd->stval + 360) % 360;
- if (handle==1)
+ if (handle==1)
ndist = (hd->enval - j + 360) % 360;
else
ndist = (j - hd->stval + 360) % 360;
}
else {
ddist = (hd->stval - hd->enval + 360) % 360;
- if (handle==1)
+ if (handle==1)
ndist = (j - hd->enval + 360) % 360;
else
ndist = (hd->stval - j + 360) % 360;
}
- if (abs(ddist - ndist) >= 180 && ddist<180)
+ if (abs(ddist - ndist) >= 180 && ddist<180)
hd->ccwise = !hd->ccwise;
-
+
*valp = j;
HDRedraw(hd, HD_HANDS | HD_DIR | HD_VALS);
@@ -2986,8 +2986,8 @@
return rv;
}
-
-
+
+
/**************************************************/
static int hdg2xdg(hdg)
@@ -3012,7 +3012,7 @@
*yp = cy - (int) (sin(ang) * (double) rad);
}
-
+
/***************************************************/
static int computeHDval(hd, x, y)
HDIAL *hd;
@@ -3044,7 +3044,7 @@
-
+
/****************************************************/
static void initHmap()
{
@@ -3117,10 +3117,10 @@
(hmap[i].src_en != hmap[i].dst_en) ||
(hmap[i].src_ccw != hmap[i].dst_ccw)) { /* not a 1:1 mapping */
- st1 = hmap[i].src_st;
+ st1 = hmap[i].src_st;
en1 = hmap[i].src_en;
if (hmap[i].src_ccw) {
- inc1 = -1;
+ inc1 = -1;
len1 = (st1 - en1 + 360) % 360;
}
else {
@@ -3131,7 +3131,7 @@
st2 = hmap[i].dst_st;
en2 = hmap[i].dst_en;
if (hmap[i].dst_ccw) {
- inc2 = -1;
+ inc2 = -1;
len2 = (st2 - en2 + 360) % 360;
}
else {
@@ -3179,7 +3179,7 @@
byte *pp, *op;
int i,j;
- int rv, gv, bv, vi, hi;
+ int rv, gv, bv;
byte *outpic;
int min, max, del, h, s, v;
int f, p, q, t, vs100, vsf10000;
@@ -3200,7 +3200,7 @@
if (whtHD.enabCB.val && whtHD.satval) hsvmod++;
- if (satDial.val != 0) hsvmod++;
+ if (satDial.val != 0.0) hsvmod++;
/* check intensity graf */
for (i=0; i<256; i++) {
@@ -3270,7 +3270,7 @@
/* map near-black to black to avoid weird effects */
if (v <= 16) s = 0;
-
+
/* apply intGraf.func[] function to 'v' (the intensity) */
v = intGraf.func[v];
@@ -3284,7 +3284,7 @@
}
/* apply satDial value to s */
- s = s + satDial.val;
+ s = s + (int)satDial.val;
if (s< 0) s = 0;
if (s>100) s = 100;
@@ -3295,7 +3295,7 @@
if (h==NOHUE || !s) { rv = gv = bv = v; }
else {
if (h==360) h = 0;
-
+
h = (h*100) / 60; /* h is in range 000..599 (0.0 - 5.99) */
j = h - (h%100); /* j = 000, 100, 200, 300, 400, 500 */
f = h - j; /* 'fractional' part of h (00..99) */
@@ -3305,7 +3305,7 @@
p = v - vs100;
q = v - vsf10000;
t = v - vs100 + vsf10000;
-
+
switch (j) {
case 000: rv = v; gv = t; bv = p; break;
case 100: rv = q; gv = v; bv = p; break;
@@ -3319,7 +3319,7 @@
} /* if hsvmod */
- *op++ = rGraf.func[rv];
+ *op++ = rGraf.func[rv];
*op++ = gGraf.func[gv];
*op++ = bGraf.func[bv];
}
diff -ru xv-3.10a/xvgif.c xv-3.10a-enhancements/xvgif.c
--- xv-3.10a/xvgif.c 1995-01-10 11:54:41.000000000 -0800
+++ xv-3.10a-enhancements/xvgif.c 2007-05-13 17:33:51.000000000 -0700
@@ -28,17 +28,19 @@
typedef int boolean;
#define NEXTBYTE (*dataptr++)
+#define SKIPBYTE (dataptr++) /* quiet some compiler warnings */
#define EXTENSION 0x21
-#define IMAGESEP 0x2c
+#define IMAGESEP 0x2c /* a.k.a. Image Descriptor */
#define TRAILER 0x3b
#define INTERLACEMASK 0x40
#define COLORMAPMASK 0x80
-
-FILE *fp;
-int BitOffset = 0, /* Bit Offset of next code */
+static FILE *fp;
+
+static int
+ BitOffset = 0, /* Bit Offset of next code */
XC = 0, YC = 0, /* Output X and Y coords of current pixel */
Pass = 0, /* Used by output routine if interlaced pic */
OutCount = 0, /* Decompressor output 'stack count' */
@@ -46,9 +48,10 @@
Width, Height, /* image dimensions */
LeftOfs, TopOfs, /* image offset */
BitsPerPixel, /* Bits per pixel, read from GIF header */
- BytesPerScanline, /* bytes per scanline in output raster */
+/* BytesPerScanline, */ /* bytes per scanline in output raster */
ColorMapSize, /* number of colors */
Background, /* background color */
+ Transparent, /* transparent color (GRR 19980314) */
CodeSize, /* Code size, read from GIF header */
InitCodeSize, /* Starting code size, used during Clear */
Code, /* Value returned by ReadCode */
@@ -57,47 +60,49 @@
EOFCode, /* GIF end-of-information code */
CurCode, OldCode, InCode, /* Decompressor variables */
FirstFree, /* First free code, generated per GIF spec */
- FreeCode, /* Decompressor,next free slot in hash table */
+ FreeCode, /* Decompressor, next free slot in hash table */
FinChar, /* Decompressor variable */
BitMask, /* AND mask for data size */
ReadMask, /* Code AND mask for current code size */
- Misc; /* miscellaneous bits (interlace, local cmap)*/
+ Misc, /* miscellaneous bits (interlace, local cmap)*/
+ GlobalBitsPerPixel, /* may have local colormap of different size */
+ GlobalColorMapSize, /* (ditto) */
+ GlobalBitMask; /* (ditto) */
-boolean Interlace, HasColormap;
+static boolean Interlace, HasGlobalColormap;
-byte *RawGIF; /* The heap array to hold it, raw */
-byte *Raster; /* The raster data stream, unblocked */
-byte *pic8;
+static byte *RawGIF; /* The heap array to hold it, raw */
+static byte *Raster; /* The raster data stream, unblocked */
+static byte *pic8;
/* The hash table used by the decompressor */
-int Prefix[4096];
-int Suffix[4096];
+static int Prefix[4096];
+static int Suffix[4096];
/* An output array used by the decompressor */
-int OutCode[4097];
+static int OutCode[4097];
-int gif89 = 0;
-char *id87 = "GIF87a";
-char *id89 = "GIF89a";
+static int gif89 = 0;
+static const char *id87 = "GIF87a";
+static const char *id89 = "GIF89a";
-static int EGApalette[16][3] = {
- {0,0,0}, {0,0,128}, {0,128,0}, {0,128,128},
+static int const EGApalette[16][3] = {
+ {0,0,0}, {0,0,128}, {0,128,0}, {0,128,128},
{128,0,0}, {128,0,128}, {128,128,0}, {200,200,200},
{100,100,100}, {100,100,255}, {100,255,100}, {100,255,255},
{255,100,100}, {255,100,255}, {255,255,100}, {255,255,255} };
-
+
static int readImage PARM((PICINFO *));
static int readCode PARM((void));
static void doInterlace PARM((int));
-static int gifError PARM((PICINFO *, char *));
-static void gifWarning PARM((char *));
+static int gifError PARM((PICINFO *, const char *));
+static void gifWarning PARM((const char *));
-int filesize;
-char *bname;
-
-byte *dataptr;
+static int filesize;
+static const char *bname;
+static byte *dataptr;
/*****************************/
@@ -108,17 +113,22 @@
{
/* returns '1' if successful */
- register byte ch, ch1, *origptr;
+ register byte ch, *origptr;
register int i, block;
- int aspect, gotimage;
+ int aspect;
+ char tmpname[256];
+ byte r[256], g[256], b[256];
/* initialize variables */
- BitOffset = XC = YC = Pass = OutCount = gotimage = 0;
+ BitOffset = XC = YC = OutCount = 0;
+ Pass = -1;
RawGIF = Raster = pic8 = NULL;
gif89 = 0;
+ Transparent = -1;
pinfo->pic = (byte *) NULL;
pinfo->comment = (char *) NULL;
+ pinfo->numpages= 0;
bname = BaseName(fname);
fp = xv_fopen(fname,"r");
@@ -129,67 +139,87 @@
fseek(fp, 0L, 2);
filesize = ftell(fp);
fseek(fp, 0L, 0);
-
- /* the +256's are so we can read truncated GIF files without fear of
+
+ if (filesize + 256 < filesize)
+ return( gifError(pinfo, "GIF file size is too large") );
+
+ /* the +256's are so we can read truncated GIF files without fear of
segmentation violation */
if (!(dataptr = RawGIF = (byte *) calloc((size_t) filesize+256, (size_t) 1)))
- return( gifError(pinfo, "not enough memory to read gif file") );
-
- if (!(Raster = (byte *) calloc((size_t) filesize+256,(size_t) 1)))
- return( gifError(pinfo, "not enough memory to read gif file") );
-
- if (fread(dataptr, (size_t) filesize, (size_t) 1, fp) != 1)
- return( gifError(pinfo, "GIF data read failed") );
+ FatalError("LoadGIF: not enough memory to read GIF file");
+ if (!(Raster = (byte *) calloc((size_t) filesize+256,(size_t) 1)))
+ FatalError("LoadGIF: not enough memory to read GIF file");
+
+ if (fread(dataptr, (size_t) filesize, (size_t) 1, fp) != 1)
+ return( gifError(pinfo, "GIF data read failed") );
+ fclose(fp);
origptr = dataptr;
if (strncmp((char *) dataptr, id87, (size_t) 6)==0) gif89 = 0;
else if (strncmp((char *) dataptr, id89, (size_t) 6)==0) gif89 = 1;
else return( gifError(pinfo, "not a GIF file"));
-
+
dataptr += 6;
-
+
/* Get variables from the GIF screen descriptor */
-
+
ch = NEXTBYTE;
RWidth = ch + 0x100 * NEXTBYTE; /* screen dimensions... not used. */
ch = NEXTBYTE;
RHeight = ch + 0x100 * NEXTBYTE;
-
+ if (DEBUG) fprintf(stderr,"GIF89 logical screen = %d x %d\n",RWidth,RHeight);
+
ch = NEXTBYTE;
- HasColormap = ((ch & COLORMAPMASK) ? True : False);
-
- BitsPerPixel = (ch & 7) + 1;
- numcols = ColorMapSize = 1 << BitsPerPixel;
- BitMask = ColorMapSize - 1;
-
+ HasGlobalColormap = ((ch & COLORMAPMASK) ? True : False);
+
+ /* GRR 20070318: fix decoding bug when global and local color-table sizes
+ * differ */
+ GlobalBitsPerPixel = BitsPerPixel = (ch & 7) + 1;
+ GlobalColorMapSize = ColorMapSize = numcols = 1 << BitsPerPixel;
+ GlobalBitMask = BitMask = ColorMapSize - 1;
+
Background = NEXTBYTE; /* background color... not used. */
-
+
aspect = NEXTBYTE;
if (aspect) {
if (!gif89) return(gifError(pinfo,"corrupt GIF file (screen descriptor)"));
else normaspect = (float) (aspect + 15) / 64.0; /* gif89 aspect ratio */
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 */
}
-
-
+
+
/* Read in global colormap. */
-
- if (HasColormap)
+
+ if (HasGlobalColormap)
for (i=0; ir[i] = NEXTBYTE;
- pinfo->g[i] = NEXTBYTE;
- pinfo->b[i] = NEXTBYTE;
+ r[i] = NEXTBYTE;
+ g[i] = NEXTBYTE;
+ b[i] = NEXTBYTE;
}
- else { /* no colormap in GIF file */
+ else { /* no _global_ colormap in GIF file (but may have local one(s)) */
/* put std EGA palette (repeated 16 times) into colormap, for lack of
- anything better to do */
+ anything better to do at the moment */
for (i=0; i<256; i++) {
- pinfo->r[i] = EGApalette[i&15][0];
- pinfo->g[i] = EGApalette[i&15][1];
- pinfo->b[i] = EGApalette[i&15][2];
+ r[i] = EGApalette[i&15][0];
+ g[i] = EGApalette[i&15][1];
+ b[i] = EGApalette[i&15][2];
+ }
+ }
+ memcpy(pinfo->r, r, sizeof r);
+ memcpy(pinfo->g, g, sizeof g);
+ memcpy(pinfo->b, b, sizeof b);
+
+ if (DEBUG > 1) {
+ fprintf(stderr," global color table%s:\n",
+ HasGlobalColormap? "":" (repeated EGA palette)");
+ for (i=0; ir[i],
+ pinfo->g[i], pinfo->b[i]);
}
}
@@ -221,19 +251,19 @@
if (blocksize == 2) {
aspnum = NEXTBYTE;
aspden = NEXTBYTE;
- if (aspden>0 && aspnum>0)
+ if (aspden>0 && aspnum>0)
normaspect = (float) aspnum / (float) aspden;
else { normaspect = 1.0; aspnum = aspden = 1; }
- if (DEBUG) fprintf(stderr,"GIF87 aspect extension: %d:%d = %f\n\n",
+ if (DEBUG) fprintf(stderr,"GIF87 aspect extension: %d:%d = %f\n\n",
aspnum, aspden,normaspect);
}
else {
- for (i=0; i0) { /* eat any following data subblocks */
- for (i=0; i0) { /* build into one un-blocked comment */
+ /* this can overflow iff cmtlen == 2G - 1, but then filesize
+ * would have to be > 2GB, which was disallowed above */
cmt = (byte *) malloc((size_t) (cmtlen + 1));
- if (!cmt) gifWarning("couldn't malloc space for comments\n");
- else {
+ if (!cmt) FatalError("LoadGIF: couldn't malloc space for comments");
+ /* else */ {
sp = cmt;
do {
sbsize = (*ptr1++);
@@ -267,10 +299,10 @@
if (pinfo->comment) { /* have to strcat onto old comments */
cmt1 = (byte *) malloc(strlen(pinfo->comment) + cmtlen + 2);
if (!cmt1) {
- gifWarning("couldn't malloc space for comments\n");
free(cmt);
+ FatalError("LoadGIF: couldn't malloc space for comments");
}
- else {
+ /* else */ {
strcpy((char *) cmt1, (char *) pinfo->comment);
strcat((char *) cmt1, (char *) "\n");
strcat((char *) cmt1, (char *) cmt);
@@ -288,8 +320,8 @@
else if (fn == 0x01) { /* PlainText Extension */
int j,sbsize,ch;
int tgLeft, tgTop, tgWidth, tgHeight, cWidth, cHeight, fg, bg;
-
- SetISTR(ISTR_INFO, "%s: %s", bname,
+
+ SetISTR(ISTR_INFO, "%s: %s", bname,
"PlainText extension found in GIF file. Ignored.");
sbsize = NEXTBYTE;
@@ -302,12 +334,12 @@
fg = NEXTBYTE;
bg = NEXTBYTE;
i=12;
- for ( ; inumpages+1);
+ if (DEBUG) fprintf(stderr, " at start: offset=0x%lx\n",
+ (unsigned long)(dataptr-RawGIF));
+
+ BitOffset = XC = YC = Pass = OutCount = 0;
+
+ if (pinfo->numpages > 0) { /* do multipage stuff */
+ if (pinfo->numpages == 1) { /* first time only... */
+ xv_mktemp(pinfo->pagebname, "xvpgXXXXXX"); // a.k.a. close(mkstemp())
+ if (pinfo->pagebname[0] == '\0') {
+ ErrPopUp("LoadGIF: Unable to create temporary filename???",
+ "\nHow unlikely!");
+ return 0;
+ }
+ /* GRR 20070328: basename file doesn't go away, at least on Linux
+ * (though all appended-number ones do); ergo, open for reading (see
+ * if it's there), close, and explicitly unlink() if necessary */
+ /* GRR 20070506: could/should call KillPageFiles() (xv.c) instead */
+ fp = xv_fopen(pinfo->pagebname, "r");
+ if (fp) {
+ fclose(fp);
+ unlink(pinfo->pagebname); /* no errors during testing */
}
}
-
- NEXTBYTE; /* minimum code size */
-
- /* skip image data sub-blocks */
- do {
- ch = ch1 = NEXTBYTE;
- while (ch--) NEXTBYTE;
- if ((dataptr - RawGIF) > filesize) break; /* EOF */
- } while(ch1);
- }
-
- else if (readImage(pinfo)) gotimage = 1;
- if (DEBUG) fprintf(stderr," at end: dataptr=0x%lx\n",dataptr-RawGIF);
+ sprintf(tmpname, "%s%d", pinfo->pagebname, pinfo->numpages);
+ fp = xv_fopen(tmpname, "w");
+ if (!fp) {
+ ErrPopUp("LoadGIF: Unable to open temp file", "\nDang!");
+ return 0;
+ }
+ if (WriteGIF(fp, pinfo->pic, pinfo->type, pinfo->w, pinfo->h, pinfo->r,
+ pinfo->g, pinfo->b, numcols, pinfo->colType, NULL)) {
+ fclose(fp);
+ ErrPopUp("LoadGIF: Error writing temp file", "\nBummer!");
+ return 0;
+ }
+ fclose(fp);
+ free(pinfo->pic);
+ pinfo->pic = (byte *) NULL;
+ if (HasGlobalColormap) {
+ memcpy(pinfo->r, r, sizeof r);
+ memcpy(pinfo->g, g, sizeof g);
+ memcpy(pinfo->b, b, sizeof b);
+ }
+ BitsPerPixel = GlobalBitsPerPixel;
+ numcols = ColorMapSize = GlobalColorMapSize;
+ BitMask = GlobalBitMask;
+ }
+ if (readImage(pinfo)) ++pinfo->numpages;
+ if (DEBUG) fprintf(stderr, " at end: offset=0x%lx\n",
+ (unsigned long)(dataptr-RawGIF));
}
@@ -416,9 +484,9 @@
/* don't mention bad block if file was trunc'd, as it's all bogus */
if ((dataptr - origptr) < filesize) {
sprintf(str, "Unknown block type (0x%02x) at offset 0x%lx",
- block, (dataptr - origptr) - 1);
+ block, (unsigned long)(dataptr - origptr) - 1);
- if (!gotimage) return gifError(pinfo, str);
+ if (!pinfo->numpages) return gifError(pinfo, str);
else gifWarning(str);
}
@@ -431,8 +499,34 @@
free(RawGIF); RawGIF = NULL;
free(Raster); Raster = NULL;
- if (!gotimage)
+ if (!pinfo->numpages)
return( gifError(pinfo, "no image data found in GIF file") );
+ if (pinfo->numpages > 1) {
+ /* write the last page temp file */
+ int numpages = pinfo->numpages;
+ char *comment = pinfo->comment;
+ sprintf(tmpname, "%s%d", pinfo->pagebname, pinfo->numpages);
+ fp = xv_fopen(tmpname, "w");
+ if (!fp) {
+ ErrPopUp("LoadGIF: Unable to open temp file", "\nDang!");
+ return 0;
+ }
+ if (WriteGIF(fp, pinfo->pic, pinfo->type, pinfo->w, pinfo->h, pinfo->r,
+ pinfo->g, pinfo->b, numcols, pinfo->colType, NULL)) {
+ fclose(fp);
+ ErrPopUp("LoadGIF: Error writing temp file", "\nBummer!");
+ return 0;
+ }
+ fclose(fp);
+ free(pinfo->pic);
+ pinfo->pic = (byte *) NULL;
+
+ /* load the first page temp file */
+ sprintf(tmpname, "%s%d", pinfo->pagebname, 1);
+ i = LoadGIF(tmpname, pinfo);
+ pinfo->numpages = numpages;
+ pinfo->comment = comment;
+ }
return 1;
}
@@ -444,11 +538,12 @@
{
register byte ch, ch1, *ptr1, *picptr;
int i, npixels, maxpixels;
+ boolean HasLocalColormap;
npixels = maxpixels = 0;
/* read in values from the image descriptor */
-
+
ch = NEXTBYTE;
LeftOfs = ch + 0x100 * NEXTBYTE;
ch = NEXTBYTE;
@@ -460,45 +555,68 @@
Misc = NEXTBYTE;
Interlace = ((Misc & INTERLACEMASK) ? True : False);
+ HasLocalColormap = ((Misc & COLORMAPMASK) ? True : False);
- if (Misc & 0x80) {
- for (i=0; i< 1 << ((Misc&7)+1); i++) {
+ if (HasLocalColormap) {
+ BitsPerPixel = (Misc & 7) + 1;
+ ColorMapSize = numcols = 1 << BitsPerPixel; /* GRR 20070318 */
+ BitMask = ColorMapSize - 1;
+ if (DEBUG) fprintf(stderr," local color table, %d bits (%d entries)\n",
+ (Misc&7)+1, ColorMapSize);
+ for (i=0; ir[i] = NEXTBYTE;
pinfo->g[i] = NEXTBYTE;
pinfo->b[i] = NEXTBYTE;
}
+ if (DEBUG > 1) {
+ for (i=0; ir[i],
+ pinfo->g[i], pinfo->b[i]);
+ }
+ }
}
- if (!HasColormap && !(Misc&0x80)) {
+ if (!HasGlobalColormap && !HasLocalColormap) {
/* no global or local colormap */
- SetISTR(ISTR_WARNING, "%s: %s", bname,
+ SetISTR(ISTR_WARNING, "%s: %s", bname,
"No colormap in this GIF file. Assuming EGA colors.");
}
-
-
+
+ /* GRR 19980314 */
+ /* need not worry about size of EGA palette: full 256 colors */
+ if (have_imagebg && Transparent >= 0 &&
+ Transparent < ((Misc&0x80)? (1 << ((Misc&7)+1)) : ColorMapSize) )
+ {
+ pinfo->r[Transparent] = (imagebgR >> 8);
+ pinfo->g[Transparent] = (imagebgG >> 8);
+ pinfo->b[Transparent] = (imagebgB >> 8);
+ }
+
+
+
/* Start reading the raster data. First we get the intial code size
* and compute decompressor constant values, based on this code size.
*/
-
+
CodeSize = NEXTBYTE;
ClearCode = (1 << CodeSize);
EOFCode = ClearCode + 1;
FreeCode = FirstFree = ClearCode + 2;
-
+
/* The GIF spec has it that the code size is the code size used to
* compute the above values is the code size given in the file, but the
* code size used in compression/decompression is the code size given in
* the file plus one. (thus the ++).
*/
-
+
CodeSize++;
InitCodeSize = CodeSize;
MaxCode = (1 << CodeSize);
ReadMask = MaxCode - 1;
-
+
/* UNBLOCK:
@@ -506,7 +624,7 @@
* to the Raster array, turning it from a series of blocks into one long
* data stream, which makes life much easier for readCode().
*/
-
+
ptr1 = Raster;
do {
ch = ch1 = NEXTBYTE;
@@ -522,21 +640,24 @@
if (DEBUG) {
- fprintf(stderr,"xv: LoadGIF() - picture is %dx%d, %d bits, %sinterlaced\n",
+ fprintf(stderr,"LoadGIF: image is %dx%d, %d bits, %sinterlaced\n",
Width, Height, BitsPerPixel, Interlace ? "" : "non-");
}
-
+
/* Allocate the 'pic' */
- maxpixels = Width*Height;
+ maxpixels = Width*Height; /* 65535*65535 max (but everything is int) */
+ if (Width <= 0 || Height <= 0 || maxpixels/Width != Height)
+ return( gifError(pinfo, "image dimensions out of range") );
picptr = pic8 = (byte *) malloc((size_t) maxpixels);
- if (!pic8) return( gifError(pinfo, "couldn't malloc 'pic8'") );
+ if (!pic8) FatalError("LoadGIF: couldn't malloc 'pic8'");
+
+
-
/* Decompress the file, continuing until you see the GIF EOF code.
* One obvious enhancement is to add checking for corrupt files here.
*/
-
+
Code = readCode();
while (Code != EOFCode) {
/* Clear code sets everything back to its initial value, then reads the
@@ -563,58 +684,58 @@
break; }
CurCode = InCode = Code;
-
+
/* If greater or equal to FreeCode, not in the hash table yet;
* repeat the last character decoded
*/
-
+
if (CurCode >= FreeCode) {
CurCode = OldCode;
if (OutCount > 4096) { /* printf("outcount1 blew up\n"); */ break; }
OutCode[OutCount++] = FinChar;
}
-
+
/* Unless this code is raw data, pursue the chain pointed to by CurCode
* through the hash table to its end; each code in the chain puts its
* associated output code on the output queue.
*/
-
+
while (CurCode > BitMask) {
if (OutCount > 4096) break; /* corrupt file */
OutCode[OutCount++] = Suffix[CurCode];
CurCode = Prefix[CurCode];
}
-
+
if (OutCount > 4096) { /* printf("outcount blew up\n"); */ break; }
-
+
/* The last code in the chain is treated as raw data. */
-
+
FinChar = CurCode & BitMask;
OutCode[OutCount++] = FinChar;
-
+
/* Now we put the data out to the Output routine.
* It's been stacked LIFO, so deal with it that way...
*/
/* safety thing: prevent exceeding range of 'pic8' */
if (npixels + OutCount > maxpixels) OutCount = maxpixels-npixels;
-
+
npixels += OutCount;
if (!Interlace) for (i=OutCount-1; i>=0; i--) *picptr++ = OutCode[i];
else for (i=OutCount-1; i>=0; i--) doInterlace(OutCode[i]);
OutCount = 0;
/* Build the hash table on-the-fly. No table is stored in the file. */
-
+
Prefix[FreeCode] = OldCode;
Suffix[FreeCode] = FinChar;
OldCode = InCode;
-
+
/* Point to the next slot in the table. If we exceed the current
* MaxCode value, increment the code size unless it's already 12. If it
* is, do nothing: the next code decompressed better be CLEAR
*/
-
+
FreeCode++;
if (FreeCode >= MaxCode) {
if (CodeSize < 12) {
@@ -627,20 +748,19 @@
Code = readCode();
if (npixels >= maxpixels) break;
}
-
+
if (npixels != maxpixels) {
SetISTR(ISTR_WARNING,"%s: %s", bname,
"This GIF file seems to be truncated. Winging it.");
if (!Interlace) /* clear->EOBuffer */
- xvbzero((char *) pic8+npixels, (size_t) (maxpixels-npixels));
+ xvbzero((char *) pic8+npixels,
+ (size_t) (maxpixels-npixels<0 ? 0 : maxpixels-npixels));
}
- fclose(fp);
-
/* fill in the PICINFO structure */
pinfo->pic = pic8;
- pinfo->w = Width;
+ pinfo->w = Width;
pinfo->h = Height;
pinfo->type = PIC8;
pinfo->frmType = F_GIF;
@@ -650,8 +770,8 @@
sprintf(pinfo->fullInfo,
"GIF%s, %d bit%s per pixel, %sinterlaced. (%d bytes)",
- (gif89) ? "89" : "87", BitsPerPixel,
- (BitsPerPixel==1) ? "" : "s",
+ (gif89) ? "89" : "87", BitsPerPixel,
+ (BitsPerPixel==1) ? "" : "s",
Interlace ? "" : "non-", filesize);
sprintf(pinfo->shrtInfo, "%dx%d GIF%s.",Width,Height,(gif89) ? "89" : "87");
@@ -668,13 +788,13 @@
* maintain our location in the Raster array as a BIT Offset. We compute
* the byte Offset into the raster array by dividing this by 8, pick up
* three bytes, compute the bit Offset into our 24-bit chunk, shift to
- * bring the desired code to the bottom, then mask it off and return it.
+ * bring the desired code to the bottom, then mask it off and return it.
*/
static int readCode()
{
int RawCode, ByteOffset;
-
+
ByteOffset = BitOffset / 8;
RawCode = Raster[ByteOffset] + (Raster[ByteOffset + 1] << 8);
if (CodeSize >= 8)
@@ -692,42 +812,47 @@
{
static byte *ptr = NULL;
static int oldYC = -1;
-
+
+ if (Pass == -1) { /* first time through - init stuff */
+ oldYC = -1;
+ Pass = 0;
+ }
+
if (oldYC != YC) { ptr = pic8 + YC * Width; oldYC = YC; }
-
+
if (YC= Height) { Pass++; YC = 4; }
break;
-
+
case 1:
YC += 8;
if (YC >= Height) { Pass++; YC = 2; }
break;
-
+
case 2:
YC += 4;
if (YC >= Height) { Pass++; YC = 1; }
break;
-
+
case 3:
YC += 2; break;
-
+
default:
break;
}
@@ -735,11 +860,11 @@
}
-
+
/*****************************/
static int gifError(pinfo, st)
- PICINFO *pinfo;
- char *st;
+ PICINFO *pinfo;
+ const char *st;
{
gifWarning(st);
@@ -760,7 +885,7 @@
/*****************************/
static void gifWarning(st)
- char *st;
+ const char *st;
{
SetISTR(ISTR_WARNING,"%s: %s", bname, st);
}
diff -ru xv-3.10a/xvgifwr.c xv-3.10a-enhancements/xvgifwr.c
--- xv-3.10a/xvgifwr.c 1995-01-03 13:22:21.000000000 -0800
+++ xv-3.10a-enhancements/xvgifwr.c 2007-03-31 16:33:23.000000000 -0700
@@ -2,11 +2,11 @@
* xvgifwr.c - handles writing of GIF files. based on flgife.c and
* flgifc.c from the FBM Library, by Michael Maudlin
*
- * Contains:
+ * Contains:
* WriteGIF(fp, pic, ptype, w, h, rmap, gmap, bmap, numcols, colorstyle,
* comment)
*
- * Note: slightly brain-damaged, in that it'll only write non-interlaced
+ * Note: slightly brain-damaged, in that it'll only write non-interlaced
* GIF files (in the interests of speed, or something)
*
*/
@@ -34,7 +34,7 @@
* James A. Woods (decvax!ihnp4!ames!jaw)
* Joe Orost (decvax!vax135!petsd!joe)
*****************************************************************/
-
+
#include "xv.h"
@@ -44,7 +44,6 @@
static int curx, cury;
static long CountDown;
static int Interlace;
-static byte bw[2] = {0, 0xff};
static void putword PARM((int, FILE *));
static void compress PARM((int, FILE *, byte *, int));
@@ -56,7 +55,7 @@
static void flush_char PARM((void));
-static byte pc2nc[256],r1[256],g1[256],b1[256];
+static byte pc2nc[256];
/*************************************************************/
@@ -74,7 +73,8 @@
int ColorMapSize, InitCodeSize, Background, BitsPerPixel;
int i,j,nc;
byte *pic8;
- byte rtemp[256],gtemp[256],btemp[256];
+ byte rtemp[256],gtemp[256],btemp[256]; /* for 24-bit to 8-bit conversion */
+ byte r1[256],g1[256],b1[256]; /* for duplicated-color remapping */
if (ptype == PIC24) { /* have to quantize down to 8 bits */
pic8 = Conv24to8(pic, w, h, 256, rtemp,gtemp,btemp);
@@ -97,7 +97,7 @@
for (i=0; i= nc) break;
-
+
BitsPerPixel = i;
ColorMapSize = 1 << BitsPerPixel;
-
+
RWidth = Width = w;
RHeight = Height = h;
LeftOfs = TopOfs = 0;
-
+
CountDown = w * h; /* # of pixels we'll be doing */
if (BitsPerPixel <= 1) InitCodeSize = 2;
@@ -137,7 +137,7 @@
return (1);
}
- if (DEBUG)
+ if (DEBUG)
fprintf(stderr,"WrGIF: pic=%lx, w,h=%dx%d, numcols=%d, Bits%d,Cmap=%d\n",
(u_long) pic8, w,h,numcols,BitsPerPixel,ColorMapSize);
@@ -152,7 +152,7 @@
i = 0x80; /* Yes, there is a color map */
i |= (8-1)<<4; /* OR in the color resolution (hardwired 8) */
i |= (BitsPerPixel - 1); /* OR in the # of bits per pixel */
- fputc(i,fp);
+ fputc(i,fp);
fputc(Background, fp); /* background color */
@@ -290,7 +290,7 @@
/*
* compress stdin to stdout
*
- * Algorithm: use open addressing double hashing (no chaining) on the
+ * Algorithm: use open addressing double hashing (no chaining) on the
* prefix code / next character combination. We do a variant of Knuth's
* algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
* secondary probe. Here, the modular division first probe is gives way
@@ -370,7 +370,7 @@
cl_hash( (count_int) hsize_reg); /* clear hash table */
output(ClearCode);
-
+
while (len) {
c = pc2nc[*data++]; len--;
in_count++;
@@ -399,7 +399,7 @@
continue;
}
- if ( (long)HashTabOf (i) >= 0 )
+ if ( (long)HashTabOf (i) >= 0 )
goto probe;
nomatch:
@@ -454,7 +454,7 @@
cur_accum |= ((long)code << cur_bits);
else
cur_accum = code;
-
+
cur_bits += n_bits;
while( cur_bits >= 8 ) {
@@ -482,7 +482,7 @@
maxcode = MAXCODE(n_bits);
}
}
-
+
if( code == EOFCode ) {
/* At EOF, write the rest of the buffer */
while( cur_bits > 0 ) {
@@ -492,11 +492,11 @@
}
flush_char();
-
+
fflush( g_outfile );
#ifdef FOO
- if( ferror( g_outfile ) )
+ if( ferror( g_outfile ) )
FatalError("unable to write GIF file");
#endif
}
@@ -582,7 +582,7 @@
int c;
{
accum[ a_count++ ] = c;
- if( a_count >= 254 )
+ if( a_count >= 254 )
flush_char();
}
@@ -596,4 +596,4 @@
fwrite(accum, (size_t) 1, (size_t) a_count, g_outfile );
a_count = 0;
}
-}
+}
diff -ru xv-3.10a/xvgrab.c xv-3.10a-enhancements/xvgrab.c
--- xv-3.10a/xvgrab.c 1994-12-22 14:34:47.000000000 -0800
+++ xv-3.10a-enhancements/xvgrab.c 2005-04-25 23:39:32.000000000 -0700
@@ -6,7 +6,7 @@
* Contains:
* int Grab() - handles the GRAB command
* int LoadGrab(); - 'loads' the pic from the last succesful Grab
- *
+ *
*/
#include "copyright.h"
@@ -14,28 +14,60 @@
#define NEEDSTIME
#include "xv.h"
-static byte *grabPic = (byte *) NULL;
-static int gbits; /* either '8' or '24' */
-static byte grabmapR[256], grabmapG[256], grabmapB[256]; /* colormap */
-static int gWIDE,gHIGH;
-static int grabInProgress=0;
-static int hidewins = 0;
-static GC rootGC;
-
-static void flashrect PARM((int, int, int, int, int));
-static void startflash PARM((void));
-static void endflash PARM((void));
-static int grabImage PARM((Window, int, int, int, int));
-static void ungrabX PARM((void));
-static int convertImage PARM((XImage *, XColor *, int,
- XWindowAttributes *));
-
-static int lowbitnum PARM((unsigned long));
-static int getxcolors PARM((XWindowAttributes *, XColor **));
-static Window xvClientWindow PARM((Display *, Window));
+/* Allow flexibility in use of buttons JPD */
+#define WINDOWGRABMASK Button1Mask /* JPD prefers Button2Mask */
+#define RECTGTRACKMASK Button2Mask /* JPD prefers Button1Mask*/
+#define CANCELGRABMASK Button3Mask
+#define DO_GRABFLASH /* JPD prefers not to do that; just a loss of time ... */
+union swapun {
+ CARD32 l;
+ CARD16 s;
+ CARD8 b[sizeof(CARD32)];
+};
+
+
+struct rectlist {
+ int x,y,w,h;
+ struct rectlist *next;
+};
+
+
+static byte *grabPic = (byte *) NULL;
+static int gptype;
+static byte grabmapR[256], grabmapG[256], grabmapB[256];
+static int gXOFF, gYOFF, gWIDE,gHIGH;
+static int grabInProgress=0;
+static int hidewins = 0;
+static GC rootGC;
+static struct rectlist *regrabList;
+
+
+static void flashrect PARM((int, int, int, int, int));
+static void startflash PARM((void));
+static void endflash PARM((void));
+static void ungrabX PARM((void));
+static int lowbitnum PARM((unsigned long));
+static int getxcolors PARM((XWindowAttributes *, XColor **));
+
+static void printWinTree PARM((Window, int));
+static void errSpace PARM((int));
+
+static int grabRootRegion PARM((int, int, int, int));
+static int grabWinImage PARM((Window, VisualID, Colormap, int));
+static int convertImageAndStuff PARM((XImage *, XColor *, int,
+ XWindowAttributes *,
+ int,int,int,int));
+
+static int RectIntersect PARM((int,int,int,int, int,int,int,int));
+
+static int CountColors24 PARM((byte *, int, int,
+ int, int, int, int));
+
+static int Trivial24to8 PARM((byte *, int, int, byte *,
+ byte *, byte *, byte *, int));
/***********************************/
int Grab()
@@ -44,13 +76,15 @@
0 if cancelled */
int i, x, y, x1, y1, x2, y2, ix, iy, iw, ih, rv;
- int rx, ry, pretendGotB1, autograb;
- int oldaclose;
- Window rW, cW, clickWin, tmpwin;
+ int rx, ry, GotButton, autograb;
+ int cancelled = 0;
+ Window rW, cW, clickWin;
unsigned int mask;
+#ifdef RECOLOR_GRAB_CURSOR
XColor fc, bc;
+#endif
- pretendGotB1 = 0;
+ GotButton = 0;
if (grabInProgress) return 0; /* avoid recursive grabs during delay */
@@ -75,7 +109,7 @@
grabInProgress = 1; /* guard against recursive grabs during delay */
time(&startT);
while (1) {
- time(&t);
+ time(&t);
if (t >= startT + grabDelay) break;
if (XPending(theDisp)>0) {
XEvent evt;
@@ -91,25 +125,33 @@
grabInProgress = 0;
}
-
+
rootGC = DefaultGC(theDisp, theScreen);
-
+
if (grabPic) { /* throw away previous 'grabbed' pic, if there is one */
free(grabPic); grabPic = (byte *) NULL;
}
-
+ /* recolor cursor to indicate that grabbing is active? */
+ /* Instead, change cursor JPD */
+#ifdef RECOLOR_GRAB_CURSOR
fc.flags = bc.flags = DoRed | DoGreen | DoBlue;
- fc.red = fc.green = fc.blue = 0xffff;
+ fc.red = fc.green = fc.blue = 0xffff;
bc.red = bc.green = bc.blue = 0x0000;
XRecolorCursor(theDisp, tcross, &fc, &bc);
+#endif
XBell(theDisp, 0); /* beep once at start of grab */
- if (!autograb) XGrabButton(theDisp, (u_int) AnyButton, 0, rootW, False, 0,
+ /* Change cursor to top_left_corner JPD */
+ XGrabPointer(theDisp, rootW, False,
+ PointerMotionMask|ButtonPressMask|ButtonReleaseMask,
+ GrabModeAsync, GrabModeAsync, None, tlcorner, CurrentTime);
+
+ if (!autograb) XGrabButton(theDisp, (u_int) AnyButton, 0, rootW, False, 0,
GrabModeAsync, GrabModeSync, None, tcross);
-
+
if (autograb) {
XGrabServer(theDisp); /* until we've done the grabImage */
if (!XQueryPointer(theDisp,rootW,&rW,&cW,&rx,&ry,&x1,&y1,&mask)) {
@@ -118,7 +160,7 @@
rv = 0;
goto exit;
}
- else { pretendGotB1 = 1; mask = Button1Mask; }
+ else { GotButton = 1; mask = WINDOWGRABMASK; }
}
else { /* !autograb */
@@ -136,7 +178,7 @@
XNextEvent(theDisp, &evt);
i = HandleEvent(&evt, &done);
if (done) { /* only 'new image' cmd accepted=quit */
- if (i==QUIT) {
+ if (i==QUIT) {
XUngrabButton(theDisp, (u_int) AnyButton, 0, rootW);
Quit(0);
}
@@ -145,99 +187,75 @@
}
}
-
-
+
+ XUngrabPointer(theDisp, CurrentTime);
+ /* Reset cursor to XC_tcross JPD */
+ XGrabPointer(theDisp, rootW, False,
+ PointerMotionMask|ButtonPressMask|ButtonReleaseMask,
+ GrabModeAsync, GrabModeAsync, None, tcross, CurrentTime);
+
/***
*** got button click (or pretending we did, if autograb)
***/
-
- if (mask & Button3Mask || rW!=rootW) { /* Button3: CANCEL GRAB */
+ if (mask & CANCELGRABMASK || rW!=rootW) { /* CANCEL GRAB */
while (1) { /* wait for button to be released */
if (XQueryPointer(theDisp,rootW,&rW,&cW,&rx,&ry,&x1,&y1,&mask)) {
- if (!(mask & Button3Mask)) break;
+ if (!(mask & CANCELGRABMASK)) break;
}
}
-
+
XUngrabButton(theDisp, (u_int) AnyButton, 0, rootW);
XBell(theDisp, 0);
XBell(theDisp, 0);
rv = 0;
+ cancelled = 1;
goto exit;
}
-
- if (mask & Button1Mask) { /* Button1: GRAB WINDOW (& FRAME, maybe) */
- while (!pretendGotB1) { /* wait for button to be released, if clicked */
+ if (mask & WINDOWGRABMASK) { /* GRAB WINDOW (& FRAME, maybe) */
+ while (!GotButton) { /* wait for button to be released, if clicked */
int rx,ry,x1,y1; Window rW, cW;
if (XQueryPointer(theDisp,rootW,&rW,&cW,&rx,&ry,&x1,&y1,&mask)) {
- if (!(mask & Button1Mask)) break;
+ if (!(mask & WINDOWGRABMASK)) break;
}
}
-
- if (!cW || cW == rootW) clickWin = rootW;
- else {
- int xr, yr; Window chwin;
- XTranslateCoordinates(theDisp, rW, cW, rx, ry, &xr, &yr, &chwin);
- if (chwin != None) {
- XWindowAttributes clickxwa, parentxwa;
-
- clickWin = xvClientWindow(theDisp, chwin);
-
- /* decide if we want to just grab clickWin, or cW.
- basically, if they're different in any important way
- (depth, visual, colormap), grab 'clickWin' only,
- as it's the important part */
-
- if (!clickWin ||
- (XGetWindowAttributes(theDisp, clickWin, &clickxwa) &&
- XGetWindowAttributes(theDisp, cW, &parentxwa) &&
- clickxwa.visual->class == parentxwa.visual->class &&
- clickxwa.colormap == parentxwa.colormap &&
- clickxwa.depth == parentxwa.depth)
- )
- clickWin = cW; /* close enough! */
- }
- else clickWin = cW;
-
- if (DEBUG)
- fprintf(stderr, "rW = %x, cW = %x, chwin = %x, clickWin = %x\n",
- (u_int) rW, (u_int) cW, (u_int) chwin, (u_int) clickWin);
- }
-
-
+
+ grabwin:
+
+ clickWin = (cW) ? cW : rootW;
+
if (clickWin == rootW) { /* grab entire screen */
if (DEBUG) fprintf(stderr,"Grab: clicked on root window.\n");
ix = iy = 0; iw = dispWIDE; ih = dispHIGH;
}
else {
int x,y; Window win; unsigned int rw,rh,rb,rd;
-
+
if (XGetGeometry(theDisp,clickWin,&rW, &x, &y, &rw, &rh, &rb, &rd)) {
iw = (int) rw; ih = (int) rh;
-
+
XTranslateCoordinates(theDisp, clickWin, rootW, 0, 0, &ix,&iy, &win);
-
- if (DEBUG) fprintf(stderr,"clickWin=0x%x: %d,%d %dx%d depth=%ud\n",
- (u_int) clickWin, ix, iy, iw, ih, rd);
+
+ if (DEBUG) fprintf(stderr,"clickWin=0x%x: %d,%d %dx%d depth=%ud\n",
+ (u_int) clickWin, ix, iy, iw, ih, rd);
}
else {
ix = iy = 0; iw = dispWIDE; ih = dispHIGH; clickWin = rootW;
if (DEBUG) fprintf(stderr,"XGetGeometry failed? (using root win)\n");
}
}
-
-
+
/* range checking: keep rectangle fully on-screen */
if (ix<0) { iw += ix; ix = 0; }
if (iy<0) { ih += iy; iy = 0; }
if (ix+iw>dispWIDE) iw = dispWIDE-ix;
if (iy+ih>dispHIGH) ih = dispHIGH-iy;
-
-
+
+
if (DEBUG) fprintf(stderr,"using %d,%d (%dx%d)\n", ix, iy, iw, ih);
-
+
/* flash the rectangle a bit... */
startflash();
for (i=0; i<5; i++) {
@@ -249,23 +267,21 @@
endflash();
}
-
- else { /* Button2: TRACK A RECTANGLE */
+ else { /* TRACK A RECTANGLE */
int origrx, origry;
- Window origcW;
- clickWin = rootW; origcW = cW;
+ clickWin = rootW;
origrx = ix = x2 = rx;
origry = iy = y2 = ry;
iw = ih = 0;
-
+
XGrabServer(theDisp);
startflash();
/* Wait for button release while tracking rectangle on screen */
while (1) {
if (XQueryPointer(theDisp,rootW,&rW,&cW,&rx,&ry,&x,&y,&mask)) {
- if (!(mask & Button2Mask)) break;
+ if (!(mask & RECTGTRACKMASK)) break;
}
flashrect(ix, iy, iw, ih, 0); /* turn off rect */
@@ -276,57 +292,63 @@
iw = abs(rx - x1); ih = abs(ry - y1);
x2 = rx; y2 = ry;
}
-
+
if (iw>1 && ih>1) flashrect(ix,iy,iw,ih,1); /* turn on rect */
}
flashrect(ix, iy, iw, ih, 0); /* turn off rect */
+
+#ifdef DO_GRABFLASH
+ /* flash the rectangle a bit... */
+ for (i=0; i<5; i++) {
+ flashrect(ix, iy, iw, ih, 1);
+ XFlush(theDisp); Timer(100);
+ flashrect(ix, iy, iw, ih, 0);
+ XFlush(theDisp); Timer(100);
+ }
+#endif
+
endflash();
-
- XUngrabServer(theDisp);
-
-
- if (origcW == cW) { /* maybe it's entirely in one window??? */
- if (cW) { /* will be 0 if clicked in rootW */
- Window stwin, enwin, stwin1, enwin1;
- if (DEBUG) fprintf(stderr,"origcW=%x cW=%x ",
- (u_int) origcW, (u_int) cW);
- XTranslateCoordinates(theDisp,rootW,cW, origrx,origry,&x,&y,&stwin);
- XTranslateCoordinates(theDisp,rootW,cW, rx, ry, &x,&y,&enwin);
-
- if (DEBUG) fprintf(stderr,"stwin=%x enwin=%x ",
- (u_int) stwin, (u_int) enwin);
- if (stwin == enwin && stwin != None) {
- stwin1 = xvClientWindow(theDisp, stwin);
- enwin1 = xvClientWindow(theDisp, enwin);
- if (DEBUG) fprintf(stderr,"stwin1=%x enwin1=%x ",
- (u_int) stwin1, (u_int) enwin1);
-
- if (stwin1 == enwin1 && stwin1) clickWin = stwin1;
- else clickWin = stwin;
- }
- if (DEBUG) fprintf(stderr,"\n");
- }
- else clickWin = rootW;
+
+ /* if rectangle has zero width or height, search for child window JPD */
+ if (iw==0 && ih==0) {
+ int xr, yr;
+ Window childW = 0;
+ if (rW && cW)
+ XTranslateCoordinates(theDisp, rW, cW, rx, ry, &xr, &yr, &childW);
+ if (childW)
+ cW = childW;
+ goto grabwin;
}
+
+ XUngrabServer(theDisp);
}
-
/***
- *** now that clickWin,ix,iy,iw,ih are known, try to grab the bits...
+ *** now that clickWin,ix,iy,iw,ih are known, try to grab the bits :
+ *** grab screen area (ix,iy,iw,ih)
***/
+ if (DEBUG>1) printWinTree(clickWin, 0);
+
WaitCursor();
if (!autograb) XGrabServer(theDisp); /* until we've done the grabImage */
- rv = grabImage(clickWin,ix,iy,iw,ih); /* ungrabs the server & button */
+ rv = grabRootRegion(ix, iy, iw, ih); /* ungrabs the server & button */
SetCursors(-1);
-
exit:
+ XUngrabPointer(theDisp, CurrentTime);
+ XUngrabServer(theDisp);
+
+ if (startGrab) {
+ startGrab = 0;
+ if (cancelled) Quit(0);
+ }
+
if (hidewins) { /* remap XV windows */
autoclose += 2; /* force it on once */
if (mainW && dispMode == RMB_WINDOW) {
@@ -337,25 +359,25 @@
if (DEBUG) fprintf(stderr,"==remapped mainW. waiting for Config.\n");
- /* sit here until we see a MapNotify on mainW followed by a
+ /* sit here until we see a MapNotify on mainW followed by a
ConfigureNotify on mainW */
state = 0;
- while (1) {
+ while (state != 3) {
XEvent event;
XNextEvent(theDisp, &event);
HandleEvent(&event, &i);
- if (state==0 && event.type == MapNotify &&
- event.xmap.window == mainW) state = 1;
+ if (!(state&1) && event.type == MapNotify &&
+ event.xmap.window == mainW) state |= 1;
- if (state==1 && event.type == ConfigureNotify &&
- event.xconfigure.window == mainW) break;
+ if (!(state&2) && event.type == ConfigureNotify &&
+ event.xconfigure.window == mainW) state |= 2;
}
if (DEBUG) fprintf(stderr,"==after remapping mainW, GOT Config.\n");
}
-
+
else if (ctrlW) CtrlBox(1);
}
@@ -364,6 +386,45 @@
/***********************************/
+int LoadGrab(pinfo)
+ PICINFO *pinfo;
+{
+ /* loads up (into XV structures) last image successfully grabbed.
+ returns '0' on failure, '1' on success */
+
+ int i;
+
+ if (!grabPic) return 0; /* no image to use */
+
+ pinfo->type = gptype;
+ if (pinfo->type == PIC8) {
+ for (i=0; i<256; i++) {
+ pinfo->r[i] = grabmapR[i];
+ pinfo->g[i] = grabmapG[i];
+ pinfo->b[i] = grabmapB[i];
+ }
+ }
+
+ pinfo->pic = grabPic;
+ pinfo->normw = pinfo->w = gWIDE;
+ pinfo->normh = pinfo->h = gHIGH;
+ pinfo->frmType = -1;
+ pinfo->colType = -1;
+
+ sprintf(pinfo->fullInfo,"<%s internal>",
+ (pinfo->type == PIC8) ? "8-bit" : "24-bit");
+
+ sprintf(pinfo->shrtInfo,"%dx%d image.",gWIDE, gHIGH);
+
+ pinfo->comment = (char *) NULL;
+
+ grabPic = (byte *) NULL;
+
+ return 1;
+}
+
+
+/***********************************/
static void flashrect(x,y,w,h,show)
int x,y,w,h,show;
{
@@ -373,7 +434,7 @@
XSetPlaneMask(theDisp, rootGC, xorMasks[maskno]);
if (!show) { /* turn off rectangle */
- if (isvis)
+ if (isvis)
XDrawRectangle(theDisp, rootW, rootGC, x, y, (u_int) w-1, (u_int) h-1);
isvis = 0;
@@ -391,15 +452,16 @@
/***********************************/
static void startflash()
-{
+{
/* set up for drawing a flashing rectangle */
XSetFunction(theDisp, rootGC, GXinvert);
XSetSubwindowMode(theDisp, rootGC, IncludeInferiors);
}
+
/***********************************/
static void endflash()
-{
+{
XSetFunction(theDisp, rootGC, GXcopy);
XSetSubwindowMode(theDisp, rootGC, ClipByChildren);
XSetPlaneMask(theDisp, rootGC, AllPlanes);
@@ -408,21 +470,157 @@
/***********************************/
-static int grabImage(clickWin, x, y, w, h)
- Window clickWin;
+static void ungrabX()
+{
+ XUngrabServer(theDisp);
+ XUngrabButton(theDisp, (u_int) AnyButton, 0, rootW);
+}
+
+
+/**************************************/
+static int lowbitnum(ul)
+ unsigned long ul;
+{
+ /* returns position of lowest set bit in 'ul' as an integer (0-31),
+ or -1 if none */
+
+ int i;
+ for (i=0; ((ul&1) == 0) && i<32; i++, ul>>=1);
+ if (i==32) i = -1;
+ return i;
+}
+
+
+
+/**********************************************/
+/* getxcolors() function snarfed from 'xwd.c' */
+/**********************************************/
+
+#define lowbit(x) ((x) & (~(x) + 1))
+
+static int getxcolors(win_info, colors)
+ XWindowAttributes *win_info;
+ XColor **colors;
+{
+ int i, ncolors;
+
+ *colors = (XColor *) NULL;
+
+ if (win_info->visual->class == TrueColor) {
+ if (DEBUG>1) fprintf(stderr,"TrueColor visual: no colormap needed\n");
+ return 0;
+ }
+
+ else if (!win_info->colormap) {
+ if (DEBUG>1) fprintf(stderr,"no colormap associated with window\n");
+ return 0;
+ }
+
+ ncolors = win_info->visual->map_entries;
+ if (DEBUG>1) fprintf(stderr,"%d entries in colormap\n", ncolors);
+
+ if (!(*colors = (XColor *) malloc (sizeof(XColor) * ncolors)))
+ FatalError("malloc failed in getxcolors()");
+
+
+ if (win_info->visual->class == DirectColor) {
+ Pixel red, green, blue, red1, green1, blue1;
+
+ if (DEBUG>1) fprintf(stderr,"DirectColor visual\n");
+
+ red = green = blue = 0;
+ red1 = lowbit(win_info->visual->red_mask);
+ green1 = lowbit(win_info->visual->green_mask);
+ blue1 = lowbit(win_info->visual->blue_mask);
+ for (i=0; i win_info->visual->red_mask) red = 0;
+ green += green1;
+ if (green > win_info->visual->green_mask) green = 0;
+ blue += blue1;
+ if (blue > win_info->visual->blue_mask) blue = 0;
+ }
+ }
+ else {
+ for (i=0; icolormap, *colors, ncolors);
+
+ return(ncolors);
+}
+
+
+
+/*******************************************/
+static void printWinTree(win,tab)
+ Window win;
+ int tab;
+{
+ u_int i, nchildren;
+ Window root, parent, *children, chwin;
+ XWindowAttributes xwa;
+ int xr, yr;
+
+ if (!XGetWindowAttributes(theDisp, win, &xwa)) {
+ errSpace(tab);
+ fprintf(stderr,"pWT: can't XGetWindowAttributes(%08x)\n", (u_int) win);
+ return;
+ }
+
+ XTranslateCoordinates(theDisp, win, rootW, 0,0, &xr,&yr, &chwin);
+ if (xwa.map_state==IsViewable) {
+ errSpace(tab);
+ fprintf(stderr,"%08x: %4d,%4d %4dx%4d vis: %02x cm=%x %s\n",
+ (u_int) win, xr,yr, xwa.width, xwa.height,
+ (u_int) XVisualIDFromVisual(xwa.visual),
+ (u_int) xwa.colormap,
+ ((xwa.map_state==IsUnmapped) ? "unmapped " :
+ (xwa.map_state==IsUnviewable) ? "unviewable" :
+ (xwa.map_state==IsViewable) ? "viewable " :
+ " ") );
+
+ if (!XQueryTree(theDisp, win, &root, &parent, &children, &nchildren)) {
+ errSpace(tab);
+ fprintf(stderr,"pWT: XQueryTree(%08x) failed\n", (u_int) win);
+ if (children) XFree((char *)children);
+ return;
+ }
+
+ for (i=0; i0; n--) putc(' ', stderr);
+}
+
+
+
+
+/***********************************/
+static int grabRootRegion(x, y, w, h)
int x, y, w, h;
{
/* attempts to grab the specified rectangle of the root window
- returns '1' on success. clickWin is used to figure out the depth
- and colormap to use */
+ returns '1' on success */
- XImage *image;
- XWindowAttributes xwa;
- XColor *colors;
- int ncolors, i, ix, iy;
- char str[256];
- Window win;
+ XWindowAttributes xwa;
+ int i;
+ regrabList = (struct rectlist *) NULL;
/* range checking */
if (x<0) { w += x; x = 0; }
@@ -430,86 +628,246 @@
if (x+w>dispWIDE) w = dispWIDE-x;
if (y+h>dispHIGH) h = dispHIGH-y;
- if (w==0 || h==0) { /* selected nothing */
+ if (w<=0 || h<=0) { /* selected nothing */
ungrabX();
return 0;
}
- if (!XGetWindowAttributes(theDisp, clickWin, &xwa)) {
- sprintf(str,"Unable to get window attributes for clicked-on window\n");
+
+ /* grab this region, using the default (root's) visual */
+
+ /* now for all top-level windows (children of root), in bottom->top order
+ if they intersect the grabregion
+ are they drawn entirely (including children) using default visual+cmap?
+ yes: if they intersect 'regrab' list, grab'em - else skip'em
+ no: grab them, add their rectangle to 'regrab' list
+ */
+
+
+ /* make a 24bit grabPic */
+ gptype = PIC24;
+ gXOFF = x; gYOFF = y; gWIDE = w; gHIGH = h;
+ grabPic = (byte *) malloc((size_t) gWIDE * gHIGH * 3);
+ if (!grabPic) {
ungrabX();
- ErrPopUp(str, "\nThat Sucks!");
+ ErrPopUp("Unable to malloc() space for grabbed image!", "\nBite Me!");
return 0;
}
-
- XTranslateCoordinates(theDisp, rootW, clickWin, x, y, &ix, &iy, &win);
-
- xerrcode = 0;
- image = XGetImage(theDisp, clickWin, ix, iy, (u_int) w, (u_int) h,
- AllPlanes, ZPixmap);
- if (xerrcode || !image || !image->data) {
- sprintf(str, "Unable to get image (%d,%d %dx%d) from display", ix,iy,w,h);
+ if (!XGetWindowAttributes(theDisp, rootW, &xwa)) {
ungrabX();
- ErrPopUp(str, "\nThat Sucks!");
+ ErrPopUp("Can't get window attributes for root window!", "\nBite Me!");
return 0;
}
- ncolors = getxcolors(&xwa, &colors);
+ i = grabWinImage(rootW, XVisualIDFromVisual(xwa.visual), xwa.colormap,0);
ungrabX();
- if (ncolors && DEBUG) {
- fprintf(stderr, "Colormap:\n");
- for (i=0; i>8, colors[i].green>>8,
- colors[i].blue>>8);
- fprintf(stderr,"\n");
- }
-
-
XBell(theDisp, 0); /* beep twice at end of grab */
XBell(theDisp, 0);
- i = convertImage(image, colors, ncolors, &xwa);
+ { /* free regrabList */
+ struct rectlist *rr, *tmprr;
+ rr = regrabList;
+ while (rr) {
+ tmprr = rr->next;
+ free((char *) rr);
+ rr = tmprr;
+ }
+ regrabList = (struct rectlist *) NULL;
+ }
- /* DO *NOT* use xvDestroyImage(), as the 'data' field was alloc'd by X, not
- necessarily through 'malloc() / free()' */
- XDestroyImage(image);
-
- if (colors) free((char *) colors);
+ if (i) {
+ ErrPopUp("Warning: Problems occurred during grab.","\nWYSInWYG!");
+ return 0;
+ }
- return i;
+
+ /* if 256 or fewer colors in grabPic, make it a PIC8 */
+ i = CountColors24(grabPic, gWIDE, gHIGH, 0,0,gWIDE,gHIGH);
+ if (i<=256) {
+ byte *pic8;
+ pic8 = (byte *) malloc((size_t) (gWIDE * gHIGH));
+ if (pic8) {
+ if (Trivial24to8(grabPic, gWIDE,gHIGH, pic8,
+ grabmapR,grabmapG,grabmapB,256)) {
+ free((char *) grabPic);
+ grabPic = pic8;
+ gptype = PIC8;
+ }
+ }
+ }
+
+ return 1; /* full success */
}
-static void ungrabX()
+/***********************************/
+static int grabWinImage(win, parentVid, parentCmap, toplevel)
+ Window win;
+ VisualID parentVid;
+ Colormap parentCmap;
+ int toplevel;
{
- XUngrabServer(theDisp);
- XUngrabButton(theDisp, (u_int) AnyButton, 0, rootW);
-}
+ /* grabs area of window (and its children) that intersects
+ * grab region (root coords: gXOFF,gYOFF,gWIDE,gHIGH), and stuffs
+ * relevant bits into the grabPic (a gWIDE*gHIGH PIC24)
+ *
+ * Note: special kludge for toplevel windows (children of root):
+ * since that's the only case where a window can be obscuring something
+ * that isn't its parent
+ *
+ * returns 0 if okay, 1 if problems occurred
+ */
+
+
+ int i, rv, dograb;
+ int wx, wy, ww, wh; /* root coords of window */
+ int gx, gy, gw, gh; /* root coords of grab region of win*/
+ Window chwin; /* unused */
+ u_int nchildren;
+ Window root, parent, *children;
+ XWindowAttributes xwa;
+ /* first, quick checks to avoid recursing down useless branches */
+ if (!XGetWindowAttributes(theDisp, win, &xwa)) {
+ if (DEBUG) fprintf(stderr,"gWI: can't get win attr (%08x)\n", (u_int) win);
+ return 1;
+ }
+ if (xwa.class == InputOnly || xwa.map_state != IsViewable) return 0;
+ rv = 0;
+ dograb = 1;
+ wx = 0; wy = 0; ww = (int) xwa.width; wh = (int) xwa.height;
+
+ /* if this window doesn't intersect, none of its children will, either */
+ XTranslateCoordinates(theDisp, win, rootW, 0,0, &wx, &wy, &chwin);
+ if (!RectIntersect(wx,wy,ww,wh, gXOFF,gYOFF,gWIDE,gHIGH)) return 0;
+
+ gx = wx; gy = wy; gw = ww; gh = wh;
+ CropRect2Rect(&gx,&gy,&gw,&gh, gXOFF,gYOFF,gWIDE,gHIGH);
+
+ if (win==rootW) {
+ /* always grab */
+ }
+
+ else if (XVisualIDFromVisual(xwa.visual) == parentVid &&
+ ((xwa.visual->class==TrueColor) || xwa.colormap == parentCmap)) {
+
+ /* note: if both visuals are TrueColor, don't compare cmaps */
+
+ /* normally, if the vis/cmap info of a window is the same as its parent,
+ no need to regrab window. special case if this is a toplevel
+ window, as it can be obscuring windows that *aren't* its parent */
+
+ if (toplevel) {
+ /* we probably already have this region. Check it against regrabList
+ If it intersects none, no need to grab.
+ If it intersects one, crop to that rectangle and grab
+ if it intersects >1, don't crop, just grab gx,gy,gw,gh */
+
+ struct rectlist *rr, *cr;
+
+ i=0; cr=rr=regrabList;
+ while (rr) {
+ if (RectIntersect(gx,gy,gw,gh, rr->x,rr->y,rr->w,rr->h)) {
+ i++; cr = rr;
+ }
+ rr = rr->next;
+ }
+
+ if (i==0) dograb=0; /* no need to grab */
+
+ if (i==1) CropRect2Rect(&gx,&gy,&gw,&gh, cr->x,cr->y,cr->w,cr->h);
+ }
+ else dograb = 0;
+ }
+
+ else {
+ /* different vis/cmap from parent:
+ add to regrab list, if not already fully contained in list */
+ struct rectlist *rr;
+
+ /* check to see if fully contained... */
+ rr=regrabList;
+ while (rr && RectIntersect(gx,gy,gw,gh, rr->x,rr->y,rr->w,rr->h)!=2)
+ rr = rr->next;
+
+ if (!rr) { /* add to list */
+ if (DEBUG)
+ fprintf(stderr,"added to regrabList: %d,%d %dx%d\n",gx,gy,gw,gh);
+
+ rr = (struct rectlist *) malloc(sizeof(struct rectlist));
+ if (!rr) return 1;
+ else {
+ rr->x = gx; rr->y = gy; rr->w = gw; rr->h = gh;
+ rr->next = regrabList;
+ regrabList = rr;
+ }
+ }
+ }
+
+ /* at this point, we have to grab gx,gy,gw,gh from 'win' */
+
+ if (dograb) {
+ int ix, iy, ncolors;
+ XColor *colors;
+ XImage *image;
+
+ XTranslateCoordinates(theDisp, rootW, win, gx, gy, &ix, &iy, &chwin);
+
+ if (DEBUG)
+ fprintf(stderr,"Grabbing win (%08x) %d,%d %dx%d\n",
+ (u_int) win, gx,gy,gw,gh);
+
+ WaitCursor();
+
+ xerrcode = 0;
+ image = XGetImage(theDisp, win, ix, iy, (u_int) gw, (u_int) gh,
+ AllPlanes, ZPixmap);
+ if (xerrcode || !image || !image->data) return 1;
+
+ ncolors = getxcolors(&xwa, &colors);
+ rv = convertImageAndStuff(image, colors, ncolors, &xwa,
+ gx - gXOFF, gy - gYOFF, gw, gh);
+ XDestroyImage(image); /* can't use xvDestroyImage: alloc'd by X! */
+ if (colors) free((char *) colors);
+ }
+
+
+ /* recurse into children to see if any of them are 'different'... */
+
+ if (!XQueryTree(theDisp, win, &root, &parent, &children, &nchildren)) {
+ if (DEBUG) fprintf(stderr,"XQueryTree(%08x) failed\n", (u_int) win);
+ if (children) XFree((char *)children);
+ return rv+1;
+ }
+
+ for (i=0; ivisual) visual = xwap->visual;
- else visual = theVisual;
+ visual = xwap->visual;
+
- if (DEBUG) {
+ if (DEBUG>1) {
fprintf(stderr,"convertImage:\n");
fprintf(stderr," %dx%d (offset %d), %s\n",
- image->width, image->height, image->xoffset,
- (image->format == XYBitmap || image->format == XYPixmap)
+ image->width, image->height, image->xoffset,
+ (image->format == XYBitmap || image->format == XYPixmap)
? "XYPixmap" : "ZPixmap");
fprintf(stderr,"byte_order = %s, bitmap_bit_order = %s, unit=%d, pad=%d\n",
@@ -575,41 +932,17 @@
sprintf(errstr, "%s\nReturned image bitmap_unit (%d) non-standard.",
"Can't deal with this display.", image->bitmap_unit);
ErrPopUp(errstr, "\nThat Sucks!");
- return 0;
+ return 1;
}
if (!ncolors && visual->class != TrueColor) {
sprintf(errstr, "%s\nOnly TrueColor displays can have no colormap.",
"Can't deal with this display.");
ErrPopUp(errstr, "\nThat Sucks!");
- return 0;
+ return 1;
}
- /* build the 'global' grabPic stuff */
- gWIDE = image->width; gHIGH = image->height;
-
- if (visual->class == TrueColor || visual->class == DirectColor ||
- ncolors > 256) {
- grabPic = (byte *) malloc((size_t) gWIDE * gHIGH * 3);
- gbits = 24;
- }
- else {
- grabPic = (byte *) malloc((size_t) gWIDE * gHIGH);
- gbits = 8;
-
- /* load up the colormap */
- for (i=0; i> 8;
- grabmapG[i] = colors[i].green >> 8;
- grabmapB[i] = colors[i].blue >> 8;
- }
- }
-
- if (!grabPic) FatalError("unable to malloc grabPic in convertImage()");
- pptr = grabPic;
-
-
if (visual->class == TrueColor || visual->class == DirectColor) {
unsigned int tmp;
@@ -634,16 +967,35 @@
while (tmp >= 256) { tmp >>= 1; b8shift -= 1; }
while (tmp < 128) { tmp <<= 1; b8shift += 1; }
- if (DEBUG)
+ if (DEBUG>1)
fprintf(stderr,"True/DirectColor: shifts=%d,%d,%d 8shifts=%d,%d,%d\n",
rshift, gshift, bshift, r8shift, g8shift, b8shift);
}
- bits_per_item = image->bitmap_unit;
- bits_used = bits_per_item;
+ bits_per_item = image->bitmap_unit;
bits_per_pixel = image->bits_per_pixel;
+
+ /* add code for freako 'exceed' server, where bitmapunit = 8
+ and bitsperpix = 32 (and depth=24)... */
+
+ if (bits_per_item < bits_per_pixel) {
+ bits_per_item = bits_per_pixel;
+
+ /* round bits_per_item up to next legal value, if necc */
+ if (bits_per_item < 8) bits_per_item = 8;
+ else if (bits_per_item < 16) bits_per_item = 16;
+ else bits_per_item = 32;
+ }
+
+
+ /* which raises the question: how (can?) you ever have a 24 bits per pix,
+ (ie, 3 bytes, no alpha/padding) */
+
+
+ bits_used = bits_per_item; /* so it will get a new item first time */
+
if (bits_per_pixel == 32) pixmask = 0xffffffff;
else pixmask = (((CARD32) 1) << bits_per_pixel) - 1;
@@ -652,14 +1004,15 @@
/* if we're on an lsbfirst machine, or the image came from an lsbfirst
machine, we should flip the bytes around. NOTE: if we're on an
- lsbfirst machine *and* the image came from an lsbfirst machine,
+ lsbfirst machine *and* the image came from an lsbfirst machine,
*don't* flip bytes, as it should work out */
- /* pity we don't have a logical exclusive-or */
flipBytes = ( isLsbMachine && byte_order != LSBFirst) ||
(!isLsbMachine && byte_order == LSBFirst);
for (i=0; iheight; i++) {
+ pptr = grabPic + ((i+gy) * gWIDE + gx) * 3;
+
lineptr = (byte *) image->data + (i * image->bytes_per_line);
bptr = ((CARD8 *) lineptr) - 1;
sptr = ((CARD16 *) lineptr) - 1;
@@ -667,35 +1020,39 @@
bits_used = bits_per_item;
for (j=0; jwidth; j++) {
-
/* get the next pixel value from the image data */
if (bits_used == bits_per_item) { /* time to move on to next b/s/l */
switch (bits_per_item) {
- case 8: bptr++; break;
- case 16: sptr++; sval = *sptr;
- if (flipBytes) { /* swap CARD16 */
- sw.s = sval;
- tmpbyte = sw.b[0];
- sw.b[0] = sw.b[1];
- sw.b[1] = tmpbyte;
- sval = sw.s;
- }
- break;
- case 32: lptr++; lval = *lptr;
- if (flipBytes) { /* swap CARD32 */
- sw.l = lval;
- tmpbyte = sw.b[0];
- sw.b[0] = sw.b[3];
- sw.b[3] = tmpbyte;
- tmpbyte = sw.b[1];
- sw.b[1] = sw.b[2];
- sw.b[2] = tmpbyte;
- lval = sw.l;
- }
- break;
+ case 8:
+ bptr++; break;
+
+ case 16:
+ sptr++; sval = *sptr;
+ if (flipBytes) { /* swap CARD16 */
+ sw.s = sval;
+ tmpbyte = sw.b[0];
+ sw.b[0] = sw.b[1];
+ sw.b[1] = tmpbyte;
+ sval = sw.s;
+ }
+ break;
+
+ case 32:
+ lptr++; lval = *lptr;
+ if (flipBytes) { /* swap CARD32 */
+ sw.l = lval;
+ tmpbyte = sw.b[0];
+ sw.b[0] = sw.b[3];
+ sw.b[3] = tmpbyte;
+ tmpbyte = sw.b[1];
+ sw.b[1] = sw.b[2];
+ sw.b[2] = tmpbyte;
+ lval = sw.l;
+ }
+ break;
}
-
+
bits_used = 0;
if (bit_order == MSBFirst) bit_shift = bits_per_item - bits_per_pixel;
else bit_shift = 0;
@@ -711,11 +1068,11 @@
else bit_shift += bits_per_pixel;
bits_used += bits_per_pixel;
-
+
/* okay, we've got the next pixel value in 'pixvalue' */
-
+
if (visual->class == TrueColor || visual->class == DirectColor) {
- /* in either case, we have to take the pixvalue and
+ /* in either case, we have to take the pixvalue and
break it out into individual r,g,b components */
rval = (pixvalue & rmask) >> rshift;
gval = (pixvalue & gmask) >> gshift;
@@ -741,212 +1098,165 @@
/* use pixel value as an index into colors array */
if (pixvalue >= ncolors) {
- FatalError("convertImage(): pixvalue >= ncolors");
+ fprintf(stderr, "WARNING: convertImage(): pixvalue >= ncolors\n");
+ return 1;
}
- if (gbits == 24) { /* too many colors for 8-bit colormap */
- *pptr++ = (colors[pixvalue].red) >> 8;
- *pptr++ = (colors[pixvalue].green) >> 8;
- *pptr++ = (colors[pixvalue].blue) >> 8;
- }
- else *pptr++ = pixvalue & 0xff;
-
+ *pptr++ = (colors[pixvalue].red) >> 8;
+ *pptr++ = (colors[pixvalue].green) >> 8;
+ *pptr++ = (colors[pixvalue].blue) >> 8;
}
}
}
- return 1;
+ return 0;
}
-/**************************************/
-static int lowbitnum(ul)
- unsigned long ul;
+/***********************************/
+static int RectIntersect(ax,ay,aw,ah, bx,by,bw,bh)
+ int ax,ay,aw,ah, bx,by,bw,bh;
{
- /* returns position of lowest set bit in 'ul' as an integer (0-31),
- or -1 if none */
+ /* returns 0 if rectangles A and B do not intersect
+ returns 1 if A partially intersects B
+ returns 2 if rectangle A is fully enclosed by B */
- int i;
- for (i=0; ((ul&1) == 0) && i<32; i++, ul>>=1);
- if (i==32) i = -1;
- return i;
-}
+ int ax1,ay1, bx1,by1;
+ ax1 = ax+aw-1; ay1 = ay+ah-1;
+ bx1 = bx+bw-1; by1 = by+bh-1;
+ if (ax1bx1 || ay1by1) return 0;
-/**************************************/
-/* following code snarfed from 'xwd.c' */
-/**************************************/
+ if (ax>=bx && ax1<=bx1 && ay>=by && ay1<=by) return 2;
-#define lowbit(x) ((x) & (~(x) + 1))
-
-
-static int getxcolors(win_info, colors)
- XWindowAttributes *win_info;
- XColor **colors;
-{
- int i, ncolors;
- Colormap cmap;
-
- *colors = (XColor *) NULL;
+ return 1;
+}
- if (win_info->visual->class == TrueColor) {
- if (DEBUG) fprintf(stderr,"TrueColor visual: no colormap needed\n");
- return 0;
- }
- else if (!win_info->colormap) {
- if (DEBUG) fprintf(stderr,"no colormap associated with window\n");
- return 0;
- }
- ncolors = win_info->visual->map_entries;
- if (DEBUG) fprintf(stderr,"%d entries in colormap\n", ncolors);
- if (!(*colors = (XColor *) malloc (sizeof(XColor) * ncolors)))
- FatalError("malloc failed in getxcolors()");
+/** stuff needed to make new xvgrab work in 3.10a. **/
- if (win_info->visual->class == DirectColor) {
- Pixel red, green, blue, red1, green1, blue1;
+/********************************************/
+static int CountColors24(pic, pwide, phigh, x, y, w, h)
+ byte *pic;
+ int pwide, phigh, x,y,w,h;
+{
+ /* counts the # of unique colors in a selected rect of a PIC24
+ returns '0-256' or >256 */
- if (DEBUG) fprintf(stderr,"DirectColor visual\n");
+ int i, j, nc;
+ int low, high, mid;
+ u_int colors[257], col;
+ byte *pp;
+
+ nc = 0;
+
+ for (i=y; nc<257 && i colors[mid]) low = mid + 1;
+ else break;
+ }
- red = green = blue = 0;
- red1 = lowbit(win_info->visual->red_mask);
- green1 = lowbit(win_info->visual->green_mask);
- blue1 = lowbit(win_info->visual->blue_mask);
- for (i=0; i win_info->visual->red_mask) red = 0;
- green += green1;
- if (green > win_info->visual->green_mask) green = 0;
- blue += blue1;
- if (blue > win_info->visual->blue_mask) blue = 0;
- }
- }
- else {
- for (i=0; icolormap, *colors, ncolors);
-
- return(ncolors);
+ return nc;
}
-
-
-
-/***********************************/
-int LoadGrab(pinfo)
- PICINFO *pinfo;
+/****************************/
+static int Trivial24to8(pic24, w,h, pic8, rmap,gmap,bmap, maxcol)
+ byte *pic24, *pic8, *rmap, *gmap, *bmap;
+ int w,h,maxcol;
{
- /* loads up (into XV structures) last image successfully grabbed.
- returns '0' on failure, '1' on success */
-
- int i;
-
- if (!grabPic) return 0; /* no image to use */
-
- if (gbits == 24) pinfo->type = PIC24;
- else {
- pinfo->type = PIC8;
+ /* scans picture until it finds more than 'maxcol' different colors. If it
+ finds more than 'maxcol' colors, it returns '0'. If it DOESN'T, it does
+ the 24-to-8 conversion by simply sticking the colors it found into
+ a colormap, and changing instances of a color in pic24 into colormap
+ indicies (in pic8) */
+
+ unsigned long colors[256],col;
+ int i, nc, low, high, mid;
+ byte *p, *pix;
+
+ if (maxcol>256) maxcol = 256;
+
+ /* put the first color in the table by hand */
+ nc = 0; mid = 0;
+
+ for (i=w*h,p=pic24; i; i--) {
+ col = (((u_long) *p++) << 16);
+ col += (((u_long) *p++) << 8);
+ col += *p++;
+
+ /* binary search the 'colors' array to see if it's in there */
+ low = 0; high = nc-1;
+ while (low <= high) {
+ mid = (low+high)/2;
+ if (col < colors[mid]) high = mid - 1;
+ else if (col > colors[mid]) low = mid + 1;
+ else break;
+ }
- for (i=0; i<256; i++) {
- pinfo->r[i] = grabmapR[i];
- pinfo->g[i] = grabmapG[i];
- pinfo->b[i] = grabmapB[i];
+ if (high < low) { /* didn't find color in list, add it. */
+ if (nc>=maxcol) return 0;
+ xvbcopy((char *) &colors[low], (char *) &colors[low+1],
+ (nc - low) * sizeof(u_long));
+ colors[low] = col;
+ nc++;
}
}
- pinfo->pic = grabPic;
- pinfo->normw = pinfo->w = gWIDE;
- pinfo->normh = pinfo->h = gHIGH;
- pinfo->frmType = -1;
- pinfo->colType = -1;
- sprintf(pinfo->fullInfo,"<%s internal>",
- (pinfo->type == PIC8) ? "8-bit" : "24-bit");
-
- sprintf(pinfo->shrtInfo,"%dx%d image.",gWIDE, gHIGH);
-
- pinfo->comment = (char *) NULL;
+ /* run through the data a second time, this time mapping pixel values in
+ pic24 into colormap offsets into 'colors' */
- grabPic = (byte *) NULL;
-
- return 1;
-}
-
-
-
-
-
-#include
-#include
-
-static Window TryChildren PARM((Display *, Window, Atom));
-
-/* Find a window with WM_STATE, else return '0' */
-
-static Window xvClientWindow (dpy, win)
- Display *dpy;
- Window win;
-{
- Atom WM_STATE;
- Atom type = None;
- int format;
- unsigned long nitems, after;
- unsigned char *data;
- Window inf;
-
- WM_STATE = XInternAtom(dpy, "WM_STATE", True);
- if (!WM_STATE) return win;
-
- XGetWindowProperty(dpy, win, WM_STATE, 0L, 0L, False, AnyPropertyType,
- &type, &format, &nitems, &after, &data);
- if (type) return win;
-
- inf = TryChildren(dpy, win, WM_STATE);
-
- return inf;
-}
-
-static Window TryChildren (dpy, win, WM_STATE)
- Display *dpy;
- Window win;
- Atom WM_STATE;
-{
- Window root, parent;
- Window *children;
- unsigned int nchildren;
- unsigned int i;
- Atom type = None;
- int format;
- unsigned long nitems, after;
- unsigned char *data;
- Window inf = 0;
-
- if (!XQueryTree(dpy, win, &root, &parent, &children, &nchildren))
- return 0;
+ for (i=w*h,p=pic24, pix=pic8; i; i--,pix++) {
+ col = (((u_long) *p++) << 16);
+ col += (((u_long) *p++) << 8);
+ col += *p++;
+
+ /* binary search the 'colors' array. It *IS* in there */
+ low = 0; high = nc-1;
+ while (low <= high) {
+ mid = (low+high)/2;
+ if (col < colors[mid]) high = mid - 1;
+ else if (col > colors[mid]) low = mid + 1;
+ else break;
+ }
- for (i = 0; !inf && (i < nchildren); i++) {
- XGetWindowProperty(dpy, children[i], WM_STATE, 0L, 0L, False,
- AnyPropertyType, &type, &format, &nitems,
- &after, &data);
- if (type)
- inf = children[i];
+ if (high < low) {
+ fprintf(stderr,"Trivial24to8: impossible situation!\n");
+ exit(1);
}
+ *pix = mid;
+ }
- for (i = 0; !inf && (i < nchildren); i++)
- inf = TryChildren(dpy, children[i], WM_STATE);
+ /* and load up the 'desired colormap' */
+ for (i=0; i>16;
+ gmap[i] = (colors[i]>>8) & 0xff;
+ bmap[i] = colors[i] & 0xff;
+ }
- if (children) XFree((char *)children);
- return inf;
+ return 1;
}
diff -ru xv-3.10a/xvgraf.c xv-3.10a-enhancements/xvgraf.c
--- xv-3.10a/xvgraf.c 1994-12-22 14:34:42.000000000 -0800
+++ xv-3.10a-enhancements/xvgraf.c 2007-05-12 14:03:08.000000000 -0700
@@ -1,4 +1,4 @@
-/*
+/*
* xvgraf.c - GRAF window handling functions
*
* callable functions:
@@ -52,7 +52,7 @@
Window parent;
int x,y;
unsigned long fg,bg;
- char *title;
+ const char *title;
{
/* NOTE: CreateGraf does not initialize hands[], nhands, or spline,
as these could be initialized by X resources (or whatever),
@@ -88,7 +88,7 @@
gp->win = XCreateSimpleWindow(theDisp, parent, x,y, GWIDE, GHIGH, 1, fg,bg);
if (!gp->win) FatalError("can't create graph (main) window");
- gp->gwin = XCreateSimpleWindow(theDisp, gp->win, 2, GHIGH-132,
+ gp->gwin = XCreateSimpleWindow(theDisp, gp->win, 2, GHIGH-132,
128, 128, 1, fg,bg);
if (!gp->gwin) FatalError("can't create graph (sub) window");
@@ -96,7 +96,7 @@
BTCreate(&gp->butts[i], gp->win, GWIDE-GBWIDE-2, 1+i * (GBHIGH + 1),
GBWIDE, GBHIGH, (char *) NULL, fg, bg, hicol, locol);
gp->butts[i].pix = gfbpix[i];
- gp->butts[i].pw = PW;
+ gp->butts[i].pw = PW;
gp->butts[i].ph = PH;
}
@@ -132,7 +132,7 @@
gp->gammamode = 0; gp->gamma = 1.0;
}
-
+
/***************************************************/
void RedrawGraf(gp, gwin)
@@ -148,7 +148,7 @@
else {
Draw3dRect(gp->win, 0,0, GWIDE-1, GHIGH-1, R3D_OUT, 1, hicol, locol,
gp->bg);
-
+
XSetForeground(theDisp, theGC, gp->fg);
XSetBackground(theDisp, theGC, gp->bg);
DrawString(gp->win, 2, 1+ASCENT, gp->str);
@@ -165,11 +165,11 @@
{
int i,x,y;
XPoint pts[129], *pt;
-
+
if (gp->entergamma) {
- char *str1 = "Enter gamma";
- char *str2 = "value: ";
+ const char *str1 = "Enter gamma";
+ const char *str2 = "value: ";
XSetForeground(theDisp, theGC, gp->fg);
XSetBackground(theDisp, theGC, gp->bg);
@@ -181,15 +181,15 @@
x = 10 + StringWidth(str2) + 8;
y = 30 + ASCENT + CHIGH + 3;
i = StringWidth(gp->gvstr);
- if (gp->entergamma < 0 && strlen(gp->gvstr)) {
+ if (gp->entergamma < 0 && strlen(gp->gvstr)) {
/* show string highlited */
XFillRectangle(theDisp, gp->gwin, theGC, x-1, y-ASCENT-1,
(u_int) i+2, (u_int) CHIGH+2);
XSetForeground(theDisp, theGC, gp->bg);
}
- else
+ else
XDrawLine(theDisp, gp->gwin, theGC, x+i, y-ASCENT, x+i, y+DESCENT);
-
+
DrawString(gp->gwin, x,y, gp->gvstr);
return;
@@ -267,7 +267,7 @@
if (igammamode = 0;
@@ -312,7 +312,7 @@
if (gp->nhands < MAX_GHANDS) {
/* find largest x-gap in handles, put new handle in mid */
int lgap, lpos, x, y;
-
+
lgap = gp->hands[1].x - gp->hands[0].x;
lpos = 1;
for (j=1; jnhands-1; j++)
@@ -320,11 +320,11 @@
lgap = gp->hands[j+1].x - gp->hands[j].x;
lpos = j+1;
}
-
+
/* open up position in hands[] array */
- xvbcopy((char *) &gp->hands[lpos], (char *) &gp->hands[lpos+1],
+ xvbcopy((char *) &gp->hands[lpos], (char *) &gp->hands[lpos+1],
(gp->nhands - lpos) * sizeof(XPoint));
-
+
x = gp->hands[lpos-1].x + lgap/2;
y = gp->func[x];
gp->hands[lpos].x = x;
@@ -343,7 +343,7 @@
BTSetActive(&gp->butts[GFB_DELH], 1);
}
break;
-
+
case GFB_DELH:
if (gp->nhands > 2) {
/* find (middle) point whose x-distance to previous
@@ -361,9 +361,9 @@
mdist = dist; mpos = j;
}
}
-
+
/* delete position 'mpos' in hands[] array */
- xvbcopy((char *) &gp->hands[mpos+1], (char *) &gp->hands[mpos],
+ xvbcopy((char *) &gp->hands[mpos+1], (char *) &gp->hands[mpos],
(gp->nhands-mpos-1) * sizeof(XPoint));
gp->nhands--;
@@ -408,16 +408,16 @@
/* keep original mouse position in 'mx,my', and warp mouse to center
of screen */
- grab = !XGrabPointer(theDisp, gp->gwin, False, 0, GrabModeAsync,
+ grab = !XGrabPointer(theDisp, gp->gwin, False, 0, GrabModeAsync,
GrabModeAsync, None, inviso, (Time) CurrentTime);
- XWarpPointer(theDisp, None, rootW, 0,0,0,0,
+ XWarpPointer(theDisp, None, rootW, 0,0,0,0,
(int) dispWIDE/2, (int) dispHIGH/2);
- origx = dispWIDE/2; origy = dispHIGH/2;
+ origx = dispWIDE/2; origy = dispHIGH/2;
orighx = gp->hands[h].x; orighy = gp->hands[h].y;
gp->gammamode = 0;
- offx = gp->hands[h].x - origx;
+ offx = gp->hands[h].x - origx;
offy = gp->hands[h].y - origy;
vertonly = (h==0 || h==(gp->nhands-1));
@@ -434,7 +434,7 @@
dx = x - origx; dy = origy - y; /* flip y axis */
- /* new (virt) position of handle is (desired)
+ /* new (virt) position of handle is (desired)
orighx + dx, orighy + dy */
if (!vertonly) { /* keep this handle between its neighbors */
@@ -448,7 +448,7 @@
if (newx != gp->hands[h].x || newy != gp->hands[h].y) {
/* this handle has moved... */
XSetForeground(theDisp, theGC, gp->bg);
- XFillRectangle(theDisp, gp->gwin, theGC,
+ XFillRectangle(theDisp, gp->gwin, theGC,
(gp->hands[h].x/2)-3, ((255-gp->hands[h].y)/2)-3, 7,7);
gp->hands[h].x = newx; gp->hands[h].y = newy;
@@ -464,7 +464,7 @@
}
drawHandPos(gp, -1);
- XWarpPointer(theDisp, None, gp->gwin, 0,0,0,0,
+ XWarpPointer(theDisp, None, gp->gwin, 0,0,0,0,
gp->hands[h].x/2, (255-gp->hands[h].y)/2);
if (grab) XUngrabPointer(theDisp, (Time) CurrentTime);
}
@@ -480,24 +480,24 @@
int hnum;
{
int w;
- char *tstr = "888,888";
-
+ const char *tstr = "888,888";
+
/* if hnum < 0, clears the text area */
-
+
XSetFont(theDisp, theGC, monofont);
w = XTextWidth(monofinfo, tstr, (int) strlen(tstr));
- if (hnum >= 0) sprintf(str,"%3d,%3d",gp->hands[hnum].x,gp->hands[hnum].y);
- else sprintf(str," ");
+ if (hnum >= 0) sprintf(dummystr,"%3d,%3d",gp->hands[hnum].x,gp->hands[hnum].y);
+ else sprintf(dummystr," ");
XSetForeground(theDisp, theGC, gp->fg);
XSetBackground(theDisp, theGC, gp->bg);
- XDrawImageString(theDisp, gp->win, theGC, 130-w, 1+ASCENT,
- str, (int) strlen(str));
+ XDrawImageString(theDisp, gp->win, theGC, 130-w, 1+ASCENT,
+ dummystr, (int) strlen(dummystr));
XSetFont(theDisp, theGC, mfont);
}
-
+
/***************************************************/
int GrafKey(gp,str)
@@ -518,7 +518,7 @@
}
while (*str) {
- if (gp->entergamma == -1 &&
+ if (gp->entergamma == -1 &&
(*str != '\012' && *str != '\015' && *str != '\033')) {
gp->entergamma = 1;
gp->gvstr[0] = '\0';
@@ -529,7 +529,7 @@
len = strlen(gp->gvstr);
if (*str>= '0' && *str <= '9') {
- if (len < GVMAX) {
+ if (len < GVMAX) {
gp->gvstr[len++] = *str;
gp->gvstr[len] = '\0';
ok = 1;
@@ -607,18 +607,18 @@
/* do sanity check. (x-coords must be sorted (strictly increasing)) */
- for (i=0; inhands; i++) {
- RANGE(gp->hands[i].x, 0, 255);
+ for (i=0; inhands; i++) {
+ RANGE(gp->hands[i].x, 0, 255);
RANGE(gp->hands[i].y, 0, 255);
}
gp->hands[0].x = 0; gp->hands[gp->nhands-1].x = 255;
for (i=1; inhands-1; i++) {
if (gp->hands[i].x < i) gp->hands[i].x = i;
- if (gp->hands[i].x > 256-gp->nhands+i)
+ if (gp->hands[i].x > 256-gp->nhands+i)
gp->hands[i].x = 256-gp->nhands+i;
- if (gp->hands[i].x <= gp->hands[i-1].x)
+ if (gp->hands[i].x <= gp->hands[i-1].x)
gp->hands[i].x = gp->hands[i-1].x + 1;
}
@@ -647,17 +647,17 @@
else { /* gp->gamma == 0.0 */
for (i=0; i<256; i++) gp->func[i] = 0;
}
-
-
+
+
for (i=0; inhands; i++) {
gp->hands[i].y = gp->func[gp->hands[i].x];
}
}
-
+
else if (!gp->spline) { /* do linear interpolation */
int y,x1,y1,x2,y2;
double yd;
-
+
for (i=0; inhands-1; i++) {
x1 = gp->hands[ i ].x; y1 = gp->hands[ i ].y;
x2 = gp->hands[i+1].x; y2 = gp->hands[i+1].y;
@@ -676,12 +676,12 @@
double yf[MAX_GHANDS];
double yd;
- for (i=0; inhands; i++) {
+ for (i=0; inhands; i++) {
x[i] = gp->hands[i].x; y[i] = gp->hands[i].y;
}
-
+
InitSpline(x, y, gp->nhands, yf);
-
+
for (i=0; i<256; i++) {
yd = EvalSpline(x, y, yf, gp->nhands, (double) i);
j = (int) floor(yd + 0.5);
@@ -729,8 +729,8 @@
/*********************/
int Str2Graf(gp, str)
-GRAF_STATE *gp;
-char *str;
+ GRAF_STATE *gp;
+ const char *str;
{
/* parses strings of the form: "S 3 : 0,0 : 63,63 : 255,255",
(meaning SPLINE, 3 points, and the 3 sets of handle coordinates)
@@ -744,14 +744,15 @@
thing tends to break optimizers */
char tstr[256], tstr1[256], *sp, *dp;
+ const char *csp;
XPoint coords[MAX_GHANDS];
int spline, nhands, i, x, y;
if (!str) return 1; /* NULL strings don't parse well! */
/* first, strip all pesky whitespace from str */
- for (sp=str, dp=tstr; *sp; sp++)
- if (*sp > ' ') { *dp = *sp; dp++; }
+ for (csp=str, dp=tstr; *csp; csp++)
+ if (*csp > ' ') { *dp = *csp; dp++; }
*dp = '\0';
/* check for 'gamma'-style str */
@@ -761,10 +762,10 @@
gp->gammamode = 1;
sprintf(gp->gvstr, "%.5g", gp->gamma);
return 0;
- }
+ }
else return 1;
}
-
+
/* read Spline, or Line (S/L) character */
sp = tstr;
if (*sp == 'S' || *sp == 's') spline = 1;
@@ -784,7 +785,7 @@
while (*sp && *sp != ':') {*dp = *sp; dp++; sp++; }
*dp++ = '\0';
if (sscanf(tstr1,"%d,%d",&x, &y) != 2) return 1;
- if (x < 0 || x > 255 ||
+ if (x < 0 || x > 255 ||
y < 0 || y > 255) return 1; /* out of range */
coords[i].x = x; coords[i].y = y;
}
@@ -837,7 +838,7 @@
IFSET(gp->gamma, gsp->gamma);
IFSET(gp->nhands, gsp->nhands);
- if (strcmp(gp->gvstr, gsp->gvstr))
+ if (strcmp(gp->gvstr, gsp->gvstr))
{ strcpy(gp->gvstr, gsp->gvstr); rv++; }
for (i=0; inhands; i++) {
@@ -880,7 +881,7 @@
sig = ((double) x[i]-x[i-1]) / ((double) x[i+1] - x[i-1]);
p = sig * y2[i-1] + 2.0;
y2[i] = (sig-1.0) / p;
- u[i] = (((double) y[i+1]-y[i]) / (x[i+1]-x[i])) -
+ u[i] = (((double) y[i+1]-y[i]) / (x[i+1]-x[i])) -
(((double) y[i]-y[i-1]) / (x[i]-x[i-1]));
u[i] = (6.0 * u[i]/(x[i+1]-x[i-1]) - sig*u[i-1]) / p;
}
@@ -912,9 +913,9 @@
if (h==0.0) FatalError("bad xvalues in splint\n");
a = (xa[khi]-x)/h;
b = (x-xa[klo])/h;
- return (a*ya[klo] + b*ya[khi] + ((a*a*a-a)*y2a[klo] +(b*b*b-b)*y2a[khi])
+ return (a*ya[klo] + b*ya[khi] + ((a*a*a-a)*y2a[klo] +(b*b*b-b)*y2a[khi])
* (h*h) / 6.0);
}
-
+
diff -ru xv-3.10a/xviff.c xv-3.10a-enhancements/xviff.c
--- xv-3.10a/xviff.c 1995-01-13 11:54:54.000000000 -0800
+++ xv-3.10a-enhancements/xviff.c 2007-05-13 17:50:59.000000000 -0700
@@ -39,14 +39,14 @@
static long filesize;
-static int readID PARM((FILE *, char *));
-static int iffError PARM((char *, char *));
+/* static int readID PARM((FILE *, char *)); DOES NOT EXIST */
+static int iffError PARM((const char *, const char *));
static void decomprle PARM((byte *, byte *, long, long));
static unsigned int iff_getword PARM((byte *));
static unsigned long iff_getlong PARM((byte *));
-static char *bname;
+static const char *bname;
/* Define internal ILBM types */
@@ -65,16 +65,16 @@
/*******************************************/
{
/* returns '1' on success */
-
+
register byte bitmsk, rval, gval, bval;
register long col, colbit;
FILE *fp;
int rv;
- int BMHDok, CMAPok, CAMGok, BODYok;
+ int BMHDok, CMAPok, CAMGok;
int bmhd_width, bmhd_height, bmhd_bitplanes, bmhd_transcol;
int i, j, k, lineskip, colors, fmt;
byte bmhd_masking, bmhd_compression;
- long chunkLen, camg_viewmode, decomp_bufsize;
+ long chunkLen, camg_viewmode;
byte *databuf, *dataptr, *cmapptr, *picptr, *pic, *bodyptr;
byte *workptr, *workptr2, *workptr3, *decomp_mem;
@@ -138,6 +138,7 @@
BODY chunk was found or dataptr ran over end of file */
while ((rv<0) && (dataptr < (databuf + filesize))) {
+ int npixels = 0;
chunkLen = (iff_getlong(dataptr + 4) + 1) & 0xfffffffe; /* make even */
if (strncmp((char *) dataptr, "BMHD", (size_t) 4)==0) { /* BMHD chunk? */
@@ -149,25 +150,30 @@
bmhd_transcol = iff_getword(dataptr + 8 + 12);
BMHDok = 1; /* got BMHD */
dataptr += 8 + chunkLen; /* to next chunk */
+
+ npixels = bmhd_width * bmhd_height; /* 65535*65535 max */
+ if (bmhd_width <= 0 || bmhd_height <= 0
+ || npixels/bmhd_width != bmhd_height)
+ return (iffError(bname, "xviff: image dimensions out of range"));
}
else if (strncmp((char *) dataptr, "CMAP", (size_t) 4)==0) { /* CMAP ? */
cmapptr = dataptr + 8;
colors = chunkLen / 3; /* calc no of colors */
-
+
/* copy colors to color map */
for (i=0; i < colors; i++) {
pinfo->r[i] = *cmapptr++;
pinfo->g[i] = *cmapptr++;
pinfo->b[i] = *cmapptr++;
}
-
+
CMAPok = 1; /* got CMAP */
dataptr += 8 + chunkLen; /* to next chunk */
}
-
+
else if (strncmp((char *) dataptr, "CAMG", (size_t) 4)==0) { /* CAMG ? */
camg_viewmode = iff_getlong(dataptr + 8); /* get viewmodes */
CAMGok = 1; /* got CAMG */
@@ -176,19 +182,28 @@
else if (strncmp((char *) dataptr, "BODY", (size_t) 4)==0) { /* BODY ? */
+ int byte_width = (((bmhd_width + 15) >> 4) << 1); /* 8192 max */
+
bodyptr = dataptr + 8; /* -> BODY data */
-
+
if (BMHDok) { /* BMHD found? */
/* if BODY is compressed, allocate buffer for decrunched BODY and
decompress it (run length encoding) */
-
+
if (bmhd_compression == 1) {
/* calc size of decrunch buffer - (size of the actual picture
decompressed in interleaved Amiga bitplane format) */
- decomp_bufsize = (((bmhd_width + 15) >> 4) << 1)
- * bmhd_height * bmhd_bitplanes;
-
+ int bytes_per_bitplane = byte_width * bmhd_height; /* 536862720 max */
+ long decomp_bufsize = bytes_per_bitplane * bmhd_bitplanes;
+
+ if (byte_width <= 0 || bmhd_height <= 0 ||
+ bytes_per_bitplane/byte_width != bmhd_height ||
+ decomp_bufsize/bytes_per_bitplane != bmhd_bitplanes)
+ {
+ return (iffError(bname, "xviff: image dimensions out of range"));
+ }
+
if ((decomp_mem = (byte *)malloc((size_t) decomp_bufsize)) != NULL) {
decomprle(dataptr + 8, decomp_mem, chunkLen, decomp_bufsize);
bodyptr = decomp_mem; /* -> uncompressed BODY */
@@ -200,12 +215,13 @@
FatalError("xviff: cannot malloc() decrunch buffer");
}
}
-
+
/* the following determines the type of the ILBM file.
it's either NORMAL, EHB, HAM, HAM8 or 24BIT */
-
+
fmt = ILBM_NORMAL; /* assume normal ILBM */
+ /* FIXME: does ILBM_NORMAL really support up to 255 bitplanes? */
if (bmhd_bitplanes == 24) fmt = ILBM_24BIT;
else if (bmhd_bitplanes == 8) {
@@ -216,7 +232,7 @@
if (camg_viewmode & 0x80) fmt = ILBM_EHB;
else if (camg_viewmode & 0x800) fmt = ILBM_HAM;
}
-
+
if (DEBUG) {
fprintf(stderr, "LoadIFF: %s %dx%d, planes=%d (%d cols), comp=%d\n",
@@ -225,9 +241,9 @@
(fmt==ILBM_HAM8) ? "HAM8 ILBM" :
(fmt==ILBM_EHB) ? "EHB ILBM" :
(fmt==ILBM_24BIT) ? "24BIT ILBM" : "unknown ILBM",
- bmhd_width, bmhd_height, bmhd_bitplanes,
+ bmhd_width, bmhd_height, bmhd_bitplanes,
1<> 4) << 1;
-
+ lineskip = byte_width;
+
for (i=0; ir[i + colors] = pinfo->r[i] >> 1;
pinfo->g[i + colors] = pinfo->g[i] >> 1;
pinfo->b[i + colors] = pinfo->b[i] >> 1;
}
}
-
+
pic = picptr; /* ptr to chunky buffer */
workptr = bodyptr; /* ptr to uncmp'd pic, planar format */
-
- lineskip = ((bmhd_width + 15) >> 4) << 1; /* # of bytes/line */
-
+ lineskip = byte_width;
+
for (i=0; i> 1; /* shift mask to next bit */
if (bitmsk == 0) { /* if mask is zero */
@@ -382,7 +404,7 @@
workptr2++; /* mv ptr to next byte */
}
} /* for j ... */
-
+
workptr += lineskip * bmhd_bitplanes; /* to next line */
} /* for i ... */
@@ -399,7 +421,7 @@
pinfo->colType = F_FULLCOLOR;
pinfo->frmType = -1;
- sprintf(pinfo->fullInfo, "%s (%ld bytes)",
+ sprintf(pinfo->fullInfo, "%s (%ld bytes)",
(fmt==ILBM_NORMAL) ? "IFF ILBM" :
(fmt==ILBM_HAM) ? "HAM ILBM" :
(fmt==ILBM_HAM8) ? "HAM8 ILBM" :
@@ -414,7 +436,8 @@
} /* if BMHDok */
else rv = 0; /* didn't get BMHD header */
- }
+
+ } /* "BODY" chunk */
else {
if (DEBUG)
@@ -440,10 +463,10 @@
/**************************************************************************
void decomprle(source, destination, source length, buffer size)
-
+
Decompress run-length encoded data from source to destination. Terminates
when source is decoded completely or destination buffer is full.
-
+
The decruncher is as optimized as I could make it, without risking
safety in case of corrupt BODY chunks.
***************************************************************************/
@@ -455,12 +478,12 @@
register long slen, dlen;
{
register byte codeByte, dataByte;
-
+
while ((slen > 0) && (dlen > 0)) {
-
+
/* read control byte */
codeByte = *sptr++;
-
+
if (codeByte < 0x80) {
codeByte++;
if ((slen > (long) codeByte) && (dlen >= (long) codeByte)) {
@@ -522,7 +545,7 @@
/*******************************************/
static int iffError(fname, st)
- char *fname, *st;
+ const char *fname, *st;
{
SetISTR(ISTR_WARNING,"%s: %s", fname, st);
return 0;
diff -ru xv-3.10a/xvimage.c xv-3.10a-enhancements/xvimage.c
--- xv-3.10a/xvimage.c 1995-01-13 16:11:36.000000000 -0800
+++ xv-3.10a-enhancements/xvimage.c 2007-03-18 18:13:51.000000000 -0700
@@ -21,6 +21,16 @@
* int LoadPad(pinfo, fname);
*/
+/* The following switch should better be provided at runtime for
+ * comparison purposes.
+ * At the moment it's only compile time, unfortunately.
+ * Who can make adaptions for use as a runtime switch by a menu option?
+ * [GRR 19980607: now via do_fixpix_smooth global; macro renamed to ENABLE_]
+ * [see http://sylvana.net/fixpix/ for home page, further info]
+ */
+/* #define ENABLE_FIXPIX_SMOOTH */ /* GRR 19980607: moved into xv.h */
+
+#define NEEDSDIR /* for S_IRUSR|S_IWUSR */
#include "copyright.h"
#include "xv.h"
@@ -34,9 +44,11 @@
static void do_pan_calc PARM((int, int, int *, int *));
static void crop1 PARM((int, int, int, int, int));
static int doAutoCrop24 PARM((void));
-static void floydDitherize1 PARM((XImage *, byte *, int, int, int,
+static void floydDitherize1 PARM((XImage *, byte *, int, int, int,
byte *, byte *,byte *));
+#if 0 /* NOTUSED */
static int highbit PARM((unsigned long));
+#endif
static int doPadSolid PARM((char *, int, int, int, int));
static int doPadBggen PARM((char *, int, int, int, int));
@@ -46,6 +58,267 @@
static int ReadImageFile1 PARM((char *, PICINFO *));
+/* The following array represents the pixel values for each shade
+ * of the primary color components.
+ * If 'p' is a pointer to a source image rgb-byte-triplet, we can
+ * construct the output pixel value simply by 'oring' together
+ * the corresponding components:
+ *
+ * unsigned char *p;
+ * unsigned long pixval;
+ *
+ * pixval = screen_rgb[0][*p++];
+ * pixval |= screen_rgb[1][*p++];
+ * pixval |= screen_rgb[2][*p++];
+ *
+ * This is both efficient and generic, since the only assumption
+ * is that the primary color components have separate bits.
+ * The order and distribution of bits does not matter, and we
+ * don't need additional variables and shifting/masking code.
+ * The array size is 3 KBytes total and thus very reasonable.
+ */
+
+static unsigned long screen_rgb[3][256];
+
+/* The following array holds the exact color representations
+ * reported by the system.
+ * This is useful for less than 24 bit deep displays as a base
+ * for additional dithering to get smoother output.
+ */
+
+static byte screen_set[3][256];
+
+/* The following routine initializes the screen_rgb and screen_set
+ * arrays.
+ * Since it is executed only once per program run, it does not need
+ * to be super-efficient.
+ *
+ * The method is to draw points in a pixmap with the specified shades
+ * of primary colors and then get the corresponding XImage pixel
+ * representation.
+ * Thus we can get away with any Bit-order/Byte-order dependencies.
+ *
+ * The routine uses some global X variables: theDisp, theScreen,
+ * and dispDEEP. Adapt these to your application as necessary.
+ * I've not passed them in as parameters, since for other platforms
+ * than X these may be different (see vfixpix.c), and so the
+ * screen_init() interface is unique.
+ *
+ * BUG: I've read in the "Xlib Programming Manual" from O'Reilly &
+ * Associates, that the DefaultColormap in TrueColor might not
+ * provide the full shade representation in XAllocColor.
+ * In this case one had to provide a 'best' colormap instead.
+ * However, my tests with Xaccel on a Linux-Box with a Mach64
+ * card were fully successful, so I leave that potential problem
+ * to you at the moment and would appreciate any suggestions...
+ */
+
+static void screen_init()
+{
+ static int init_flag; /* assume auto-init as 0 */
+ Pixmap check_map;
+ GC check_gc;
+ XColor check_col;
+ XImage *check_image;
+ int ci, i;
+
+ if (init_flag) return;
+ init_flag = 1;
+
+ check_map = XCreatePixmap(theDisp, RootWindow(theDisp,theScreen),
+ 1, 1, dispDEEP);
+ check_gc = XCreateGC(theDisp, check_map, 0, NULL);
+ for (ci = 0; ci < 3; ci++) {
+ for (i = 0; i < 256; i++) {
+ check_col.red = 0;
+ check_col.green = 0;
+ check_col.blue = 0;
+ /* Do proper upscaling from unsigned 8 bit (image data values)
+ to unsigned 16 bit (X color representation). */
+ ((unsigned short *)&check_col.red)[ci] = (unsigned short)((i << 8) | i);
+ if (theVisual->class == TrueColor)
+ XAllocColor(theDisp, theCmap, &check_col);
+ else
+ xvAllocColor(theDisp, theCmap, &check_col);
+ screen_set[ci][i] =
+ (((unsigned short *)&check_col.red)[ci] >> 8) & 0xff;
+ XSetForeground(theDisp, check_gc, check_col.pixel);
+ XDrawPoint(theDisp, check_map, check_gc, 0, 0);
+ check_image = XGetImage(theDisp, check_map, 0, 0, 1, 1,
+ AllPlanes, ZPixmap);
+ if (check_image) {
+ switch (check_image->bits_per_pixel) {
+ case 8:
+ screen_rgb[ci][i] = *(CARD8 *)check_image->data;
+ break;
+ case 16:
+ screen_rgb[ci][i] = *(CARD16 *)check_image->data;
+ break;
+ case 24:
+ screen_rgb[ci][i] =
+ ((unsigned long)*(CARD8 *)check_image->data << 16) |
+ ((unsigned long)*(CARD8 *)(check_image->data + 1) << 8) |
+ (unsigned long)*(CARD8 *)(check_image->data + 2);
+ break;
+ case 32:
+ screen_rgb[ci][i] = *(CARD32 *)check_image->data;
+ break;
+ }
+ XDestroyImage(check_image);
+ }
+ }
+ }
+ XFreeGC(theDisp, check_gc);
+ XFreePixmap(theDisp, check_map);
+}
+
+
+#ifdef ENABLE_FIXPIX_SMOOTH
+
+/* The following code is based in part on:
+ *
+ * jquant1.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains 1-pass color quantization (color mapping) routines.
+ * These routines provide mapping to a fixed color map using equally spaced
+ * color values. Optional Floyd-Steinberg or ordered dithering is available.
+ */
+
+/* Declarations for Floyd-Steinberg dithering.
+ *
+ * Errors are accumulated into the array fserrors[], at a resolution of
+ * 1/16th of a pixel count. The error at a given pixel is propagated
+ * to its not-yet-processed neighbors using the standard F-S fractions,
+ * ... (here) 7/16
+ * 3/16 5/16 1/16
+ * We work left-to-right on even rows, right-to-left on odd rows.
+ *
+ * We can get away with a single array (holding one row's worth of errors)
+ * by using it to store the current row's errors at pixel columns not yet
+ * processed, but the next row's errors at columns already processed. We
+ * need only a few extra variables to hold the errors immediately around the
+ * current column. (If we are lucky, those variables are in registers, but
+ * even if not, they're probably cheaper to access than array elements are.)
+ *
+ * We provide (#columns + 2) entries per component; the extra entry at each
+ * end saves us from special-casing the first and last pixels.
+ */
+
+typedef INT16 FSERROR; /* 16 bits should be enough */
+typedef int LOCFSERROR; /* use 'int' for calculation temps */
+
+typedef struct { byte *colorset;
+ FSERROR *fserrors;
+ } FSBUF;
+
+/* Floyd-Steinberg initialization function.
+ *
+ * It is called 'fs2_init' since it's specialized for our purpose and
+ * could be embedded in a more general FS-package.
+ *
+ * Returns a malloced FSBUF pointer which has to be passed as first
+ * parameter to subsequent 'fs2_dither' calls.
+ * The FSBUF structure does not need to be referenced by the calling
+ * application, it can be treated from the app like a void pointer.
+ *
+ * The current implementation does only require to free() this returned
+ * pointer after processing.
+ *
+ * Returns NULL if malloc fails.
+ *
+ * NOTE: The FSBUF structure is designed to allow the 'fs2_dither'
+ * function to work with an *arbitrary* number of color components
+ * at runtime! This is an enhancement over the IJG code base :-).
+ * Only fs2_init() specifies the (maximum) number of components.
+ */
+
+static FSBUF *fs2_init(width)
+int width;
+{
+ FSBUF *fs;
+ FSERROR *p;
+
+ fs = (FSBUF *)
+ malloc(sizeof(FSBUF) * 3 + ((size_t)width + 2) * sizeof(FSERROR) * 3);
+ if (fs == 0) return fs;
+
+ fs[0].colorset = screen_set[0];
+ fs[1].colorset = screen_set[1];
+ fs[2].colorset = screen_set[2];
+
+ p = (FSERROR *)(fs + 3);
+ memset(p, 0, ((size_t)width + 2) * sizeof(FSERROR) * 3);
+
+ fs[0].fserrors = p;
+ fs[1].fserrors = p + 1;
+ fs[2].fserrors = p + 2;
+
+ return fs;
+}
+
+/* Floyd-Steinberg dithering function.
+ *
+ * NOTE:
+ * (1) The image data referenced by 'ptr' is *overwritten* (input *and*
+ * output) to allow more efficient implementation.
+ * (2) Alternate FS dithering is provided by the sign of 'nc'. Pass in
+ * a negative value for right-to-left processing. The return value
+ * provides the right-signed value for subsequent calls!
+ * (3) This particular implementation assumes *no* padding between lines!
+ * Adapt this if necessary.
+ */
+
+static int fs2_dither(fs, ptr, nc, num_rows, num_cols)
+FSBUF *fs;
+byte *ptr;
+int nc, num_rows, num_cols;
+{
+ int abs_nc, ci, row, col;
+ LOCFSERROR delta, cur, belowerr, bpreverr;
+ byte *dataptr, *colsetptr;
+ FSERROR *errorptr;
+
+ if ((abs_nc = nc) < 0) abs_nc = -abs_nc;
+ for (row = 0; row < num_rows; row++) {
+ for (ci = 0; ci < abs_nc; ci++, ptr++) {
+ dataptr = ptr;
+ colsetptr = fs[ci].colorset;
+ errorptr = fs[ci].fserrors;
+ if (nc < 0) {
+ dataptr += (num_cols - 1) * abs_nc;
+ errorptr += (num_cols + 1) * abs_nc;
+ }
+ cur = belowerr = bpreverr = 0;
+ for (col = 0; col < num_cols; col++) {
+ cur += errorptr[nc];
+ cur += 8; cur >>= 4;
+ if ((cur += *dataptr) < 0) cur = 0;
+ else if (cur > 255) cur = 255;
+ *dataptr = cur & 0xff;
+ cur -= colsetptr[cur];
+ delta = cur << 1; cur += delta;
+ bpreverr += cur; cur += delta;
+ belowerr += cur; cur += delta;
+ errorptr[0] = (FSERROR)bpreverr;
+ bpreverr = belowerr;
+ belowerr = delta >> 1;
+ dataptr += nc;
+ errorptr += nc;
+ }
+ errorptr[0] = (FSERROR)bpreverr;
+ }
+ ptr += (num_cols - 1) * abs_nc;
+ nc = -nc;
+ }
+ return nc;
+}
+
+#endif /* ENABLE_FIXPIX_SMOOTH */
+
#define DO_CROP 0
#define DO_ZOOM 1
@@ -74,7 +347,7 @@
GenerateEpic(w,h);
CreateXImage();
}
-
+
/********************************************/
@@ -90,15 +363,15 @@
cp = cpic;
bperpix = (picType == PIC8) ? 1 : 3;
-
+
for (i=0; i=eWIDE || ory>=eHIGH) return;
-
+
crop1(opx, opy, opw, oph, DO_ZOOM);
}
@@ -306,15 +579,15 @@
static void compute_zoom_rect(x, y, px, py, pw, ph)
int x, y, *px, *py, *pw, *ph;
{
- /* given a mouse pos (in epic coords), return x,y,w,h PIC coords for
- a 'zoom in by 2x' rectangle to be tracked. The rectangle stays
+ /* given a mouse pos (in epic coords), return x,y,w,h PIC coords for
+ a 'zoom in by 2x' rectangle to be tracked. The rectangle stays
completely within 'pic' boundaries, and moves in 'pic' increments */
CoordE2P(x, y, px, py);
- *pw = (cWIDE+1)/2;
+ *pw = (cWIDE+1)/2;
*ph = (cHIGH+1)/2;
- *px = *px - (*pw)/2;
+ *px = *px - (*pw)/2;
*py = *py - (*ph)/2;
RANGE(*px, 0, pWIDE - *pw);
@@ -327,7 +600,7 @@
{
int x,y,w,h, x2,y2, ex,ey,ew,eh;
- /* compute a cropping rectangle (in pic coordinates) that's twice
+ /* compute a cropping rectangle (in pic coordinates) that's twice
the size of eWIDE,eHIGH, centered around eWIDE/2, eHIGH/2, but no
larger than pWIDE,PHIGH */
@@ -362,7 +635,7 @@
int i, ox,oy,offx,offy, rw,rh, px, py, dx, dy,m;
Window rW, cW; unsigned int mask; int rx, ry;
- offx = ox = mx;
+ offx = ox = mx;
offy = oy = my;
rw = eWIDE-1; rh = eHIGH-1;
m = 0;
@@ -374,50 +647,50 @@
/* track until Button2 is released */
while (1) {
- if (!XQueryPointer(theDisp, mainW, &rW, &cW, &rx, &ry,
+ if (!XQueryPointer(theDisp, mainW, &rW, &cW, &rx, &ry,
&mx, &my, &mask)) continue;
if (!(mask & ControlMask)) break; /* cancelled */
if (!(mask & Button2Mask)) break; /* button released */
-
+
if (mask & ShiftMask) { /* constrain mx,my to horiz or vertical */
if (abs(mx-offx) > abs(my-offy)) my = offy;
else mx = offx;
}
-
+
do_pan_calc(offx, offy, &mx, &my);
-
+
if (mx!=ox || my!=oy) {
- XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy,
+ XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy,
(u_int) rw, (u_int) rh);
- XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy,
+ XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy,
(u_int) rw, (u_int) rh);
ox = mx; oy = my;
}
else {
- XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy,
+ XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy,
(u_int) rw, (u_int) rh);
m = (m+1)&7;
XSetPlaneMask(theDisp, theGC, xorMasks[m]);
- XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy,
+ XDrawRectangle(theDisp, mainW, theGC, ox-offx, oy-offy,
(u_int) rw, (u_int) rh);
XFlush(theDisp);
Timer(100);
}
}
-
+
mx = ox; my = oy; /* in case mx,my changed on button release */
if (!(mask & ControlMask)) { /* cancelled */
- XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy,
+ XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy,
(u_int) rw, (u_int) rh);
XSetFunction(theDisp, theGC, GXcopy);
XSetPlaneMask(theDisp, theGC, AllPlanes);
return;
}
-
+
for (i=0; i<4; i++) {
- XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy,
+ XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy,
(u_int) rw, (u_int) rh);
XFlush(theDisp);
Timer(100);
@@ -430,7 +703,7 @@
dx = px - cXOFF; dy = py - cYOFF;
if (dx==0 && dy==0) { /* didn't pan anywhere */
- XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy,
+ XDrawRectangle(theDisp, mainW, theGC, mx-offx, my-offy,
(u_int) rw, (u_int) rh);
XSetFunction(theDisp, theGC, GXcopy);
XSetPlaneMask(theDisp, theGC, AllPlanes);
@@ -485,7 +758,7 @@
/***********************************/
void Crop()
{
- int i, x, y, w, h;
+ int x, y, w, h;
if (!HaveSelection()) return;
@@ -499,8 +772,7 @@
static void crop1(x,y,w,h,zm)
int x,y,w,h,zm;
{
- int i,j,oldew,oldeh,oldcx,oldcy;
- byte *cp, *pp;
+ int oldew,oldeh,oldcx,oldcy;
oldcx = cXOFF; oldcy = cYOFF;
oldew = eWIDE; oldeh = eHIGH;
@@ -529,7 +801,7 @@
if (cpic == pic) return; /* not cropped */
BTSetActive(&but[BUNCROP],0);
-
+
if (epicMode == EM_SMOOTH) { /* turn off smoothing */
epicMode = EM_RAW; SetEpicMode();
}
@@ -538,7 +810,7 @@
FreeEpic();
if (cpic && cpic != pic) free(cpic);
cpic = NULL;
-
+
w = (pWIDE * eWIDE) / cWIDE; h = (pHIGH * eHIGH) / cHIGH;
if (w>maxWIDE || h>maxHIGH) {
@@ -566,7 +838,7 @@
WUnCrop();
SetCropString();
}
-
+
/***********************************/
void AutoCrop()
@@ -583,7 +855,7 @@
WCrop(eWIDE, eHIGH, cXOFF-oldcx, cYOFF-oldcy);
}
}
-
+
SetCursors(-1);
}
@@ -650,7 +922,7 @@
/* do the actual cropping */
if (cleft || ctop || cbot || cright) {
- DoCrop(cXOFF+cleft, cYOFF+ctop,
+ DoCrop(cXOFF+cleft, cYOFF+ctop,
cWIDE-(cleft+cright), cHIGH-(ctop+cbot));
return 1;
}
@@ -673,7 +945,7 @@
# define NEIGHBOR 16 /* within 6% of neighboring pixels */
# define MISSPCT 6 /* and up to 6% that don't match */
# define inabsrange(a,n) ( (a) < n && (a) > -n )
-
+
if (cHIGH<3 || cWIDE<3) return 0;
@@ -739,7 +1011,7 @@
while (cleft + 1 < cWIDE) { /* see if we can delete this line */
oldr = bgR; oldg = bgG; oldb = bgB;
- for (i=0, misses=0, cp1=cp; imaxWIDE || eHIGH>maxHIGH) { /* make 'normal' size */
@@ -869,7 +1141,7 @@
double r,wr,hr;
wr = ((double) cWIDE) / maxWIDE;
hr = ((double) cHIGH) / maxHIGH;
-
+
r = (wr>hr) ? wr : hr; /* r is the max(wr,hr) */
eWIDE = (int) ((cWIDE / r) + 0.5);
eHIGH = (int) ((cHIGH / r) + 0.5);
@@ -906,12 +1178,12 @@
int dir;
{
int i;
-
+
/* dir=0: 90 degrees clockwise, else 90 degrees counter-clockwise */
WaitCursor();
-
+
RotatePic(pic, picType, &pWIDE, &pHIGH, dir);
-
+
/* rotate clipped version and modify 'clip' coords */
if (cpic != pic && cpic != NULL) {
if (!dir) {
@@ -928,7 +1200,7 @@
RotatePic(cpic, picType, &cWIDE, &cHIGH,dir);
}
else { cWIDE = pWIDE; cHIGH = pHIGH; }
-
+
/* rotate expanded version */
if (epic != cpic && epic != NULL) {
WaitCursor();
@@ -940,7 +1212,7 @@
SetISTR(ISTR_RES,"%d x %d",pWIDE,pHIGH);
SetISTR(ISTR_EXPAND, "%.5g%% x %.5g%% (%d x %d)",
- 100.0 * ((float) eWIDE) / cWIDE,
+ 100.0 * ((float) eWIDE) / cWIDE,
100.0 * ((float) eHIGH) / cHIGH, eWIDE, eHIGH);
}
@@ -951,7 +1223,7 @@
int *wp, *hp;
int ptype, dir;
{
- /* rotates a w*h array of bytes 90 deg clockwise (dir=0)
+ /* rotates a w*h array of bytes 90 deg clockwise (dir=0)
or counter-clockwise (dir != 0). swaps w and h */
byte *pic1, *pix1, *pix;
@@ -960,7 +1232,7 @@
bperpix = (ptype == PIC8) ? 1 : 3;
- w = *wp; h = *hp;
+ w = *wp; h = *hp;
pix1 = pic1 = (byte *) malloc((size_t) (w*h*bperpix));
if (!pic1) FatalError("Not enough memory to rotate!");
@@ -968,15 +1240,15 @@
if (dir==0) {
for (i=0; i=0; j--, pix1++, pix-=w)
+ for (j=h-1, pix=pic+(h-1)*w + i; j>=0; j--, pix1++, pix-=w)
*pix1 = *pix;
}
else {
int bperlin = w*bperpix;
int k;
-
- for (j=h-1, pix=pic+(h-1)*w*bperpix + i*bperpix;
- j>=0; j--, pix -= bperlin)
+
+ for (j=h-1, pix=pic+(h-1)*w*bperpix + i*bperpix;
+ j>=0; j--, pix -= bperlin)
for (k=0; k=0; i--) { /* CCW */
if (bperpix == 1) {
- for (j=0, pix=pic+i; j0) nextptr[-1] += ((err*3)/16);
@@ -1414,9 +1693,9 @@
for (j=w-1; j>=0; j--, pp--, thisptr--, nextptr--) {
if (*thisptr<128) { err = *thisptr; *pp = (byte) bval; }
else { err = *thisptr-255; *pp = (byte) wval; }
-
+
if (j>0) thisptr[-1] += ((err*7)/16);
-
+
if (i
0) nextptr[-1] += (err/16);
@@ -1449,8 +1728,8 @@
}
- if (picType == PIC8)
- theImage = Pic8ToXImage(epic, (u_int) eWIDE, (u_int) eHIGH,
+ if (picType == PIC8)
+ theImage = Pic8ToXImage(epic, (u_int) eWIDE, (u_int) eHIGH,
cols, rMap, gMap, bMap);
else if (picType == PIC24)
theImage = Pic24ToXImage(egampic, (u_int) eWIDE, (u_int) eHIGH);
@@ -1482,7 +1761,7 @@
if (!pic8) return xim; /* shouldn't happen */
- if (DEBUG > 1)
+ if (DEBUG > 1)
fprintf(stderr,"Pic8ToXImage(): creating a %dx%d Ximage, %d bits deep\n",
wide, high, dispDEEP);
@@ -1491,7 +1770,7 @@
if (dispDEEP == 1) {
byte *imagedata;
- xim = XCreateImage(theDisp, theVisual, dispDEEP, XYPixmap, 0, NULL,
+ xim = XCreateImage(theDisp, theVisual, dispDEEP, XYPixmap, 0, NULL,
wide, high, 32, 0);
if (!xim) FatalError("couldn't create xim!");
@@ -1506,11 +1785,11 @@
/* if ncols==0, do a 'black' and 'white' dither */
if (ncols == 0) {
- /* note that if dispDEEP > 8, dithpic will just have '0' and '1' instead
+ /* note that if dispDEEP > 8, dithpic will just have '0' and '1' instead
of 'black' and 'white' */
dithpic = FSDither(pic8, PIC8, (int) wide, (int) high, rmap, gmap, bmap,
- (int) ((dispDEEP <= 8) ? black : 0),
+ (int) ((dispDEEP <= 8) ? black : 0),
(int) ((dispDEEP <= 8) ? white : 1));
}
@@ -1521,14 +1800,14 @@
case 8: {
byte *imagedata, *ip, *pp;
int j, imWIDE, nullCount;
-
+
nullCount = (4 - (wide % 4)) & 0x03; /* # of padding bytes per line */
imWIDE = wide + nullCount;
-
+
/* Now create the image data - pad each scanline as necessary */
imagedata = (byte *) malloc((size_t) (imWIDE * high));
if (!imagedata) FatalError("couldn't malloc imagedata");
-
+
pp = (dithpic) ? dithpic : pic8;
for (i=0, ip=imagedata; i