WHAT THE HECK IS THIS PATCH ANYWAY: When xv began seg faulting on entry of the Schnauzer into a certain directory i thought it was time to switch from an old libc5 linked version to a glibc (libc6) linked executable. Of course, as i later learned from the xv homepage, http://www.trilon.com/xv/index.html, libc5 wasn't the problem at all. What i found at the homepage was that there were quite a few patches to the xv-3.10a.tar.gz source code package for upgrading and fixing the few bugs, like the too long file name imbroglio, of xv. So, to make a long story short, i downloaded the patches mentioned below, applied them, and, at the request of the compiler more or less, made the several changes necessary to keep the compiler quite. In the end what was left was a source code that would compile to completion against my installed libraries in particular glibc-2.1.2. Once i had xv compiling to completion i did a diff against the xv-3.10a.tar.gz package's provided source code and that is how this patch, less these and the following comments of course, was generated. TO APPLY ALL OF THE PATCHES THAT I APPLIED ALL YOU HAVE TO DO IS APPLY THIS ONE PATCH FILE. Remember to read the Makefile and config.h for information on setting up the packabge for your particular system. Use the following patch line from the parent of the xv-3.10a directory which was created when you un-tar'ed the xv-3.10a.tar.gz file: patch -p0 < xv-3.10a.patch.linux HOW I APPLIED THE INDIVIDUAL PATCHES: #Created a directory 'xv' and placed all tar files and #patches into it. Changed into directory 'xv': mkdir xv cd xv #Untarred xv-3.10a.tar.gz which created the directory #'xv-3.10a' into which the source code files and associated #sub-directories of xv-3.10a.tar.gz were placed: tar -zxf xv-3.10a.tar.gz #Created a sub-directory in directory 'xv', the current #directory, called 'png'. #Changed to directory 'png' and there untarred #xv-3.10a-png-1.2d.tar.gz. mkdir png cd png tar -zxf ../xv-3.10a-png-1.2d.tar.gz #Applying the png patches consist of moving two files #and patching in the *.diff files to the xv-3.10a directory. #Since the creation date of the xv-3.10a.JPEG-patch is #later than xvjpeg.diff's, and they both appear to change #the same code, i didn't apply xvjpeg.diff. mv xvpng.c ../xv-3.10a mv bits/br_png ../xv-3.10a/bits patch -p1 -d ../xv-3.10a < xvpng.diff patch -p1 -d ../xv-3.10a < xcmap.diff #From the xv directory applied: cd .. patch -d xv-3.10a < xvpng-fix2.patch patch -d xv-3.10a < xv-3.10a.JPEG-patch patch -d xv-3.10a < mp-tiff-patch patch -d xv-3.10a < xv-3.10a.TIFF-patch # png/xvtiff.diff # Had to hand patch xvtiff.diff into # xv-3.10a/xvtiff.c because all of its # hunks failed. Probably due to the # changes by the other patches. patch -d xv-3.10a < xpm.patch # this patch failed but the bug that it was # correcting was fixed when the patch in # png/xvpng.diff was applied above. patch -d xv-3.10a < deepcolor.patch patch -d xv-3.10a < exceed_grab_patch.txt # This patch failed so i hand patched the two # files xvgrab.c and xvxwd.c. I wasn't able to # disearn why the patch failed. patch -d xv-3.10a < gifpatch patch -d xv-3.10a < grabpatch patch -d xv-3.10a < longname.patch # This patch succeeded but generated offset # messages. Some of the messages probably occur # due to the other patches changing the files. FILES I CHANGED AFTER PATCHES WERE APPLIED: xv-3.10a/Makefile Modified to use installed libs of jpeg and tiff. Comments on what i did. xv-3.10a/cleandir Changed to run on sh shell which is really bash for me. xv-3.10a/config.h What was neccessary for my system. xv-3.10a/tiff/Makefile May have added -DBSDTYPES to 'CFLAGS='. Its there and i couldn't find it in the patches so it could be mine. xv-3.10a/tiff/RANLIB.csh Changed to run on sh shell. xv-3.10a/vdcomp.c Change the use of the 'gets' function to the 'fgets' function. xv-3.10a/xv.h Implemented Assen Totin's patch for Redhat by testing if __GLIBC__ is defined. Added same type of test when defining ERRSTR and USE_GETCWD. xv-3.10a/xvjpeg.c METHODDEF had to be re-defined due to a conflict with the 'define' in jpeg/jmorecfg.h file. The definition in jmorecfg.h was inconsistant with the needed definition here. xv-3.10a/xvtiff.c Had to add cast '(xvtileContigRoutine)' to overcome compilation error on line 1760. Line number was after all patches had been applied. diff -r -c -P xv-3.10a_before_patch/Makefile xv-3.10a/Makefile *** xv-3.10a_before_patch/Makefile Mon Jan 23 15:20:54 1995 --- xv-3.10a/Makefile Thu Feb 24 12:05:30 2000 *************** *** 1,8 **** # Makefile for xv # your C compiler (and options) of choice ! CC = cc ! # CC = gcc -ansi # use this if you're using 'cc' on a DEC Alpha (OSF/1) or MIPS (Ultrix) system: # CC = cc -std1 -Olimit 750 --- 1,51 ---- # Makefile for xv + #**** + #**** My comments in this file begin with #**** . + #**** + #**** READ ALL OF THE COMMENTS IN THIS FILE AND config.h to + #**** insure that this file is configured for your system. + #**** + #**** Although xv compiled to completion on my system your milage + #**** may vary. Its in your best interest to know what is said here. + #**** + #**** This Makefile is derived from the Makefile that comes with + #**** the xv-3.10a.tar.gz. The changes allowed compilation of xv-3.10a, + #**** plus most of the patches, against the installed jpeg, tiff, + #**** png and zlib libraries on my system. Following are the + #**** versions of the above mentioned libraries installed on my system + #**** at the time of compilation: + #**** + #**** libjpeg.so.62.0.0 + #**** libtiff.so.3.4.037 + #**** libpng.so.2.1.0.3 + #**** libz.so.1.1.3 + #**** + #**** If you decide to use both the jpeg and tiff libraries + #**** included with the xv-3.10a.tar.gz package then just restore + #**** the original lines that i commented out. + #**** + #**** However, my experience with compiling against my installed tiff + #**** library while still using the xv-3.10a's jpeg library, as + #**** compiled by the original Makefile lines, was that in addition + #**** to my installed tiff library my installed jpeg library + #**** was also used for linking in the xv executable. This was + #**** fortuitious for me since my intent was to use my installed libraries. + #**** If you are going to mix and match the package included tiff and + #**** jpeg libraries with your installed libraries then you'll + #**** have to adjust the values and order of appearance on the + #**** compilation line of the -I and -L options. + #**** At least that's what i think you have to do. :-) + #**** + #**** The compiler i used was gcc 2.95.2 and the c library was + #**** glibc 2.1.2. + #**** + #**** pbj 2-18-2000 + #**** + # your C compiler (and options) of choice ! # CC = cc ! CC = gcc -ansi # use this if you're using 'cc' on a DEC Alpha (OSF/1) or MIPS (Ultrix) system: # CC = cc -std1 -Olimit 750 *************** *** 45,71 **** ### if, for whatever reason, you're unable to get the JPEG library to compile ### on your machine, *COMMENT OUT* the following lines ### 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 ### ### if, for whatever reason, you're unable to get the TIFF 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)' ) ! ### ### if, for whatever reason, you're unable to get the PDS/VICAR support --- 88,166 ---- ### if, for whatever reason, you're unable to get the JPEG library to compile ### on your machine, *COMMENT OUT* the following lines ### + #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 + + #**** + #**** The above JPEG* lines are used to compile the jpeg package that + #**** is included with xv-3.10a.tar.gz and are uncommented in the + #**** original Makefile. + #**** My JPEG* lines, to use already installed libraries, + #**** were added to this file + #**** + #**** To use the included jpeg package comment out my + #**** lines and uncomment the above JPEG* lines plus + #**** the lines for the rules for "all:" and "xv:" below. + #**** JPEG = -DDOJPEG ! JPEGDIR = ! JPEGINC = -I/usr/local/include ! JPEGLIB = -L/usr/local/lib ! ! ! ! ! ### ! ### if, for whatever reason, you're unable to get the PNG library to compile ! ### on your machine, *COMMENT OUT* the following lines ! ### ! PNG = -DDOPNG ! PNGDIR = /usr/local/lib ! PNGINC = -I$(PNGDIR) ! PNGLIB = -L$(PNGDIR) -lpng ! ! ! ### ! ### if, for whatever reason, you're unable to get the PNG library to compile ! ### on your machine, *COMMENT OUT* the following lines ! ### ! ZLIBDIR = /usr/local/lib ! ZLIBINC = -I$(ZLIBDIR) ! ZLIBLIB = -L$(ZLIBDIR) -lz ### ### if, for whatever reason, you're unable to get the TIFF 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)' ) + + #**** + #**** The above TIFF* lines are used to compile the tiff package that + #**** is included with xv-3.10a.tar.gz and are uncommented in the + #**** original Makefile. + #**** My TIFF* lines, to use already installed libraries, + #**** were added to this file + #**** + #**** To use the included jpeg package comment out my + #**** lines and uncomment the above TIFF* lines plus + #**** the lines for the rules for "all:" and "xv:" below. + #**** TIFF = -DDOTIFF ! TIFFDIR = ! TIFFINC = -I/usr/local/include ! TIFFLIB = -L/usr/local/lib -ltiff ### ### if, for whatever reason, you're unable to get the PDS/VICAR support *************** *** 102,108 **** ### for LINUX, uncomment the following line ! #MCHN = -DLINUX # For SCO 1.1 (UNIX 3.2v2) machines, uncomment the following: --- 197,203 ---- ### for LINUX, uncomment the following line ! MCHN = -DLINUX -DBSDTYPES -L/usr/X11R6/lib # For SCO 1.1 (UNIX 3.2v2) machines, uncomment the following: *************** *** 186,194 **** CFLAGS = $(CCOPTS) $(JPEG) $(JPEGINC) $(TIFF) $(TIFFINC) $(PDS) \ $(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \ ! $(DXWM) $(MCHN) ! LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) -lm 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 \ --- 281,289 ---- CFLAGS = $(CCOPTS) $(JPEG) $(JPEGINC) $(TIFF) $(TIFFINC) $(PDS) \ $(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \ ! $(DXWM) $(MCHN) $(PNG) $(PNGINC) $(ZLIBINC) ! LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) $(PNGLIB) $(ZLIBLIB) -lm 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,202 **** 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 MISC = README INSTALL CHANGELOG IDEAS --- 291,297 ---- 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 xvpng.o MISC = README INSTALL CHANGELOG IDEAS *************** *** 205,215 **** .c.o: ; $(CC) $(CFLAGS) -c $*.c ! all: $(JPEGLIB) $(TIFFLIB) xv bggen vdcomp xcmap xvpictoppm ! ! ! xv: $(OBJS) $(JPEGLIB) $(TIFFLIB) $(CC) -o xv $(CFLAGS) $(OBJS) $(LIBS) bggen: bggen.c --- 300,323 ---- .c.o: ; $(CC) $(CFLAGS) -c $*.c + #**** This commented 'all:' line is the original + #**** used to compile the jpeg and tiff + #**** packages includeded with the xv source. + #**** + #**** all: $(JPEGLIB) $(TIFFLIB) xv bggen vdcomp xcmap xvpictoppm + #**** + + all: xv bggen vdcomp xcmap xvpictoppm + + + #**** This commented 'xv:' line is the original + #**** used to compile the jpeg and tiff + #**** packages includeded with the xv source. + #**** + #**** xv: $(OBJS) $(JPEGLIB) $(TIFFLIB) + #**** ! xv: $(OBJS) $(CC) -o xv $(CFLAGS) $(OBJS) $(LIBS) bggen: bggen.c *************** *** 267,273 **** 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_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 --- 375,381 ---- 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_trash bits/fcurs bits/fccurs bits/fdcurs bits/fcursm ! xvbrowse.o: bits/br_xwd bits/br_png 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 diff -r -c -P xv-3.10a_before_patch/Makefile.std xv-3.10a/Makefile.std *** xv-3.10a_before_patch/Makefile.std Mon Jan 23 20:06:26 1995 --- xv-3.10a/Makefile.std Thu Feb 24 12:05:30 2000 *************** *** 56,61 **** --- 56,80 ---- ### + ### if, for whatever reason, you're unable to get the PNG library to compile + ### on your machine, *COMMENT OUT* the following lines + ### + PNG = -DDOPNG + PNGDIR = /usr/local/src/libpng + PNGINC = -I$(PNGDIR) + PNGLIB = -L$(PNGDIR) -lpng + + + ### + ### if, for whatever reason, you're unable to get the PNG library to compile + ### on your machine, *COMMENT OUT* the following lines + ### + ZLIBDIR = /usr/local/src/zlib + ZLIBINC = -I$(ZLIBDIR) + ZLIBLIB = -L$(ZLIBDIR) -lz + + + ### ### if, for whatever reason, you're unable to get the TIFF library to compile ### on your machine, *COMMENT OUT* the following lines ### *************** *** 186,194 **** CFLAGS = $(CCOPTS) $(JPEG) $(JPEGINC) $(TIFF) $(TIFFINC) $(PDS) \ $(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \ ! $(DXWM) $(MCHN) ! LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) -lm 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 \ --- 205,213 ---- CFLAGS = $(CCOPTS) $(JPEG) $(JPEGINC) $(TIFF) $(TIFFINC) $(PDS) \ $(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \ ! $(DXWM) $(MCHN) $(PNG) $(PNGINC) $(ZLIBINC) ! LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) $(PNGLIB) $(ZLIBLIB) -lm 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,202 **** 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 MISC = README INSTALL CHANGELOG IDEAS --- 215,221 ---- 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 xvpng.o MISC = README INSTALL CHANGELOG IDEAS *************** *** 267,273 **** 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_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 --- 286,292 ---- 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_trash bits/fcurs bits/fccurs bits/fdcurs bits/fcursm ! xvbrowse.o: bits/br_xwd bits/br_png 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 diff -r -c -P xv-3.10a_before_patch/bits/br_png xv-3.10a/bits/br_png *** xv-3.10a_before_patch/bits/br_png Wed Dec 31 19:00:00 1969 --- xv-3.10a/bits/br_png Thu Feb 24 12:05:30 2000 *************** *** 0 **** --- 1,28 ---- + #define br_png_width 48 + #define br_png_height 48 + static unsigned char br_png_bits[] = { + 0xe0, 0xff, 0xff, 0xff, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x09, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x81, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0xff, 0x03, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0xf8, 0x19, 0xc3, 0x07, 0x02, 0x20, 0x18, 0x3b, 0x63, 0x0c, 0x02, + 0x20, 0x18, 0x3b, 0x33, 0x00, 0x02, 0x20, 0x18, 0x5b, 0x33, 0x00, 0x02, + 0x20, 0xf8, 0x59, 0x33, 0x0f, 0x02, 0x20, 0x18, 0x98, 0x33, 0x0c, 0x02, + 0x20, 0x18, 0x98, 0x33, 0x0c, 0x02, 0x20, 0x18, 0x18, 0x63, 0x0c, 0x02, + 0x20, 0x18, 0x18, 0xc3, 0x0b, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0xff, 0xff, 0xff, 0x3f, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x03, + }; diff -r -c -P xv-3.10a_before_patch/cleandir xv-3.10a/cleandir *** xv-3.10a_before_patch/cleandir Thu Dec 22 17:34:50 1994 --- xv-3.10a/cleandir Thu Feb 24 12:05:30 2000 *************** *** 1,9 **** ! #!/bin/csh -f # cleandir: if called with an argument, cd's there and does a 'make clean' # ! if ( x$1 != x ) then echo "cleaning $1 subdirectory" cd $1 make clean ! endif --- 1,9 ---- ! #!/bin/sh -f # cleandir: if called with an argument, cd's there and does a 'make clean' # ! if [ x$1 != x ]; then echo "cleaning $1 subdirectory" cd $1 make clean ! fi diff -r -c -P xv-3.10a_before_patch/config.h xv-3.10a/config.h *** xv-3.10a_before_patch/config.h Thu Jan 5 13:49:21 1995 --- xv-3.10a/config.h Thu Feb 24 12:05:30 2000 *************** *** 13,25 **** * definition appropriately. (use 'which gunzip' to find if you have gunzip, * and where it lives) */ ! #undef USE_GUNZIP #ifdef USE_GUNZIP # ifdef VMS # define GUNZIP "UNCOMPRESS" # else ! # define GUNZIP "/usr/local/bin/gunzip -q" # endif #endif --- 13,25 ---- * definition appropriately. (use 'which gunzip' to find if you have gunzip, * and where it lives) */ ! #define USE_GUNZIP #ifdef USE_GUNZIP # ifdef VMS # define GUNZIP "UNCOMPRESS" # else ! # define GUNZIP "/bin/gunzip -q" # endif #endif *************** *** 88,94 **** * should not need to be changed */ ! /* #define GS_PATH "/usr/local/bin/gs" */ /* #define GS_LIB "." */ /* #define GS_DEV "ppmraw" */ --- 88,94 ---- * should not need to be changed */ ! #define GS_PATH "/usr/local/bin/gs" /* #define GS_LIB "." */ /* #define GS_DEV "ppmraw" */ diff -r -c -P xv-3.10a_before_patch/tiff/Makefile xv-3.10a/tiff/Makefile *** xv-3.10a_before_patch/tiff/Makefile Thu Dec 22 17:35:12 1994 --- xv-3.10a/tiff/Makefile Thu Feb 24 12:05:30 2000 *************** *** 36,42 **** IPATH= -I. COPTS= -O ! CFLAGS= ${COPTS} ${IPATH} INCS= tiff.h tiffio.h --- 36,42 ---- IPATH= -I. COPTS= -O ! CFLAGS= -DBSDTYPES ${COPTS} ${IPATH} INCS= tiff.h tiffio.h diff -r -c -P xv-3.10a_before_patch/tiff/RANLIB.csh xv-3.10a/tiff/RANLIB.csh *** xv-3.10a_before_patch/tiff/RANLIB.csh Thu Dec 22 17:35:17 1994 --- xv-3.10a/tiff/RANLIB.csh Thu Feb 24 12:05:30 2000 *************** *** 1,4 **** ! #!/bin/csh -f # # tests to see if the program 'ranlib' exists. If it does, runs ranlib on # the first argument (a library name). Otherwise, does nothing, and returns --- 1,4 ---- ! #!/bin/sh -f # # tests to see if the program 'ranlib' exists. If it does, runs ranlib on # the first argument (a library name). Otherwise, does nothing, and returns *************** *** 10,21 **** echo "executing 'ranlib $1'..." # Is there a ranlib? Let's try and then suffer the consequences... ! set haveranlib = `ranlib $1 >& /dev/null` ! if ( $status ) then echo "There doesn't seem to be a ranlib on this system..." echo "Don't worry about it." ! endif echo "" echo "" --- 10,22 ---- echo "executing 'ranlib $1'..." # Is there a ranlib? Let's try and then suffer the consequences... ! # set haveranlib = `ranlib $1 >& /dev/null` ! ranlib $1 >& /dev/null ! if [ $? -ne 0 ]; then echo "There doesn't seem to be a ranlib on this system..." echo "Don't worry about it." ! fi echo "" echo "" diff -r -c -P xv-3.10a_before_patch/vdcomp.c xv-3.10a/vdcomp.c *** xv-3.10a_before_patch/vdcomp.c Thu Dec 22 17:34:47 1994 --- xv-3.10a/vdcomp.c Thu Feb 24 12:05:49 2000 *************** *** 95,100 **** --- 95,102 ---- #include #include + #include + #include /* include a malloc.h, of some sort... */ #ifndef VMS /* VMS hates multi-line '#if's */ *************** *** 429,438 **** { short shortint; typedef long off_t; if (inname[0] == ' ') { printf("\nEnter name of file to be decompressed: "); ! gets (inname); } if (host == 1 | host == 2) { --- 431,480 ---- { short shortint; typedef long off_t; + char *first_newline; + char *first_nullchar; if (inname[0] == ' ') { printf("\nEnter name of file to be decompressed: "); ! ! /*********************************************************/ ! /* The fgets function has certain quirks with '\0' */ ! /* and the return of NULL from a read attempt that */ ! /* had to be taken into account to use it safely. */ ! /*********************************************************/ ! if ( fgets(inname, 1024, stdin) == NULL ) { ! if ( feof(stdin) ) { ! /*****************************************************************/ ! /* If EOF encountered when reading name of file to decompresse */ ! /* assume it means file redirected to stdin is at EOF. */ ! /*****************************************************************/ ! printf("\n"); ! exit(0); ! } ! if ( ferror(stdin) ) { ! perror("Error occurred trying to read file name to be decompressed"); ! exit(1); ! } ! } ! first_newline = strchr( inname, '\n'); ! first_nullchar = strchr( inname, '\0'); ! if ( first_newline == (first_nullchar - 1) ) { ! *first_newline = '\0'; ! } ! else if ( first_newline > first_nullchar ) { ! printf("\nName of file to decompresse contains a null character.\n"); ! exit(1); ! } ! else if ( first_newline == NULL ) { ! if ( feof(stdin) ) ! printf("\nName of file to decompresse" ! " terminated by end of file not a newline.\n" ); ! else ! printf("\nName of file to decompresse too long" ! " for this program\n"); ! ! exit(1); ! } } if (host == 1 | host == 2) { *************** *** 474,486 **** printf("\n 3. VICAR format."); printf("\n 4. Unlabelled binary array.\n"); printf("\n Enter format number:"); ! gets(inname); output_format = atoi(inname); } while (output_format < 1 || output_format > 4); if (outname[0] == ' ') { printf("\nEnter name of uncompressed output file: "); ! gets (outname); } return(host); --- 516,586 ---- printf("\n 3. VICAR format."); printf("\n 4. Unlabelled binary array.\n"); printf("\n Enter format number:"); ! if ( fgets(inname, 1024, stdin) == NULL ) { ! if ( feof(stdin) ) { ! printf("\nEnd of file while selecting output format. \n"); ! exit(1); ! } ! if ( ferror(stdin) ) { ! perror("Error occurred while selecting output format. "); ! exit(1); ! } ! } ! first_newline = strchr( inname, '\n'); ! first_nullchar = strchr( inname, '\0'); ! if ( first_newline == (first_nullchar - 1) ) { ! *first_newline = '\0'; ! } ! else if ( first_newline > first_nullchar ) { ! printf("\nNull character detected in selection " ! "of output format.\n"); ! exit(1); ! } ! else if ( first_newline == NULL ) { ! if ( feof(stdin) ) ! printf("\nSelection of output format" ! " terminated by end of file not a newline.\n" ); ! else ! printf("\nLine containing selection of output format is" ! " too long for this program\n"); ! ! exit(1); ! } output_format = atoi(inname); } while (output_format < 1 || output_format > 4); if (outname[0] == ' ') { printf("\nEnter name of uncompressed output file: "); ! if ( fgets(outname, 1024, stdin) == NULL ) { ! if ( feof(stdin) ) { ! printf("\nEnd of file instead of name of output file. \n"); ! exit(1); ! } ! if ( ferror(stdin) ) { ! perror("Error reading name to use for uncompressed output file.\n"); ! exit(1); ! } ! } ! first_newline = strchr( outname, '\n'); ! first_nullchar = strchr( outname, '\0'); ! if ( first_newline == (first_nullchar - 1) ) { ! *first_newline = '\0'; ! } ! else if ( first_newline > first_nullchar ) { ! printf("\nName of uncompressed output file" ! " contains a null character.\n"); ! exit(1); ! } ! else if ( first_newline == NULL ) { ! if ( feof(stdin) ) ! printf("\nName of uncompressed output file" ! " terminated by end of file not a newline.\n" ); ! else ! printf("\nName of uncompressed output file too long" ! " for this program\n"); ! ! exit(1); ! } } return(host); diff -r -c -P xv-3.10a_before_patch/xcmap.c xv-3.10a/xcmap.c *** xv-3.10a_before_patch/xcmap.c Tue Jan 3 16:14:52 1995 --- xv-3.10a/xcmap.c Thu Feb 24 12:05:30 2000 *************** *** 140,147 **** nxcells = nycells = 8; else if (dispcells>4) nxcells = nycells = 4; ! else nxcells = nycells = 2; /**************** Create/Open X Resources ***************/ if ((mfinfo = XLoadQueryFont(theDisp,FONT))==NULL) { --- 140,152 ---- nxcells = nycells = 8; else if (dispcells>4) nxcells = nycells = 4; ! else if (dispcells>2) nxcells = nycells = 2; + else + { + nxcells = 2; + nycells = 1; + } /**************** Create/Open X Resources ***************/ if ((mfinfo = XLoadQueryFont(theDisp,FONT))==NULL) { *************** *** 267,284 **** x=y=w=h=1; 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); hints.x=x; hints.y=y; hints.width = WIDE; hints.height = HIGH; --- 272,296 ---- x=y=w=h=1; i=XParseGeometry(geom,&x,&y,&w,&h); ! 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; diff -r -c -P xv-3.10a_before_patch/xv.c xv-3.10a/xv.c *** xv-3.10a_before_patch/xv.c Thu Jan 19 13:08:43 1995 --- xv-3.10a/xv.c Thu Feb 24 12:05:30 2000 *************** *** 277,282 **** --- 277,286 ---- tiffW = (Window) NULL; tiffUp = 0; #endif + #ifdef HAVE_PNG + pngW = (Window) NULL; pngUp = 0; + #endif + imap = ctrlmap = gmap = browmap = cmtmap = 0; ch_offx = ch_offy = p_offx = p_offy = 0; *************** *** 782,787 **** --- 786,795 ---- XSetTransientForHint(theDisp, tiffW, dirW); #endif + #ifdef HAVE_PNG + CreatePNGW(); + XSetTransientForHint(theDisp, pngW, dirW); + #endif LoadFishCursors(); SetCursors(-1); *************** *** 2611,2616 **** --- 2619,2629 ---- (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 else if (strncmp((char *) magicno, "NJPL1I00", (size_t) 8)==0 || strncmp((char *) magicno+2,"NJPL1I", (size_t) 6)==0 || *************** *** 2668,2674 **** #endif #ifdef HAVE_TIFF ! case RFT_TIFF: rv = LoadTIFF (fname, pinfo); break; #endif #ifdef HAVE_PDS --- 2681,2691 ---- #endif #ifdef HAVE_TIFF ! 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 diff -r -c -P xv-3.10a_before_patch/xv.h xv-3.10a/xv.h *** xv-3.10a_before_patch/xv.h Mon Jan 23 15:22:23 1995 --- xv-3.10a/xv.h Thu Feb 24 12:05:30 2000 *************** *** 8,15 **** #include "config.h" ! #define REVDATE "Version 3.10a Rev: 12/29/94" ! #define VERSTR "3.10a" /* * uncomment the following, and modify for your site, but only if you've --- 8,15 ---- #include "config.h" ! #define REVDATE "Version 3.10a Rev: 12/29/94 (PNG patch 1.2)" ! #define VERSTR "3.10a(PNG)" /* * uncomment the following, and modify for your site, but only if you've *************** *** 115,129 **** #ifndef VMS # include extern int errno; /* SHOULD be in errno.h, but often isn't */ ! # ifndef __NetBSD__ ! extern char *sys_errlist[]; /* this too... */ # endif #endif /* not everyone has the strerror() function, or so I'm told */ #ifndef VMS ! # define ERRSTR(x) sys_errlist[x] #else # define ERRSTR(x) strerror(x, vaxc$errno) #endif --- 115,134 ---- #ifndef VMS # include extern int errno; /* SHOULD be in errno.h, but often isn't */ ! # if !defined(__NetBSD__) && !defined(__GLIBC__) ! extern char *sys_errlist[]; this too... # endif #endif /* not everyone has the strerror() function, or so I'm told */ + #ifndef VMS ! # ifdef __GLIBC__ ! # define ERRSTR(x) strerror(x) /* pj altered 2-1-2000 */ ! # else ! # define ERRSTR(x) sys_errlist[x] ! # endif #else # define ERRSTR(x) strerror(x, vaxc$errno) #endif *************** *** 308,314 **** #ifndef VMS /* VMS hates multi-line definitions */ # if defined(SVR4) || defined(SYSV) || defined(sco) || \ ! defined(XENIX) || defined(__osf__) # undef USE_GETCWD # define USE_GETCWD /* use 'getcwd()' instead of 'getwd()' */ # endif --- 313,319 ---- #ifndef VMS /* VMS hates multi-line definitions */ # if defined(SVR4) || defined(SYSV) || defined(sco) || \ ! defined(XENIX) || defined(__osf__) || defined(__GLIBC__) /* pbj */ # undef USE_GETCWD # define USE_GETCWD /* use 'getcwd()' instead of 'getwd()' */ # endif *************** *** 327,332 **** --- 332,341 ---- #define HAVE_TIFF #endif + #ifdef DOPNG + #define HAVE_PNG + #endif + #ifdef DOPDS #define HAVE_PDS #endif *************** *** 458,481 **** #define F_TIFINC 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 */ --- 467,497 ---- #define F_TIFINC 0 #endif + #ifdef HAVE_PNG + #define F_PNGINC 1 + #else + #define F_PNGINC 0 + #endif + #define F_GIF 0 #define F_JPEG ( 0 + F_JPGINC) #define F_TIFF ( 0 + F_JPGINC + F_TIFINC) ! #define F_PNG ( 0 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_PS ( 1 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_PBMRAW ( 2 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_PBMASCII ( 3 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_XBM ( 4 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_XPM ( 5 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_BMP ( 6 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_SUNRAS ( 7 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_IRIS ( 8 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_TARGA ( 9 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_FITS (10 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_PM (11 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_DELIM1 (12 + F_JPGINC + F_TIFINC + F_PNGINC) /* ----- */ ! #define F_FILELIST (13 + F_JPGINC + F_TIFINC + F_PNGINC) ! #define F_MAXFMTS (14 + F_JPGINC + F_TIFINC + F_PNGINC) /* 17, normally */ *************** *** 505,510 **** --- 521,527 ---- #define RFT_XPM 17 #define RFT_XWD 18 #define RFT_FITS 19 + #define RFT_PNG 20 /* definitions for page up/down, arrow up/down list control */ #define LS_PAGEUP 0 *************** *** 765,773 **** 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 */ u_long fg,bg,hi,lo; /* colors */ --- 782,791 ---- typedef struct { Window win; /* window ID */ int x,y,w,h; /* window coords in parent */ int active; /* true if can do anything*/ ! 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 */ char *title; /* title for this guage */ char *units; /* string appended to value */ u_long fg,bg,hi,lo; /* colors */ *************** *** 1154,1159 **** --- 1172,1184 ---- #endif + #ifdef HAVE_PNG + /* stuff used for 'png' box */ + WHERE Window pngW; + WHERE int pngUp; /* is pngW mapped, or what? */ + #endif + + #undef WHERE *************** *** 1248,1253 **** --- 1273,1279 ---- void xv_getwd PARM((char *, size_t)); char *xv_strstr PARM((char *, char *)); FILE *xv_fopen PARM((char *, char *)); + void xv_mktemp PARM((char *, char *)); void Timer PARM((int)); /*************************** XVCOLOR.C ***************************/ *************** *** 1465,1476 **** /*************************** 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 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)); --- 1491,1502 ---- /*************************** XVDIAL.C ***************************/ ! void DCreate PARM((DIAL *, Window, int, int, int, int, double, ! double, double, double, double, u_long, ! u_long, u_long, u_long, char *, 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)); *************** *** 1607,1617 **** void JPEGSaveParams PARM((char *, int)); /**************************** XVTIFF.C ***************************/ ! int LoadTIFF PARM((char *, PICINFO *)); void CreateTIFFW PARM((void)); void TIFFDialog PARM((int)); int TIFFCheckEvent PARM((XEvent *)); void TIFFSaveParams PARM((char *, int)); /**************************** XVPDS.C ***************************/ int LoadPDS PARM((char *, PICINFO *)); --- 1633,1650 ---- void JPEGSaveParams PARM((char *, 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)); + + /**************************** XVPNG.C ***************************/ + int LoadPNG PARM((char *, PICINFO *)); + void CreatePNGW PARM((void)); + void PNGDialog PARM((int)); + int PNGCheckEvent PARM((XEvent *)); + void PNGSaveParams PARM((char *, int)); /**************************** XVPDS.C ***************************/ int LoadPDS PARM((char *, PICINFO *)); diff -r -c -P xv-3.10a_before_patch/xvbrowse.c xv-3.10a/xvbrowse.c *** xv-3.10a_before_patch/xvbrowse.c Thu Jan 19 12:49:17 1995 --- xv-3.10a/xvbrowse.c Thu Feb 24 12:05:31 2000 *************** *** 55,60 **** --- 55,61 ---- #include "bits/br_xpm" #include "bits/br_xwd" #include "bits/br_fits" + #include "bits/br_png" #include "bits/br_trash" #include "bits/fcurs" *************** *** 94,100 **** #define BF_XPM 25 #define BF_XWD 26 #define BF_FITS 27 ! #define BF_MAX 28 /* # of built-in icons */ #define ISLOADABLE(ftyp) (ftyp!=BF_DIR && ftyp!=BF_CHR && ftyp!=BF_BLK && \ ftyp!=BF_SOCK && ftyp!=BF_FIFO) --- 95,102 ---- #define BF_XPM 25 #define BF_XWD 26 #define BF_FITS 27 ! #define BF_PNG 28 ! #define BF_MAX 29 /* # of built-in icons */ #define ISLOADABLE(ftyp) (ftyp!=BF_DIR && ftyp!=BF_CHR && ftyp!=BF_BLK && \ ftyp!=BF_SOCK && ftyp!=BF_FIFO) *************** *** 524,529 **** --- 526,532 ---- 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_PNG]=MakePix1(br->win,br_png_bits,br_png_width,br_png_height); /* check that they all got built */ *************** *** 956,961 **** --- 959,965 ---- char *str; { strncpy(br->dispstr, str, (size_t) 256); + br->dispstr[255] = '\0'; drawBrowStr(br); XFlush(theDisp); } *************** *** 1490,1495 **** --- 1494,1500 ---- if (StringWidth(str) > ISPACE_WIDE-6) { int dotpos; strncpy(tmpstr, str, (size_t) 56); + tmpstr[56] = '\0'; /* MR: otherwise it dies on long file names */ dotpos = strlen(tmpstr); strcat(tmpstr,"..."); *************** *** 1505,1511 **** nstr = tmpstr; } else nstr = str; ! /* draw the title */ sw = StringWidth(nstr); --- 1510,1516 ---- nstr = tmpstr; } else nstr = str; ! /* draw the title */ sw = StringWidth(nstr); *************** *** 3020,3025 **** --- 3025,3031 ---- 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; } } } *************** *** 3567,3572 **** --- 3573,3579 ---- 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; default: strcat(str,"file of unknown type"); break; } diff -r -c -P xv-3.10a_before_patch/xvdial.c xv-3.10a/xvdial.c *** xv-3.10a_before_patch/xvdial.c Tue Jan 3 16:20:31 1995 --- xv-3.10a/xvdial.c Thu Feb 24 12:05:31 2000 *************** *** 41,60 **** /* 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 *)); /***************************************************/ ! void DCreate(dp, parent, x, y, w, h, minv, maxv, curv, 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; { --- 41,61 ---- /* 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 double computeDialVal PARM((DIAL *, int, int)); ! static void dimDial PARM((DIAL *)); /***************************************************/ ! 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; ! double minv,maxv,curv,inc,page; unsigned long fg,bg,hi,lo; char *title, *units; { *************** *** 98,115 **** 1,fg,bg); if (!dp->win) FatalError("can't create dial window"); ! DSetRange(dp, minv, maxv, curv, page); XSelectInput(theDisp, dp->win, ExposureMask | ButtonPressMask); } /***************************************************/ ! void DSetRange(dp, minv, maxv, curv, page) ! DIAL *dp; ! int minv, maxv, curv, page; { if (maxvmin = minv; dp->max = maxv; dp->page = page; dp->active = (minv < maxv); DSetVal(dp, curv); --- 99,116 ---- 1,fg,bg); if (!dp->win) FatalError("can't create dial window"); ! DSetRange(dp, minv, maxv, curv, inc, page); XSelectInput(theDisp, dp->win, ExposureMask | ButtonPressMask); } /***************************************************/ ! void DSetRange(dp, minv, maxv, curv, inc, page) ! DIAL *dp; ! double minv, maxv, curv, inc, page; { if (maxvmin = minv; dp->max = maxv; dp->inc = inc; dp->page = page; dp->active = (minv < maxv); DSetVal(dp, curv); *************** *** 118,125 **** /***************************************************/ void DSetVal(dp, curv) ! DIAL *dp; ! int curv; { RANGE(curv, dp->min, dp->max); /* make sure curv is in-range */ --- 119,126 ---- /***************************************************/ void DSetVal(dp, curv) ! DIAL *dp; ! double curv; { RANGE(curv, dp->min, dp->max); /* make sure curv is in-range */ *************** *** 129,135 **** XSetForeground(theDisp, theGC, dp->bg); drawArrow(dp); ! dp->val = curv; /* draw new arrow and string */ XSetForeground(theDisp, theGC, dp->fg); --- 130,136 ---- XSetForeground(theDisp, theGC, dp->bg); drawArrow(dp); ! 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); *************** *** 202,208 **** int mx,my; { Window rW,cW; ! int rx,ry, x,y, ipos, pos, lit, i, origval; unsigned int mask; lit = 0; --- 203,210 ---- int mx,my; { Window rW,cW; ! int rx, ry, x, y, ipos, pos, lit; ! double origval; unsigned int mask; lit = 0; *************** *** 224,232 **** if (ipos != INDIAL) { drawButt(dp, ipos, 1); switch (ipos) { ! case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+1); 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 INCCW2: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->page); break; } if (dp->drawobj != NULL) (dp->drawobj)(); --- 226,234 ---- if (ipos != INDIAL) { drawButt(dp, ipos, 1); switch (ipos) { ! 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-dp->inc); break; case INCCW2: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->page); break; } if (dp->drawobj != NULL) (dp->drawobj)(); *************** *** 235,242 **** } else { ! i = computeDialVal(dp, mx, my); ! DSetVal(dp, i); if (dp->drawobj != NULL) (dp->drawobj)(); } --- 237,245 ---- } else { ! double v; ! v = computeDialVal(dp, mx, my); ! DSetVal(dp, v); if (dp->drawobj != NULL) (dp->drawobj)(); } *************** *** 246,256 **** 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) { /* track whatever dial controls */ if (dp->drawobj != NULL) (dp->drawobj)(); } --- 249,259 ---- if (!(mask & Button1Mask)) break; /* button released */ if (ipos == INDIAL) { ! 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)(); } *************** *** 266,276 **** if (lit) { switch (ipos) { ! case INCW1: if (dp->val < dp->max) DSetVal(dp, dp->val+1); 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 INCCW2: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->page); break; --- 269,279 ---- if (lit) { switch (ipos) { ! 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-dp->inc); break; case INCCW2: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->page); break; *************** *** 320,338 **** static void drawArrow(dp) DIAL *dp; { ! int i, rad, cx, cy; 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)); arrow[3].x = arrow[0].x; arrow[3].y = arrow[0].y; XDrawLines(theDisp, dp->win, theGC, arrow, 4, CoordModeOrigin); --- 323,342 ---- static void drawArrow(dp) DIAL *dp; { ! 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) */ ! 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,365 **** static void drawValStr(dp) DIAL *dp; { ! int 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); 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); 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," "); } strcat(foo1, foo); --- 347,383 ---- static void drawValStr(dp) DIAL *dp; { ! int tot, i, x1, x2; char foo[60], foo1[60]; /* compute longest string necessary so we can right-align this thing */ ! 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); ! 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-=strlen(foo);i>0;i--) strcat(foo1," "); } strcat(foo1, foo); *************** *** 411,422 **** /***************************************************/ ! static int computeDialVal(dp, x, y) DIAL *dp; int x, y; { ! int dx, dy, val; ! double angle; /* compute dx, dy (distance from cx, cy). Note: +dy is *up* */ dx = x - dp->cx; dy = dp->cy - y; --- 429,441 ---- /***************************************************/ ! static double computeDialVal(dp, x, y) DIAL *dp; int x, y; { ! 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; *************** *** 436,443 **** 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; return val; } --- 455,464 ---- if (angle > 270.0) angle -= 360.0; if (angle < -90.0) angle += 360.0; ! 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 -r -c -P xv-3.10a_before_patch/xvdir.c xv-3.10a/xvdir.c *** xv-3.10a_before_patch/xvdir.c Tue Jan 3 16:21:39 1995 --- xv-3.10a/xvdir.c Thu Feb 24 12:05:31 2000 *************** *** 62,67 **** --- 62,70 ---- #ifdef HAVE_TIFF "TIFF", #endif + #ifdef HAVE_PNG + "PNG", + #endif "PostScript", "PBM/PGM/PPM (raw)", "PBM/PGM/PPM (ascii)", *************** *** 1115,1120 **** --- 1118,1132 ---- } #endif + #ifdef HAVE_PNG + else if (fmt == F_PNG) { /* PNG */ + PNGSaveParams(fullname, col); + PNGDialog(1); /* open PNG Dialog box */ + dbut[S_BOK].lit = 0; BTRedraw(&dbut[S_BOK]); + return 0; /* always 'succeeds' */ + } + #endif + *************** *** 1168,1174 **** case F_XPM: rv = WriteXPM (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, ! fullname, picComments); case F_FITS: rv = WriteFITS (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, picComments); --- 1180,1187 ---- case F_XPM: rv = WriteXPM (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, ! fullname, picComments); ! break; case F_FITS: rv = WriteFITS (fp, thepic, ptype, w, h, rp, gp, bp, nc, col, picComments); *************** *** 1200,1205 **** --- 1213,1219 ---- char *st; { strncpy(deffname, st, (size_t) MAXFNLEN-1); + deffname[MAXFNLEN-1] = '\0'; setFName(st); } *************** *** 1380,1393 **** (strcmp(lowsuf,"eps" )==0) || (strcmp(lowsuf,"rgb" )==0) || (strcmp(lowsuf,"tga" )==0) || - (strcmp(lowsuf,"xpm" )==0) || (strcmp(lowsuf,"fits")==0) || (strcmp(lowsuf,"fts" )==0) || (strcmp(lowsuf,"jpg" )==0) || (strcmp(lowsuf,"jpeg")==0) || (strcmp(lowsuf,"jfif")==0) || (strcmp(lowsuf,"tif" )==0) || ! (strcmp(lowsuf,"tiff")==0)) { /* found one. set lowsuf = to the new suffix, and tack on to filename */ --- 1394,1414 ---- (strcmp(lowsuf,"eps" )==0) || (strcmp(lowsuf,"rgb" )==0) || (strcmp(lowsuf,"tga" )==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_TIFF (strcmp(lowsuf,"tif" )==0) || ! (strcmp(lowsuf,"tiff")==0) || ! #endif ! #ifdef HAVE_PNG ! (strcmp(lowsuf,"png" )==0) || ! #endif ! (strcmp(lowsuf,"xpm" )==0)) { /* found one. set lowsuf = to the new suffix, and tack on to filename */ *************** *** 1422,1427 **** --- 1443,1452 ---- #ifdef HAVE_TIFF case F_TIFF: strcpy(lowsuf,"tif"); break; + #endif + + #ifdef HAVE_PNG + case F_PNG: strcpy(lowsuf,"png"); break; #endif } diff -r -c -P xv-3.10a_before_patch/xvevent.c xv-3.10a/xvevent.c *** xv-3.10a_before_patch/xvevent.c Mon Jan 23 18:20:24 1995 --- xv-3.10a/xvevent.c Thu Feb 24 12:05:31 2000 *************** *** 154,160 **** int *donep; { static int wasInfoUp=0, wasCtrlUp=0, wasDirUp=0, wasGamUp=0, wasPsUp=0; ! static int wasJpegUp=0, wasTiffUp=0; static int mainWKludge=0; /* force first mainW expose after a mainW config to redraw all of mainW */ --- 154,160 ---- int *donep; { static int wasInfoUp=0, wasCtrlUp=0, wasDirUp=0, wasGamUp=0, wasPsUp=0; ! static int wasJpegUp=0, wasTiffUp=0, wasPngUp=0; static int mainWKludge=0; /* force first mainW expose after a mainW config to redraw all of mainW */ *************** *** 233,238 **** --- 233,242 ---- if (TIFFCheckEvent(event)) break; /* event has been processed */ #endif + #ifdef HAVE_PNG + if (PNGCheckEvent (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 */ *************** *** 359,364 **** --- 363,372 ---- 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 == mainW) Quit(0); } } *************** *** 538,543 **** --- 546,555 ---- #ifdef HAVE_TIFF if (wasTiffUp) { TIFFDialog(wasTiffUp); wasTiffUp=0; } #endif + + #ifdef HAVE_PNG + if (wasPngUp) { PNGDialog(wasJpegUp); wasPngUp=0; } + #endif } } } *************** *** 576,581 **** --- 588,597 ---- #ifdef HAVE_TIFF if (tiffUp) { wasTiffUp = tiffUp; TIFFDialog(0); } #endif + + #ifdef HAVE_PNG + if (pngUp) { wasPngUp = pngUp; PNGDialog(0); } + #endif } } } *************** *** 1147,1152 **** --- 1163,1172 ---- if (TIFFCheckEvent(event)) break; #endif + #ifdef HAVE_PNG + if (PNGCheckEvent (event)) break; + #endif + if (GamCheckEvent (event)) break; if (BrowseCheckEvent (event, &retval, &done)) break; if (TextCheckEvent (event, &retval, &done)) break; *************** *** 1366,1371 **** --- 1386,1395 ---- if (TIFFCheckEvent(event)) break; #endif + #ifdef HAVE_PNG + if (PNGCheckEvent (event)) break; + #endif + if (GamCheckEvent (event)) break; if (BrowseCheckEvent (event, &retval, &done)) break; if (TextCheckEvent (event, &retval, &done)) break; *************** *** 2370,2375 **** --- 2394,2403 ---- #ifdef HAVE_TIFF if (tiffUp) TIFFDialog(0); /* close tiff window */ + #endif + + #ifdef HAVE_PNG + if (pngUp) PNGDialog(0); /* close png window */ #endif ClosePopUp(); diff -r -c -P xv-3.10a_before_patch/xvgam.c xv-3.10a/xvgam.c *** xv-3.10a_before_patch/xvgam.c Fri Jan 13 14:51:14 1995 --- xv-3.10a/xvgam.c Thu Feb 24 12:05:31 2000 *************** *** 265,275 **** 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, infofg, infobg, hicol, locol, "Hue", NULL); ! DCreate(&gsDial, cmapF, 72, 215, 66, 100, 0,360,180, 5, infofg, infobg, hicol, locol, "Sat.", NULL); ! DCreate(&bvDial, cmapF, 139, 215, 66, 100, 0,360,180, 5, infofg, infobg, hicol, locol, "Value", NULL); rhDial.drawobj = gsDial.drawobj = bvDial.drawobj = dragEditColor; --- 265,275 ---- 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.0, 360.0, 180.0, 1.0, 5.0, infofg, infobg, hicol, locol, "Hue", NULL); ! 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.0, 360.0, 180.0, 1.0, 5.0, infofg, infobg, hicol, locol, "Value", NULL); rhDial.drawobj = gsDial.drawobj = bvDial.drawobj = dragEditColor; *************** *** 359,365 **** srcHD.drawobj = dstHD.drawobj = whtHD.drawobj = dragHueDial; ! DCreate(&satDial, hsvF, 100, 199, 100, 121, -100, 100, 0, 5, infofg, infobg,hicol,locol, "Saturation", "%"); hueRB = RBCreate(NULL, hsvF, 7, 153, "1", --- 359,365 ---- srcHD.drawobj = dstHD.drawobj = whtHD.drawobj = dragHueDial; ! 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", *************** *** 722,728 **** if (whtHD.enabCB.val && whtHD.satval) hsvnonlinear++; ! if (satDial.val != 0) hsvnonlinear++; /* check intensity graf */ for (i=0; i<256 && intGraf.func[i]==i; i++); --- 722,728 ---- if (whtHD.enabCB.val && whtHD.satval) hsvnonlinear++; ! if (satDial.val != 0.0) hsvnonlinear++; /* check intensity graf */ for (i=0; i<256 && intGraf.func[i]==i; i++); *************** *** 1291,1304 **** 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)); } else { ! DSetVal(&rhDial, rcmap[editColor]); ! DSetVal(&gsDial, gcmap[editColor]); ! DSetVal(&bvDial, bcmap[editColor]); } } --- 1291,1304 ---- rgb2hsv(rcmap[editColor], gcmap[editColor], bcmap[editColor], &h, &s, &v); if (h<0) h = 0; ! DSetVal(&rhDial, h); ! DSetVal(&gsDial, s*100); ! DSetVal(&bvDial, v*100); } else { ! DSetVal(&rhDial, (double)rcmap[editColor]); ! DSetVal(&gsDial, (double)gcmap[editColor]); ! DSetVal(&bvDial, (double)bcmap[editColor]); } } *************** *** 1310,1325 **** if (hsvmode) { int rv, gv, bv; ! hsv2rgb((double) rhDial.val, ((double) gsDial.val) / 100.0, ! ((double) 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; } } --- 1310,1324 ---- if (hsvmode) { int 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] = (int)rhDial.val; ! gcmap[editColor] = (int)gsDial.val; ! bcmap[editColor] = (int)bvDial.val; } } *************** *** 1561,1569 **** gsDial.title = "Green"; bvDial.title = "Blue"; ! DSetRange(&rhDial, 0, 255, rcmap[editColor], 16); ! DSetRange(&gsDial, 0, 255, gcmap[editColor], 16); ! DSetRange(&bvDial, 0, 255, bcmap[editColor], 16); XClearWindow(theDisp, rhDial.win); DRedraw(&rhDial); XClearWindow(theDisp, gsDial.win); DRedraw(&gsDial); --- 1560,1568 ---- gsDial.title = "Green"; bvDial.title = "Blue"; ! DSetRange(&rhDial, 0.0, 255.0, (double)rcmap[editColor], 1.0, 16.0); ! DSetRange(&gsDial, 0.0, 255.0, (double)gcmap[editColor], 1.0, 16.0); ! DSetRange(&bvDial, 0.0, 255.0, (double)bcmap[editColor], 1.0, 16.0); XClearWindow(theDisp, rhDial.win); DRedraw(&rhDial); XClearWindow(theDisp, gsDial.win); DRedraw(&gsDial); *************** *** 1581,1589 **** &h, &s, &v); if (h<0.0) h = 0.0; ! DSetRange(&rhDial, 0, 360, (int) h, 5); ! DSetRange(&gsDial, 0, 100, (int) (s*100), 5); ! DSetRange(&bvDial, 0, 100, (int) (v*100), 5); XClearWindow(theDisp, rhDial.win); DRedraw(&rhDial); XClearWindow(theDisp, gsDial.win); DRedraw(&gsDial); --- 1580,1588 ---- &h, &s, &v); if (h<0.0) h = 0.0; ! DSetRange(&rhDial, 0.0, 360.0, h, 1.0, 5.0); ! DSetRange(&gsDial, 0.0, 100.0, s*100, 1.0, 5.0); ! DSetRange(&bvDial, 0.0, 100.0, v*100, 1.0, 5.0); XClearWindow(theDisp, rhDial.win); DRedraw(&rhDial); XClearWindow(theDisp, gsDial.win); DRedraw(&gsDial); *************** *** 1891,1897 **** } /* apply satDial value to s */ ! s = s + ((double) satDial.val) / 100.0; if (s<0.0) s = 0.0; if (s>1.0) s = 1.0; --- 1890,1896 ---- } /* apply satDial value to s */ ! s = s + satDial.val / 100.0; if (s<0.0) s = 0.0; if (s>1.0) s = 1.0; *************** *** 2007,2013 **** gs->hueRBnum = RBWhich(hueRB); ! gs->satval = satDial.val; GetGrafState(&intGraf,&gs->istate); GetGrafState(&rGraf, &gs->rstate); GetGrafState(&gGraf, &gs->gstate); --- 2006,2012 ---- gs->hueRBnum = RBWhich(hueRB); ! gs->satval = (int)satDial.val; GetGrafState(&intGraf,&gs->istate); GetGrafState(&rGraf, &gs->rstate); GetGrafState(&gGraf, &gs->gstate); *************** *** 2064,2071 **** changed++; } ! if (gs->satval != satDial.val) { ! DSetVal(&satDial,gs->satval); changed++; } --- 2063,2070 ---- changed++; } ! if (gs->satval != (int)satDial.val) { ! DSetVal(&satDial,(double)gs->satval); changed++; } *************** *** 3200,3206 **** if (whtHD.enabCB.val && whtHD.satval) hsvmod++; ! if (satDial.val != 0) hsvmod++; /* check intensity graf */ for (i=0; i<256; i++) { --- 3199,3205 ---- if (whtHD.enabCB.val && whtHD.satval) hsvmod++; ! if (satDial.val != 0.0) hsvmod++; /* check intensity graf */ for (i=0; i<256; i++) { *************** *** 3284,3290 **** } /* apply satDial value to s */ ! s = s + satDial.val; if (s< 0) s = 0; if (s>100) s = 100; --- 3283,3289 ---- } /* apply satDial value to s */ ! s = s + (int)satDial.val; if (s< 0) s = 0; if (s>100) s = 100; diff -r -c -P xv-3.10a_before_patch/xvgif.c xv-3.10a/xvgif.c *** xv-3.10a_before_patch/xvgif.c Tue Jan 10 14:54:41 1995 --- xv-3.10a/xvgif.c Thu Feb 24 12:05:31 2000 *************** *** 113,119 **** int aspect, gotimage; /* initialize variables */ ! BitOffset = XC = YC = Pass = OutCount = gotimage = 0; RawGIF = Raster = pic8 = NULL; gif89 = 0; --- 113,120 ---- int aspect, gotimage; /* initialize variables */ ! BitOffset = XC = YC = OutCount = gotimage = 0; ! Pass = -1; RawGIF = Raster = pic8 = NULL; gif89 = 0; *************** *** 692,698 **** { static byte *ptr = NULL; static int oldYC = -1; ! if (oldYC != YC) { ptr = pic8 + YC * Width; oldYC = YC; } if (YCbitmap_unit; - bits_used = bits_per_item; bits_per_pixel = image->bits_per_pixel; if (bits_per_pixel == 32) pixmask = 0xffffffff; else pixmask = (((CARD32) 1) << bits_per_pixel) - 1; --- 641,670 ---- 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; diff -r -c -P xv-3.10a_before_patch/xvimage.c xv-3.10a/xvimage.c *** xv-3.10a_before_patch/xvimage.c Fri Jan 13 19:11:36 1995 --- xv-3.10a/xvimage.c Thu Feb 24 12:05:31 2000 *************** *** 1736,1745 **** if (xim->byte_order == MSBFirst) { for (i=wide*high, ip=imagedata; i>0; i--,pp++) { if (((i+1)&0x1ffff) == 0) WaitCursor(); ! if (dithpic) { ! *ip++ = ((*pp) ? white : black) & 0xffff; ! } ! else *ip++ = xcolors[*pp] & 0xffff; } } else { /* LSBFirst */ --- 1736,1747 ---- if (xim->byte_order == MSBFirst) { for (i=wide*high, ip=imagedata; i>0; i--,pp++) { if (((i+1)&0x1ffff) == 0) WaitCursor(); ! ! if (dithpic) xcol = ((*pp) ? white : black) & 0xffff; ! else xcol = xcolors[*pp] & 0xffff; ! ! *((unsigned char *)ip)++ = (xcol>>8) & 0xff; ! *((unsigned char *)ip)++ = (xcol) & 0xff; } } else { /* LSBFirst */ *************** *** 1749,1756 **** if (dithpic) xcol = ((*pp) ? white : black) & 0xffff; else xcol = xcolors[*pp]; ! /* WAS *ip++ = ((xcol>>8) & 0xff) | ((xcol&0xff) << 8); */ ! *ip++ = (unsigned short) (xcol); } } } --- 1751,1758 ---- if (dithpic) xcol = ((*pp) ? white : black) & 0xffff; else xcol = xcolors[*pp]; ! *((unsigned char *)ip)++ = (xcol) & 0xff; ! *((unsigned char *)ip)++ = (xcol>>8) & 0xff; } } } diff -r -c -P xv-3.10a_before_patch/xvjpeg.c xv-3.10a/xvjpeg.c *** xv-3.10a_before_patch/xvjpeg.c Thu Jan 5 03:17:13 1995 --- xv-3.10a/xvjpeg.c Thu Feb 24 12:05:31 2000 *************** *** 17,22 **** --- 17,25 ---- #define CREATOR_STR "CREATOR: " + #undef METHODDEF /* pbj */ + #define METHODDEF(X) static X + #if BITS_IN_JSAMPLE != 8 Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */ #endif *************** *** 51,61 **** static void clickJD PARM((int, int)); static void doCmd PARM((int)); static void writeJPEG PARM((void)); ! METHODDEF void xv_error_exit PARM((j_common_ptr)); ! METHODDEF void xv_error_output PARM((j_common_ptr)); ! METHODDEF void xv_prog_meter PARM((j_common_ptr)); static unsigned int j_getc PARM((j_decompress_ptr)); ! METHODDEF boolean xv_process_comment PARM((j_decompress_ptr)); static int writeJFIF PARM((FILE *, byte *, int,int,int)); --- 54,64 ---- static void clickJD PARM((int, int)); static void doCmd PARM((int)); static void writeJPEG PARM((void)); ! METHODDEF(void) xv_error_exit PARM((j_common_ptr)); ! METHODDEF(void) xv_error_output PARM((j_common_ptr)); ! METHODDEF(void) xv_prog_meter PARM((j_common_ptr)); static unsigned int j_getc PARM((j_decompress_ptr)); ! METHODDEF(boolean) xv_process_comment PARM((j_decompress_ptr)); static int writeJFIF PARM((FILE *, byte *, int,int,int)); *************** *** 87,96 **** XSelectInput(theDisp, jpegW, ExposureMask | ButtonPressMask | KeyPressMask); ! DCreate(&qDial, jpegW, 10, 10, 80, 100, 1, 100, 75, 5, infofg, infobg, hicol, locol, "Quality", "%"); ! DCreate(&smDial, jpegW, 120, 10, 80, 100, 0, 100, 0, 5, infofg, infobg, hicol, locol, "Smoothing", "%"); BTCreate(&jbut[J_BOK], jpegW, JWIDE-180-1, JHIGH-10-BUTTH-1, 80, BUTTH, --- 90,99 ---- XSelectInput(theDisp, jpegW, ExposureMask | ButtonPressMask | KeyPressMask); ! DCreate(&qDial, jpegW, 10, 10, 80, 100, 1.0, 100.0, 75.0, 1.0, 5.0, infofg, infobg, hicol, locol, "Quality", "%"); ! DCreate(&smDial, jpegW, 120, 10, 80, 100, 0.0, 100.0, 0.0, 1.0, 5.0, infofg, infobg, hicol, locol, "Smoothing", "%"); BTCreate(&jbut[J_BOK], jpegW, JWIDE-180-1, JHIGH-10-BUTTH-1, 80, BUTTH, *************** *** 400,406 **** /**************************************************/ ! METHODDEF void xv_error_exit(cinfo) j_common_ptr cinfo; { my_error_ptr myerr; --- 403,409 ---- /**************************************************/ ! METHODDEF(void) xv_error_exit(cinfo) j_common_ptr cinfo; { my_error_ptr myerr; *************** *** 412,418 **** /**************************************************/ ! METHODDEF void xv_error_output(cinfo) j_common_ptr cinfo; { my_error_ptr myerr; --- 415,421 ---- /**************************************************/ ! METHODDEF(void) xv_error_output(cinfo) j_common_ptr cinfo; { my_error_ptr myerr; *************** *** 426,432 **** /**************************************************/ ! METHODDEF void xv_prog_meter(cinfo) j_common_ptr cinfo; { struct jpeg_progress_mgr *prog; --- 429,435 ---- /**************************************************/ ! METHODDEF(void) xv_prog_meter(cinfo) j_common_ptr cinfo; { struct jpeg_progress_mgr *prog; *************** *** 671,677 **** /**************************************************/ ! METHODDEF boolean xv_process_comment(cinfo) j_decompress_ptr cinfo; { int length, hasnull; --- 674,680 ---- /**************************************************/ ! METHODDEF(boolean) xv_process_comment(cinfo) j_decompress_ptr cinfo; { int length, hasnull; *************** *** 759,766 **** jpeg_set_defaults(&cinfo); ! jpeg_set_quality(&cinfo, qDial.val, TRUE); ! cinfo.smoothing_factor = smDial.val; jpeg_start_compress(&cinfo, TRUE); --- 762,769 ---- jpeg_set_defaults(&cinfo); ! jpeg_set_quality(&cinfo, (int)qDial.val, TRUE); ! cinfo.smoothing_factor = (int)smDial.val; jpeg_start_compress(&cinfo, TRUE); *************** *** 769,775 **** /*** COMMENT HANDLING ***/ sprintf(xvcmt, "%sXV %s Quality = %d, Smoothing = %d\n", ! CREATOR_STR, REVDATE, qDial.val, smDial.val); if (picComments) { /* append XV comment */ char *sp, *sp1; int done; --- 772,778 ---- /*** COMMENT HANDLING ***/ sprintf(xvcmt, "%sXV %s Quality = %d, Smoothing = %d\n", ! CREATOR_STR, REVDATE, (int)qDial.val, (int)smDial.val); if (picComments) { /* append XV comment */ char *sp, *sp1; int done; diff -r -c -P xv-3.10a_before_patch/xvmisc.c xv-3.10a/xvmisc.c *** xv-3.10a_before_patch/xvmisc.c Fri Jan 13 18:41:34 1995 --- xv-3.10a/xvmisc.c Thu Feb 24 12:05:31 2000 *************** *** 28,33 **** --- 28,35 ---- * int xvbcmp (s1, s2, length) * void xvbzero(s, length) * char *xv_strstr(s1, s2) + * FILE *xv_fopen(str, str) + * void xv_mktemp(str) * void Timer(milliseconds) */ *************** *** 520,525 **** --- 522,531 ---- if (tiffW) XDestroyWindow(theDisp, tiffW); #endif + #ifdef HAVE_PNG + if (pngW) XDestroyWindow(theDisp, pngW); + #endif + /* if NOT using stdcmap for images, free stdcmap */ if (colorMapMode != CM_STDCMAP) { int j; *************** *** 716,721 **** --- 722,731 ---- #ifdef HAVE_TIFF if (tiffW) XDefineCursor(theDisp, tiffW, otherc); #endif + + #ifdef HAVE_PNG + if (pngW) XDefineCursor(theDisp, pngW, otherc); + #endif } *************** *** 1066,1071 **** --- 1076,1091 ---- } + /***************************************************/ + void xv_mktemp(buf, fname) + char *buf, *fname; + { + #ifndef VMS + sprintf(buf, "%s/%s", tmpdir, fname); + #else + sprintf(buf, "Sys$Disk:[]%s", fname); + #endif + } /*******/ diff -r -c -P xv-3.10a_before_patch/xvpng.c xv-3.10a/xvpng.c *** xv-3.10a_before_patch/xvpng.c Wed Dec 31 19:00:00 1969 --- xv-3.10a/xvpng.c Thu Feb 24 12:05:31 2000 *************** *** 0 **** --- 1,998 ---- + /* + * xvpng.c - load and write routines for 'PNG' format pictures + * + * callable functions + * + * CreatePNGW() + * PNGDialog(vis) + * PNGCheckEvent(xev) + * PNGSaveParams(fname, col) + * LoadPNG(fname, pinfo) + */ + + /*#include "copyright.h"*/ + /* (c) 1995 by Alexander Lehmann + * this file is a suplement to xv and is supplied under the same copying + * conditions (except the shareware part) + * Modified by Andreas Dilger to fix + * error handling for bad PNGs, add dialogs for interlacing and + * compression selection, and upgrade to libpng-0.89 + * The copyright will be passed on to JB at some future point if he + * so desires. + */ + + #include "xv.h" + + #ifdef HAVE_PNG + + #include "png.h" + + /*** Stuff for PNG Dialog box ***/ + #define PWIDE 318 + #define PHIGH 215 + + #define DISPLAY_GAMMA 2.20 /* Default display gamma */ + /* Default zlib compression level + #define COMPRESSION Z_BEST_COMPRESSION + */ + #define COMPRESSION 6 + + #define DWIDE 86 + #define DHIGH 104 + #define PFX PWIDE-93 + #define PFY 44 + #define PFH 20 + + #define P_BOK 0 + #define P_BCANC 1 + #define P_NBUTTS 2 + + #define BUTTH 24 + + #define LF 10 /* a.k.a. '\n' on ASCII machines */ + #define CR 13 /* a.k.a. '\r' on ASCII machines */ + + /*** local functions ***/ + static void drawPD PARM((int, int, int, int)); + static void clickPD PARM((int, int)); + static void doCmd PARM((int)); + static void writePNG PARM((void)); + static int WritePNG PARM((FILE *, byte *, int, int, int, + byte *, byte *, byte *, int)); + + static void png_xv_error PARM((png_structp png_ptr, + png_const_charp message)); + static void png_xv_warning PARM((png_structp png_ptr, + png_const_charp message)); + + /*** local variables ***/ + static char *filename; + static char *fbasename; + static int colorType; + static int read_anything; + static double Display_Gamma = DISPLAY_GAMMA; + + static DIAL cDial, gDial; + static BUTT pbut[P_NBUTTS]; + static CBUTT interCB; + static CBUTT FdefCB, FnoneCB, FsubCB, FupCB, FavgCB, FPaethCB; + + /**************************************************************************/ + /* PNG SAVE DIALOG ROUTINES ***********************************************/ + /**************************************************************************/ + + + /*******************************************/ + void CreatePNGW() + { + pngW = CreateWindow("xv png", "XVPNG", NULL, + PWIDE, PHIGH, infofg, infobg, 0); + if (!pngW) FatalError("can't create PNG window!"); + + XSelectInput(theDisp, pngW, ExposureMask | ButtonPressMask | KeyPressMask); + + DCreate(&cDial, pngW, 12, 25, DWIDE, DHIGH, (double)Z_NO_COMPRESSION, + (double)Z_BEST_COMPRESSION, COMPRESSION, 1.0, 3.0, + infofg, infobg, hicol, locol, "Compression", NULL); + + DCreate(&gDial, pngW, DWIDE+27, 25, DWIDE, DHIGH, 1.0, 3.5,DISPLAY_GAMMA,0.01,0.2, + infofg, infobg, hicol, locol, "Disp. Gamma", NULL); + + CBCreate(&interCB, pngW, DWIDE+30, DHIGH+3*LINEHIGH+2, "interlace", + infofg, infobg, hicol, locol); + + CBCreate(&FdefCB, pngW, PFX, PFY, "Default", + infofg, infobg, hicol, locol); + FdefCB.val = 1; + + CBCreate(&FnoneCB, pngW, PFX, FdefCB.y + PFH + 4, "none", + infofg, infobg, hicol, locol); + CBCreate(&FsubCB, pngW, PFX, FnoneCB.y + PFH, "sub", + infofg, infobg, hicol, locol); + CBCreate(&FupCB, pngW, PFX, FsubCB.y + PFH, "up", + infofg, infobg, hicol, locol); + CBCreate(&FavgCB, pngW, PFX, FupCB.y + PFH, "average", + infofg, infobg, hicol, locol); + CBCreate(&FPaethCB, pngW, PFX, FavgCB.y + PFH, "Paeth", + infofg, infobg, hicol, locol); + + FnoneCB.val = FsubCB.val = FupCB.val = FavgCB.val = FPaethCB.val = 1; + CBSetActive(&FnoneCB, !FdefCB.val); + CBSetActive(&FsubCB, !FdefCB.val); + CBSetActive(&FupCB, !FdefCB.val); + CBSetActive(&FavgCB, !FdefCB.val); + CBSetActive(&FPaethCB, !FdefCB.val); + + BTCreate(&pbut[P_BOK], pngW, PWIDE-180-1, PHIGH-10-BUTTH-1, 80, BUTTH, + "Ok", infofg, infobg, hicol, locol); + BTCreate(&pbut[P_BCANC], pngW, PWIDE-90-1, PHIGH-10-BUTTH-1, 80, BUTTH, + "Cancel", infofg, infobg, hicol, locol); + + XMapSubwindows(theDisp, pngW); + } + + + /*******************************************/ + void PNGDialog(vis) + int vis; + { + if (vis) { + CenterMapWindow(pngW, pbut[P_BOK].x + (int) pbut[P_BOK].w/2, + pbut[P_BOK].y + (int) pbut[P_BOK].h/2, + PWIDE, PHIGH); + } + else XUnmapWindow(theDisp, pngW); + pngUp = vis; + } + + + /*******************************************/ + int PNGCheckEvent(xev) + XEvent *xev; + { + /* check event to see if it's for one of our subwindows. If it is, + deal accordingly, and return '1'. Otherwise, return '0' */ + + int rv; + rv = 1; + + if (!pngUp) return 0; + + 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 expose events for 'dumb' windows */ + if (e->count > 0 && (e->window == cDial.win)) {} + + else if (e->window == pngW) drawPD(x, y, w, h); + else if (e->window == cDial.win) DRedraw(&cDial); + else if (e->window == gDial.win) DRedraw(&gDial); + else rv = 0; + } + + else if (xev->type == ButtonPress) { + XButtonEvent *e = (XButtonEvent *) xev; + int x,y; + x = e->x; y = e->y; + + if (e->button == Button1) { + if (e->window == pngW) clickPD(x,y); + else if (e->window == cDial.win) DTrack(&cDial,x,y); + else if (e->window == gDial.win) DTrack(&gDial,x,y); + else rv = 0; + } /* button1 */ + else rv = 0; + } /* button press */ + + else if (xev->type == KeyPress) { + XKeyEvent *e = (XKeyEvent *) xev; + char buf[128]; KeySym ks; + int stlen; + + stlen = XLookupString(e,buf,128,&ks,(XComposeStatus *) NULL); + buf[stlen] = '\0'; + + RemapKeyCheck(ks, buf, &stlen); + + if (e->window == pngW) { + if (stlen) { + if (buf[0] == '\r' || buf[0] == '\n') { /* enter */ + FakeButtonPress(&pbut[P_BOK]); + } + else if (buf[0] == '\033') { /* ESC */ + FakeButtonPress(&pbut[P_BCANC]); + } + } + } + else rv = 0; + } + else rv = 0; + + if (rv==0 && (xev->type == ButtonPress || xev->type == KeyPress)) { + XBell(theDisp, 50); + rv = 1; /* eat it */ + } + + return rv; + } + + + /*******************************************/ + void PNGSaveParams(fname, col) + char *fname; + int col; + { + filename = fname; + colorType = col; + } + + + /*******************************************/ + static void drawPD(x, y, w, h) + int x, y, w, h; + { + char *title = "Save PNG file..."; + + char ctitle1[20]; + char *ctitle2 = "Useful range"; + char *ctitle3 = "is 2 - 7."; + char *ctitle4 = "Uncompressed = 0"; + + char *ftitle = "Row Filters:"; + + char gtitle[20]; + + int i; + XRectangle xr; + + xr.x = x; xr.y = y; xr.width = w; xr.height = h; + XSetClipRectangles(theDisp, theGC, 0,0, &xr, 1, Unsorted); + + XSetForeground(theDisp, theGC, infofg); + XSetBackground(theDisp, theGC, infobg); + + for (i=0; ix, bp->y, bp->w, bp->h)) break; + } + + if (ijmpbuf)) { + png_destroy_write_struct(&png_ptr, &info_ptr); + return -1; + } + + png_init_io(png_ptr, fp); + + png_set_compression_level(png_ptr, (int)cDial.val); + + /* Don't bother filtering if we aren't compressing the image */ + if (FdefCB.val) + { + if ((int)cDial.val == 0) + png_set_filter(png_ptr, 0, PNG_FILTER_NONE); + } + else + { + filter = FnoneCB.val ? PNG_FILTER_NONE : 0; + filter |= FsubCB.val ? PNG_FILTER_SUB : 0; + filter |= FupCB.val ? PNG_FILTER_UP : 0; + filter |= FavgCB.val ? PNG_FILTER_AVG : 0; + filter |= FPaethCB.val ? PNG_FILTER_PAETH : 0; + + png_set_filter(png_ptr, 0, filter); + } + + info_ptr->width = w; + info_ptr->height = h; + + info_ptr->interlace_type = interCB.val ? 1 : 0; + + if (colorType == F_FULLCOLOR || colorType == F_REDUCED) { + if(ptype == PIC24) { + linesize = 3*w; + info_ptr->color_type = PNG_COLOR_TYPE_RGB; + info_ptr->bit_depth = 8; + } else { + linesize = w; + info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; + if(numcols <= 2) + info_ptr->bit_depth = 1; + else + if(numcols <= 4) + info_ptr->bit_depth = 2; + else + if(numcols <= 16) + info_ptr->bit_depth = 4; + else + info_ptr->bit_depth = 8; + + for(i = 0; i < numcols; i++) { + palette[i].red = rmap[i]; + palette[i].green = gmap[i]; + palette[i].blue = bmap[i]; + } + info_ptr->num_palette = numcols; + info_ptr->palette = palette; + info_ptr->valid |= PNG_INFO_PLTE; + } + } + + else if(colorType == F_GREYSCALE || colorType == F_BWDITHER) { + info_ptr->color_type = PNG_COLOR_TYPE_GRAY; + if(colorType == F_BWDITHER) { + /* shouldn't happen */ + if (ptype == PIC24) FatalError("PIC24 and B/W Stipple in WritePNG()"); + + info_ptr->bit_depth = 1; + if(MONO(rmap[0], gmap[0], bmap[0]) > MONO(rmap[1], gmap[1], bmap[1])) { + remap[0] = 1; + remap[1] = 0; + } + else { + remap[0] = 0; + remap[1] = 1; + } + linesize = w; + } + else { + if(ptype == PIC24) { + linesize = w*3; + info_ptr->bit_depth = 8; + } + else { + int low_presc; + + linesize = w; + + for(i = 0; i < numcols; i++) + remap[i] = MONO(rmap[i], gmap[i], bmap[i]); + + for(; i < 256; i++) + remap[i]=0; + + info_ptr->bit_depth = 8; + + /* Note that this fails most of the time because of gamma */ + /* try to adjust to 4 bit prescision grayscale */ + + low_presc=1; + + for(i = 0; i < numcols; i++) { + if((remap[i] & 0x0f) * 0x11 != remap[i]) { + low_presc = 0; + break; + } + } + + if(low_presc) { + for(i = 0; i < numcols; i++) { + remap[i] &= 0xf; + } + info_ptr->bit_depth = 4; + + /* try to adjust to 2 bit prescision grayscale */ + + for(i = 0; i < numcols; i++) { + if((remap[i] & 0x03) * 0x05 != remap[i]) { + low_presc = 0; + break; + } + } + } + + if(low_presc) { + for(i = 0; i < numcols; i++) { + remap[i] &= 3; + } + info_ptr->bit_depth = 2; + + /* try to adjust to 1 bit prescision grayscale */ + + for(i = 0; i < numcols; i++) { + if((remap[i] & 0x01) * 0x03 != remap[i]) { + low_presc = 0; + break; + } + } + } + + if(low_presc) { + for(i = 0; i < numcols; i++) { + remap[i] &= 1; + } + info_ptr->bit_depth = 1; + } + } + } + } + + else + png_error(png_ptr, "Unknown colorstyle in WritePNG"); + + if ((text = (png_textp)malloc(sizeof(png_text)))) { + sprintf(software, "XV %s", REVDATE); + + text->compression = -1; + text->key = "Software"; + text->text = software; + text->text_length = strlen(text->text); + + info_ptr->max_text = 1; + info_ptr->num_text = 1; + info_ptr->text = text; + } + + Display_Gamma = gDial.val; /* Save the current gamma for loading */ + + info_ptr->gamma = 1.0/gDial.val; + info_ptr->valid |= PNG_INFO_gAMA; + + png_write_info(png_ptr, info_ptr); + + if(info_ptr->bit_depth < 8) + png_set_packing(png_ptr); + + pass=png_set_interlace_handling(png_ptr); + + if((png_line = malloc(linesize)) == NULL) + png_error(png_ptr, "cannot allocate temp image line"); + + for(i = 0; i < pass; i++) { + int j; + p = pic; + for(j = 0; j < h; j++) { + if(info_ptr->color_type == PNG_COLOR_TYPE_GRAY) { + int k; + for(k = 0; k < w; k++) + png_line[k] = ptype==PIC24 ? MONO(p[k*3], p[k*3+1], p[k*3+2]) : + remap[p[k]]; + png_write_row(png_ptr, png_line); + } else /* RGB or palette */ + png_write_row(png_ptr, p); + if((j & 0x1f) == 0) WaitCursor(); + p += linesize; + } + } + + free(png_line); + + if (text) + { + if (picComments && strlen(picComments) && + (savecmnt = (char *)malloc((strlen(picComments) + 1)*sizeof(char)))) { + png_textp tp; + char *comment, *key; + + strcpy(savecmnt, picComments); + key = savecmnt; + tp = text; + info_ptr->num_text = 0; + + comment = strchr(key, ':'); + + do { + /* Allocate a larger structure for comments if necessary */ + if (info_ptr->num_text >= info_ptr->max_text) + { + if ((tp = + realloc(text, (info_ptr->num_text + 2)*sizeof(png_text))) == NULL) + { + break; + } + else + { + text = tp; + tp = &text[info_ptr->num_text]; + info_ptr->max_text += 2; + } + } + + /* See if it looks like a PNG keyword from LoadPNG */ + if(comment && comment[1] == ':' && comment - key <= 80) { + *(comment++) = '\0'; + *(comment++) = '\0'; + + /* If the comment is the 'Software' chunk XV writes, we remove it, + since we have already stored one */ + if (strcmp(key, "Software") == 0 && strncmp(comment, "XV", 2) == 0) { + key = strchr(comment, '\n'); + if(key) + key++; /* skip \n */ + comment = strchr(key, ':'); + } + /* We have another keyword and/or comment to write out */ + else { + tp->key = key; + tp->text = comment; + + /* We have to find the end of this comment, and the next keyword + if there is one */ + do { + key = comment = strchr(comment, ':'); + } while (key && key[1] != ':'); + + /* It looks like another keyword, go backward to the beginning */ + if (key) { + while(key > tp->text && *key != '\n') + key--; + + if (key > tp->text && comment - key <= 80) { + *key = '\0'; + key++; + } + } + + tp->text_length = strlen(tp->text); + + /* We don't have another keyword, so remove the last newline */ + if (!key && tp->text[tp->text_length - 1] == '\n') + { + tp->text[tp->text_length] = '\0'; + tp->text_length--; + } + + tp->compression = tp->text_length > 640 ? 0 : -1; + info_ptr->num_text++; + tp++; + } + } + /* Just a generic comment: make sure line-endings are valid for PNG */ + else { + char *p=key, *q=key; /* only deleting chars, not adding any */ + + while (*p) { + if (*p == CR) { /* lone CR or CR/LF: EOL either way */ + *q++ = LF; /* LF is the only allowed PNG line-ending */ + if (p[1] == LF) /* get rid of any original LF */ + ++p; + } else if (*p == LF) /* lone LF */ + *q++ = LF; + else + *q++ = *p; + ++p; + } + *q = '\0'; /* unnecessary...but what the heck */ + tp->key = "Comment"; + tp->text = key; + tp->text_length = q - key; + tp->compression = tp->text_length > 750 ? 0 : -1; + info_ptr->num_text++; + key = NULL; + } + } while (key && *key); + } + else + { + info_ptr->num_text = 0; + } + } + info_ptr->text = text; + + png_convert_from_time_t(&(info_ptr->mod_time), time(NULL)); + info_ptr->valid |= PNG_INFO_tIME; + + png_write_end(png_ptr, info_ptr); + fflush(fp); /* just in case we core-dump before finishing... */ + + if (text) + { + free(text); + /* must do this or png_destroy_write_struct() 0.97+ will free text again: */ + info_ptr->text = (png_textp)NULL; + if (savecmnt) + { + free(savecmnt); + savecmnt = (char *)NULL; + } + } + + png_destroy_write_struct(&png_ptr, &info_ptr); + + return 0; + } + + + /*******************************************/ + int LoadPNG(fname, pinfo) + char *fname; + PICINFO *pinfo; + /*******************************************/ + { + /* returns '1' on success */ + + FILE *fp; + png_struct *png_ptr; + png_info *info_ptr; + png_color_16 my_background; + int i,j; + int linesize; + int filesize; + int pass; + size_t commentsize; + + fbasename = BaseName(fname); + + pinfo->pic = (byte *) NULL; + pinfo->comment = (char *) NULL; + + read_anything=0; + + /* open the file */ + fp = xv_fopen(fname,"r"); + if (!fp) + { + SetISTR(ISTR_WARNING,"%s: can't open file", fname); + return 0; + } + + /* find the size of the file */ + fseek(fp, 0L, 2); + filesize = ftell(fp); + fseek(fp, 0L, 0); + + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, + png_xv_error, png_xv_warning); + if(!png_ptr) { + fclose(fp); + FatalError("malloc failure in LoadPNG"); + } + + info_ptr = png_create_info_struct(png_ptr); + + if(!info_ptr) { + fclose(fp); + png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); + FatalError("malloc failure in LoadPNG"); + } + + if(setjmp(png_ptr->jmpbuf)) { + fclose(fp); + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + if(!read_anything) { + if(pinfo->pic) { + free(pinfo->pic); + pinfo->pic = NULL; + } + if(pinfo->comment) { + free(pinfo->comment); + pinfo->comment = NULL; + } + } + return read_anything; + } + + png_init_io(png_ptr, fp); + png_read_info(png_ptr, info_ptr); + + pinfo->w = pinfo->normw = info_ptr->width; + pinfo->h = pinfo->normh = info_ptr->height; + + pinfo->frmType = F_PNG; + + sprintf(pinfo->fullInfo, "PNG, %d bit ", + info_ptr->bit_depth * info_ptr->channels); + + switch(info_ptr->color_type) { + case PNG_COLOR_TYPE_PALETTE: + strcat(pinfo->fullInfo, "palette color"); + break; + + case PNG_COLOR_TYPE_GRAY: + strcat(pinfo->fullInfo, "grayscale"); + break; + + case PNG_COLOR_TYPE_GRAY_ALPHA: + strcat(pinfo->fullInfo, "grayscale+alpha"); + break; + + case PNG_COLOR_TYPE_RGB: + strcat(pinfo->fullInfo, "truecolor"); + break; + + case PNG_COLOR_TYPE_RGB_ALPHA: + strcat(pinfo->fullInfo, "truecolor+alpha"); + break; + } + + sprintf(pinfo->fullInfo + strlen(pinfo->fullInfo), + ", %sinterlaced. (%d bytes)", + info_ptr->interlace_type ? "" : "non-", filesize); + + sprintf(pinfo->shrtInfo, "%dx%d PNG", info_ptr->width, info_ptr->height); + + if (info_ptr->bit_depth < 8) + png_set_packing(png_ptr); + + if (info_ptr->valid & PNG_INFO_gAMA) + png_set_gamma(png_ptr, Display_Gamma, info_ptr->gamma); + else + png_set_gamma(png_ptr, Display_Gamma, 0.45); + + if (info_ptr->valid & PNG_INFO_bKGD) + png_set_background(png_ptr, &info_ptr->background, + PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); + else { + my_background.red = my_background.green = my_background.blue = + my_background.gray = 0; + png_set_background(png_ptr, &my_background, PNG_BACKGROUND_GAMMA_SCREEN, + 0, Display_Gamma); + } + + if (info_ptr->bit_depth == 16) + png_set_strip_16(png_ptr); + + if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY || + info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (info_ptr->bit_depth == 1) + pinfo->colType = F_BWDITHER; + else + pinfo->colType = F_GREYSCALE; + png_set_expand(png_ptr); + } + + pass=png_set_interlace_handling(png_ptr); + + png_read_update_info(png_ptr, info_ptr); + + if(info_ptr->color_type == PNG_COLOR_TYPE_RGB || + info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { + linesize = pinfo->w * 3; + pinfo->colType = F_FULLCOLOR; + pinfo->type = PIC24; + } else { + linesize = pinfo->w; + pinfo->type = PIC8; + if(info_ptr->color_type == PNG_COLOR_TYPE_GRAY || + info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { + for(i = 0; i < 256; i++) + pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i; + } else { + pinfo->colType = F_FULLCOLOR; + for(i = 0; i < info_ptr->num_palette; i++) { + pinfo->r[i] = info_ptr->palette[i].red; + pinfo->g[i] = info_ptr->palette[i].green; + pinfo->b[i] = info_ptr->palette[i].blue; + } + } + } + pinfo->pic = calloc((size_t)(linesize*pinfo->h), (size_t)1); + + if(!pinfo->pic) { + png_error(png_ptr, "can't allocate space for PNG image"); + } + + png_start_read_image(png_ptr); + + for(i = 0; i < pass; i++) { + byte *p = pinfo->pic; + for(j = 0; j < pinfo->h; j++) { + png_read_row(png_ptr, p, NULL); + read_anything = 1; + if((j & 0x1f) == 0) WaitCursor(); + p += linesize; + } + } + + png_read_end(png_ptr, info_ptr); + + if(info_ptr->num_text > 0) { + commentsize = 1; + + for(i = 0; i < info_ptr->num_text; i++) + commentsize += strlen(info_ptr->text[i].key) + 1 + + info_ptr->text[i].text_length + 2; + + if((pinfo->comment = malloc(commentsize)) == NULL) { + png_warning(png_ptr,"can't allocate comment string"); + } + else { + pinfo->comment[0] = '\0'; + for(i = 0; i < info_ptr->num_text; i++) { + strcat(pinfo->comment, info_ptr->text[i].key); + strcat(pinfo->comment, "::"); + strcat(pinfo->comment, info_ptr->text[i].text); + strcat(pinfo->comment, "\n"); + } + } + } + + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + + fclose(fp); + + return 1; + } + + + /*******************************************/ + static void + png_xv_error(png_ptr, message) + /* + png_struct *png_ptr; + char *message; + */ + png_structp png_ptr; + png_const_charp message; + { + SetISTR(ISTR_WARNING,"%s: libpng error: %s", fbasename, message); + + longjmp(png_ptr->jmpbuf, 1); + } + + + /*******************************************/ + static void + png_xv_warning(png_ptr, message) + /* + png_struct *png_ptr; + char *message; + */ + png_structp png_ptr; + png_const_charp message; + { + if (!png_ptr) + return; + + SetISTR(ISTR_WARNING,"%s: libpng warning: %s", fbasename, message); + } + + #endif diff -r -c -P xv-3.10a_before_patch/xvpopup.c xv-3.10a/xvpopup.c *** xv-3.10a_before_patch/xvpopup.c Thu Jan 19 13:09:31 1995 --- xv-3.10a/xvpopup.c Thu Feb 24 12:05:31 2000 *************** *** 200,213 **** if (!padHaveDooDads) { DCreate(&padWDial, popW, 16, puhigh-16-100-1,75,100, ! 1, 2048, pWIDE, 10, infofg, infobg, hicol, locol, "Width", NULL); DCreate(&padHDial, popW, 16+1+75, puhigh-16-100-1,75,100, ! 1, 2048, pHIGH, 10, infofg, infobg, hicol, locol, "Height", NULL); DCreate(&padODial, popW, 16+1+75+75+9, puhigh-16-100-1,75,100, ! 0, 100, 100, 10, infofg, infobg, hicol, locol, "Opaque", NULL); MBCreate(&padMthdMB, popW, 100-2+44, 10, 140, 19, NULL, --- 200,213 ---- if (!padHaveDooDads) { DCreate(&padWDial, popW, 16, puhigh-16-100-1,75,100, ! 1.0, 2048.0, (double)pWIDE, 1.0, 10.0, infofg, infobg, hicol, locol, "Width", NULL); DCreate(&padHDial, popW, 16+1+75, puhigh-16-100-1,75,100, ! 1.0, 2048.0, (double)pHIGH, 1.0, 10.0, infofg, infobg, hicol, locol, "Height", NULL); DCreate(&padODial, popW, 16+1+75+75+9, puhigh-16-100-1,75,100, ! 0.0, 100.0, 100.0, 1.0, 10.0, infofg, infobg, hicol, locol, "Opaque", NULL); MBCreate(&padMthdMB, popW, 100-2+44, 10, 140, 19, NULL, *************** *** 258,266 **** else if (poptyp == ISPAD) { BTSetActive(&bts[0], (int) strlen(gsBuf)); i = pWIDE * 3; RANGE(i,2048,9999); ! DSetRange(&padWDial, 1, i, padWDial.val, 10); i = pHIGH * 3; RANGE(i,2048,9999); ! DSetRange(&padHDial, 1, i, padHDial.val, 10); DSetActive(&padWDial, (padMode!=PAD_LOAD)); /* DSetRange activates dial */ DSetActive(&padHDial, (padMode!=PAD_LOAD)); --- 258,266 ---- else if (poptyp == ISPAD) { BTSetActive(&bts[0], (int) strlen(gsBuf)); i = pWIDE * 3; RANGE(i,2048,9999); ! DSetRange(&padWDial, 1.0, (double)i, padWDial.val, 1.0, 10.0); i = pHIGH * 3; RANGE(i,2048,9999); ! DSetRange(&padHDial, 1.0, (double)i, padHDial.val, 1.0, 10.0); DSetActive(&padWDial, (padMode!=PAD_LOAD)); /* DSetRange activates dial */ DSetActive(&padHDial, (padMode!=PAD_LOAD)); *************** *** 465,473 **** changedGSBuf(); /* careful! popW doesn't exist yet! */ if (padHaveDooDads) { ! oldW = padWDial.val; ! oldH = padHDial.val; ! oldO = padODial.val; } else { oldW = pWIDE; oldH = pHIGH; oldO = 100; } --- 465,473 ---- changedGSBuf(); /* careful! popW doesn't exist yet! */ if (padHaveDooDads) { ! oldW = (int)padWDial.val; ! oldH = (int)padHDial.val; ! oldO = (int)padODial.val; } else { oldW = pWIDE; oldH = pHIGH; oldO = 100; } *************** *** 486,494 **** } if (rv == 1) { /* cancelled: restore normal values */ ! DSetVal(&padWDial, oldW); ! DSetVal(&padHDial, oldH); ! DSetVal(&padODial, oldO); } XUnmapWindow(theDisp, padWDial.win); --- 486,494 ---- } if (rv == 1) { /* cancelled: restore normal values */ ! DSetVal(&padWDial, (double)oldW); ! DSetVal(&padHDial, (double)oldH); ! DSetVal(&padODial, (double)oldO); } XUnmapWindow(theDisp, padWDial.win); *************** *** 498,506 **** /* load up return values */ *pMode = padMode; *pStr = padBuf; ! *pWide = padWDial.val; ! *pHigh = padHDial.val; ! *pOpaque = padODial.val; *pOmode = padOMode; return rv; --- 498,506 ---- /* load up return values */ *pMode = padMode; *pStr = padBuf; ! *pWide = (int)padWDial.val; ! *pHigh = (int)padHDial.val; ! *pOpaque = (int)padODial.val; *pOmode = padOMode; return rv; *************** *** 560,565 **** --- 560,566 ---- nams[*lenp] = (char *) malloc((size_t) 32); if (!nams[*lenp]) { free(vals[*lenp]); continue; } strncpy(nams[*lenp], vals[*lenp], (size_t) 31); + nams[*lenp][31] = '\0'; } if (strlen(nams[*lenp]) > (size_t) 20) { /* fix long names */ *************** *** 972,979 **** else if (popUp == ISPAD) { if (PTINRECT(x, y, padDButt.x, padDButt.y, padDButt.w, padDButt.h)) { if (BTTrack(&padDButt)) { ! DSetVal(&padWDial, pWIDE); ! DSetVal(&padHDial, pHIGH); } } --- 973,980 ---- else if (popUp == ISPAD) { if (PTINRECT(x, y, padDButt.x, padDButt.y, padDButt.w, padDButt.h)) { if (BTTrack(&padDButt)) { ! DSetVal(&padWDial, (double)pWIDE); ! DSetVal(&padHDial, (double)pHIGH); } } diff -r -c -P xv-3.10a_before_patch/xvps.c xv-3.10a/xvps.c *** xv-3.10a_before_patch/xvps.c Thu Dec 22 17:34:42 1994 --- xv-3.10a/xvps.c Thu Feb 24 12:05:31 2000 *************** *** 139,147 **** CBCreate(&encapsCB, psW, 240, 7, "preview", infofg, infobg, hicol, locol); CBCreate(&pscompCB, psW, 331, 7, "compress", infofg, infobg, hicol, locol); ! DCreate(&xsDial, psW, 240, 30, 80, 100, 10, 800, 100, 5, infofg, infobg, hicol, locol, "Width", "%"); ! DCreate(&ysDial, psW, 331, 30, 80, 100, 10, 800, 100, 5, infofg, infobg, hicol, locol, "Height", "%"); xsDial.drawobj = changedScale; ysDial.drawobj = changedScale; --- 139,147 ---- CBCreate(&encapsCB, psW, 240, 7, "preview", infofg, infobg, hicol, locol); CBCreate(&pscompCB, psW, 331, 7, "compress", infofg, infobg, hicol, locol); ! DCreate(&xsDial, psW, 240, 30, 80, 100, 10.0, 800.0, 100.0, 0.5, 5.0, infofg, infobg, hicol, locol, "Width", "%"); ! DCreate(&ysDial, psW, 331, 30, 80, 100, 10.0, 800.0, 100.0, 0.5, 5.0, infofg, infobg, hicol, locol, "Height", "%"); xsDial.drawobj = changedScale; ysDial.drawobj = changedScale; *************** *** 236,245 **** if (rd_int("psres")) { /* xv.psres: default paper resolution */ if (def_int >= 10 && def_int <= 720) { ! int i = (int) ((PIX2INCH * 100) / def_int); ! DSetVal(&xsDial, i); ! DSetVal(&ysDial, i); } } --- 236,245 ---- if (rd_int("psres")) { /* xv.psres: default paper resolution */ if (def_int >= 10 && def_int <= 720) { ! double v = (PIX2INCH * 100) / def_int; ! DSetVal(&xsDial, v); ! DSetVal(&ysDial, v); } } *************** *** 836,842 **** if (scx < scy) { sz_iny = h * scx; } else { sz_inx = w * scy; } ! DSetVal(&xsDial, (int) ((100 * (sz_inx * PIX2INCH) / w) + .5)); DSetVal(&ysDial, xsDial.val); sz_inx = (double) w / PIX2INCH * (xsDial.val / 100.0); --- 836,842 ---- if (scx < scy) { sz_iny = h * scx; } else { sz_inx = w * scy; } ! DSetVal(&xsDial, 100 * (sz_inx * PIX2INCH) / w); DSetVal(&ysDial, xsDial.val); sz_inx = (double) w / PIX2INCH * (xsDial.val / 100.0); diff -r -c -P xv-3.10a_before_patch/xvtext.c xv-3.10a/xvtext.c *** xv-3.10a_before_patch/xvtext.c Fri Jan 13 18:46:28 1995 --- xv-3.10a/xvtext.c Thu Feb 24 12:05:31 2000 *************** *** 293,298 **** --- 293,299 ---- tv->textlen = len; tv->freeonclose = freeonclose; strncpy(tv->title, title, (size_t) TITLELEN-1); + tv->title[TITLELEN-1] = '\0'; computeText(tv); /* compute # lines and linestarts array */ diff -r -c -P xv-3.10a_before_patch/xvtiff.c xv-3.10a/xvtiff.c *** xv-3.10a_before_patch/xvtiff.c Fri Jan 13 14:53:34 1995 --- xv-3.10a/xvtiff.c Thu Feb 24 12:05:31 2000 *************** *** 1,7 **** /* * xvtiff.c - load routine for 'TIFF' format pictures * ! * LoadTIFF(fname, numcols) - load a TIFF file */ #ifndef va_start --- 1,7 ---- /* * xvtiff.c - load routine for 'TIFF' format pictures * ! * LoadTIFF(fname, numcols, quick) - load a TIFF file */ #ifndef va_start *************** *** 15,20 **** --- 15,49 ---- #include "tiffio.h" /* has to be after xv.h, as it needs varargs/stdarg */ + /* Portions fall under the following copyright: + * + * Copyright (c) 1992, 1993, 1994 Sam Leffler + * Copyright (c) 1992, 1993, 1994 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + + + static int copyTiff PARM((TIFF *, char *)); + static int cpStrips PARM((TIFF *, TIFF *)); + static int cpTiles PARM((TIFF *, TIFF *)); static byte *loadPalette PARM((TIFF *, uint32, uint32, int, int, PICINFO *)); static byte *loadColor PARM((TIFF *, uint32, uint32, int, int, PICINFO *)); static int loadImage PARM((TIFF *, uint32, uint32, byte *, int)); *************** *** 28,46 **** static int error_occurred; /*******************************************/ ! int LoadTIFF(fname, pinfo) ! char *fname; PICINFO *pinfo; /*******************************************/ { /* returns '1' on success, '0' on failure */ TIFF *tif; uint32 w, h; short bps, spp, photo, orient; FILE *fp; byte *pic8; char *desc, oldpath[MAXPATHLEN+1], tmppath[MAXPATHLEN+1], *sp; error_occurred = 0; --- 57,79 ---- static int error_occurred; /*******************************************/ ! int LoadTIFF(fname, pinfo, quick) ! char *fname; PICINFO *pinfo; + int quick; /*******************************************/ { /* returns '1' on success, '0' on failure */ TIFF *tif; uint32 w, h; + float xres, yres; short bps, spp, photo, orient; FILE *fp; byte *pic8; char *desc, oldpath[MAXPATHLEN+1], tmppath[MAXPATHLEN+1], *sp; + char tmp[256], tmpname[256]; + int i, nump; error_occurred = 0; *************** *** 60,65 **** --- 93,100 ---- filesize = ftell(fp); fclose(fp); + + rmap = pinfo->r; gmap = pinfo->g; bmap = pinfo->b; /* a kludge: temporarily cd to the directory that the file is in (if *************** *** 81,89 **** } } ! tif=TIFFOpen(filename,"r"); if (!tif) return 0; /* flip orientation so that image comes in X order */ --- 116,172 ---- } } + + nump = 1; + + if (!quick) { + /* see if there's more than 1 image in tiff file, to determine if we + should do multi-page thing... */ + + tif = TIFFOpen(filename,"r"); + if (!tif) return 0; + while (TIFFReadDirectory(tif)) nump++; + TIFFClose(tif); + if (DEBUG) + fprintf(stderr,"LoadTIFF: %d page%s found\n", nump, nump==1 ? "" : "s"); + + /* if there are multiple images, copy them out to multiple tmp files, + and load the first one... */ + + xv_mktemp(tmpname, "xvpgXXXXXX"); + + if (tmpname[0] == '\0') { /* mktemp() blew up */ + sprintf(str,"LoadTIFF: Unable to create temporary filename???"); + ErrPopUp(str, "\nHow unlikely!"); + return 0; + } + + if (nump>1) { + TIFF *in, *out; + + in = TIFFOpen(filename, "r"); + if (!in) return 0; + for (i=1; i<=nump; i++) { + sprintf(tmp, "%s%d", tmpname, i); + if (!copyTiff(in, tmp)) { + SetISTR(ISTR_WARNING, "LoadTIFF: Error writing page files!"); + break; + } + + if (!TIFFReadDirectory(in)) break; + } + if (DEBUG) + fprintf(stderr,"LoadTIFF: %d page%s written\n", + i-1, (i-1)==1 ? "" : "s"); + + sprintf(tmp, "%s%d", tmpname, 1); /* open page #1 */ + filename = tmp; + } + } /* if (!quick) ... */ + ! tif = TIFFOpen(filename,"r"); if (!tif) return 0; /* flip orientation so that image comes in X order */ *************** *** 107,112 **** --- 190,200 ---- TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &bps); TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photo); TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &spp); + if ((TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres) == 1) && + (TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres) == 1)) { + normaspect = yres / xres; + if (DEBUG) fprintf(stderr,"TIFF aspect = %f\n", normaspect); + } if (spp == 1) { pic8 = loadPalette(tif, w, h, photo, bps, pinfo); *************** *** 139,144 **** --- 227,234 ---- if (pic8) free(pic8); if (pinfo->comment) free(pinfo->comment); pinfo->comment = (char *) NULL; + if (!quick && nump>1) KillPageFiles(tmpname, nump); + SetCursors(-1); return 0; } *************** *** 148,164 **** --- 238,404 ---- pinfo->normw = pinfo->w; pinfo->normh = pinfo->h; pinfo->frmType = F_TIFF; + if (nump>1) strcpy(pinfo->pagebname, tmpname); + pinfo->numpages = nump; if (pinfo->pic) return 1; + /* failed. if we malloc'd a comment, free it */ if (pinfo->comment) free(pinfo->comment); pinfo->comment = (char *) NULL; + if (!quick && nump>1) KillPageFiles(tmpname, nump); + SetCursors(-1); + return 0; } + + + /*******************************************/ + + #define CopyField(tag, v) \ + if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) + #define CopyField2(tag, v1, v2) \ + if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2) + #define CopyField3(tag, v1, v2, v3) \ + if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3) + + + /*******************************************/ + static int copyTiff(in, fname) + TIFF *in; + char *fname; + { + /* copies tiff image to given filename. Returns 0 on error */ + + TIFF *out; + short bitspersample, samplesperpixel, shortv, *shortav; + uint32 w, l; + float floatv; + char *stringv; + uint32 longv; + uint16 *red, *green, *blue, shortv2; + int rv; + + out = TIFFOpen(fname, "w"); + if (!out) return 0; + + CopyField (TIFFTAG_SUBFILETYPE, longv); + CopyField (TIFFTAG_TILEWIDTH, w); + CopyField (TIFFTAG_TILELENGTH, l); + CopyField (TIFFTAG_IMAGEWIDTH, w); + CopyField (TIFFTAG_IMAGELENGTH, l); + CopyField (TIFFTAG_BITSPERSAMPLE, bitspersample); + CopyField (TIFFTAG_COMPRESSION, shortv); + CopyField (TIFFTAG_PREDICTOR, shortv); + CopyField (TIFFTAG_PHOTOMETRIC, shortv); + CopyField (TIFFTAG_THRESHHOLDING, shortv); + CopyField (TIFFTAG_FILLORDER, shortv); + CopyField (TIFFTAG_ORIENTATION, shortv); + CopyField (TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); + CopyField (TIFFTAG_MINSAMPLEVALUE, shortv); + CopyField (TIFFTAG_MAXSAMPLEVALUE, shortv); + CopyField (TIFFTAG_XRESOLUTION, floatv); + CopyField (TIFFTAG_YRESOLUTION, floatv); + CopyField (TIFFTAG_GROUP3OPTIONS, longv); + CopyField (TIFFTAG_GROUP4OPTIONS, longv); + CopyField (TIFFTAG_RESOLUTIONUNIT, shortv); + CopyField (TIFFTAG_PLANARCONFIG, shortv); + CopyField (TIFFTAG_ROWSPERSTRIP, longv); + CopyField (TIFFTAG_XPOSITION, floatv); + CopyField (TIFFTAG_YPOSITION, floatv); + CopyField (TIFFTAG_IMAGEDEPTH, longv); + CopyField (TIFFTAG_TILEDEPTH, longv); + CopyField2(TIFFTAG_EXTRASAMPLES, shortv, shortav); + CopyField3(TIFFTAG_COLORMAP, red, green, blue); + CopyField2(TIFFTAG_PAGENUMBER, shortv, shortv2); + CopyField (TIFFTAG_ARTIST, stringv); + CopyField (TIFFTAG_IMAGEDESCRIPTION,stringv); + CopyField (TIFFTAG_MAKE, stringv); + CopyField (TIFFTAG_MODEL, stringv); + CopyField (TIFFTAG_SOFTWARE, stringv); + CopyField (TIFFTAG_DATETIME, stringv); + CopyField (TIFFTAG_HOSTCOMPUTER, stringv); + CopyField (TIFFTAG_PAGENAME, stringv); + CopyField (TIFFTAG_DOCUMENTNAME, stringv); + + if (TIFFIsTiled(in)) rv = cpTiles (in, out); + else rv = cpStrips(in, out); + + TIFFClose(out); + return rv; + } + + + /*******************************************/ + static int cpStrips(in, out) + TIFF *in, *out; + { + tsize_t bufsize; + byte *buf; + + bufsize = TIFFStripSize(in); + buf = (byte *) malloc((size_t) bufsize); + if (buf) { + tstrip_t s, ns = TIFFNumberOfStrips(in); + uint32 *bytecounts; + + TIFFGetField(in, TIFFTAG_STRIPBYTECOUNTS, &bytecounts); + for (s = 0; s < ns; s++) { + if (bytecounts[s] > bufsize) { + buf = (unsigned char *) realloc(buf, (size_t) bytecounts[s]); + if (!buf) return (0); + bufsize = bytecounts[s]; + } + if (TIFFReadRawStrip (in, s, buf, (tsize_t) bytecounts[s]) < 0 || + TIFFWriteRawStrip(out, s, buf, (tsize_t) bytecounts[s]) < 0) { + free(buf); + return 0; + } + } + free(buf); + return 1; + } + return 0; + } + + + /*******************************/ + static int cpTiles(in, out) + TIFF *in, *out; + { + tsize_t bufsize; + byte *buf; + + bufsize = TIFFTileSize(in); + buf = (unsigned char *) malloc((size_t) bufsize); + if (buf) { + ttile_t t, nt = TIFFNumberOfTiles(in); + uint32 *bytecounts; + + TIFFGetField(in, TIFFTAG_TILEBYTECOUNTS, &bytecounts); + for (t = 0; t < nt; t++) { + if (bytecounts[t] > bufsize) { + buf = (unsigned char *)realloc(buf, (size_t) bytecounts[t]); + if (!buf) return (0); + bufsize = bytecounts[t]; + } + if (TIFFReadRawTile (in, t, buf, (tsize_t) bytecounts[t]) < 0 || + TIFFWriteRawTile(out, t, buf, (tsize_t) bytecounts[t]) < 0) { + free(buf); + return 0; + } + } + free(buf); + return 1; + } + return 0; + } + + /*******************************************/ static byte *loadPalette(tif, w, h, photo, bps, pinfo) TIFF *tif; *************** *** 186,192 **** break; } ! sprintf(pinfo->shrtInfo, "%ux%u TIFF.",w,h); pic8 = (byte *) malloc((size_t) w*h); if (!pic8) FatalError("loadPalette() - couldn't malloc 'pic8'"); --- 426,432 ---- break; } ! sprintf(pinfo->shrtInfo, "%lux%lu TIFF.",w,h); pic8 = (byte *) malloc((size_t) w*h); if (!pic8) FatalError("loadPalette() - couldn't malloc 'pic8'"); *************** *** 301,310 **** static byte **BWmap; static byte **PALmap; ! typedef void (*tileContigRoutine) PARM((byte*, u_char*, RGBvalue*, uint32, uint32, int, int)); ! typedef void (*tileSeparateRoutine) PARM((byte*, u_char*, u_char*, u_char*, RGBvalue*, uint32, uint32, int, int)); --- 541,554 ---- static byte **BWmap; static byte **PALmap; ! /* XXXX Work around some collisions with the new library. */ ! #define tileContigRoutine _tileContigRoutine ! #define tileSeparateRoutine _tileSeparateRoutine ! ! typedef void (*xvtileContigRoutine) PARM((byte*, u_char*,RGBvalue*, uint32, uint32, int, int)); ! typedef void (*xvtileSeparateRoutine) PARM((byte*, u_char*,u_char*, u_char*, RGBvalue*, uint32, uint32, int, int)); *************** *** 340,346 **** uint32, uint32, int, int)); static void put4bitbwtile PARM((byte *, u_char *, RGBvalue *, uint32, uint32, int, int)); ! static void put16bitbwtile PARM((byte *, u_char *, RGBvalue *, uint32, uint32, int, int)); static void putRGBcontig8bittile PARM((byte *, u_char *, RGBvalue *, --- 584,590 ---- uint32, uint32, int, int)); static void put4bitbwtile PARM((byte *, u_char *, RGBvalue *, uint32, uint32, int, int)); ! static void put16bitbwtile PARM((byte *, u_short *, RGBvalue *, uint32, uint32, int, int)); static void putRGBcontig8bittile PARM((byte *, u_char *, RGBvalue *, *************** *** 366,373 **** static void putcontig8bitYCbCrtile PARM((byte *, u_char *, RGBvalue *, uint32, uint32, int, int)); ! static tileContigRoutine pickTileContigCase PARM((RGBvalue *)); ! static tileSeparateRoutine pickTileSeparateCase PARM((RGBvalue *)); /*******************************************/ --- 610,617 ---- static void putcontig8bitYCbCrtile PARM((byte *, u_char *, RGBvalue *, uint32, uint32, int, int)); ! static xvtileContigRoutine pickTileContigCase PARM((RGBvalue*)); ! static xvtileSeparateRoutine pickTileSeparateCase PARM((RGBvalue*)); /*******************************************/ *************** *** 641,647 **** u_char *buf; int fromskew, toskew; u_int nrow; ! tileContigRoutine put; put = pickTileContigCase(Map); if (put == 0) return (0); --- 885,891 ---- u_char *buf; int fromskew, toskew; u_int nrow; ! xvtileContigRoutine put; put = pickTileContigCase(Map); if (put == 0) return (0); *************** *** 708,714 **** int tilesize; int fromskew, toskew; u_int nrow; ! tileSeparateRoutine put; put = pickTileSeparateCase(Map); if (put == 0) return (0); --- 952,958 ---- int tilesize; int fromskew, toskew; u_int nrow; ! xvtileSeparateRoutine put; put = pickTileSeparateCase(Map); if (put == 0) return (0); *************** *** 779,785 **** { uint32 row, y, nrow; u_char *buf; ! tileContigRoutine put; uint32 rowsperstrip; uint32 imagewidth; int scanline; --- 1023,1029 ---- { uint32 row, y, nrow; u_char *buf; ! xvtileContigRoutine put; uint32 rowsperstrip; uint32 imagewidth; int scanline; *************** *** 832,838 **** u_char *r, *g, *b; uint32 row, y, nrow; int scanline; ! tileSeparateRoutine put; uint32 rowsperstrip; uint32 imagewidth; u_int stripsize; --- 1076,1082 ---- u_char *r, *g, *b; uint32 row, y, nrow; int scanline; ! xvtileSeparateRoutine put; uint32 rowsperstrip; uint32 imagewidth; u_int stripsize; *************** *** 1014,1020 **** #define CASE4(x,op) switch (x) { case 3: op; case 2: op; case 1: op; } #define UNROLL8(w, op1, op2) { \ ! uint32 x; \ for (x = w; x >= 8; x -= 8) { \ op1; \ REPEAT8(op2); \ --- 1258,1264 ---- #define CASE4(x,op) switch (x) { case 3: op; case 2: op; case 1: op; } #define UNROLL8(w, op1, op2) { \ ! uint32 x; \ for (x = w; x >= 8; x -= 8) { \ op1; \ REPEAT8(op2); \ *************** *** 1026,1032 **** } #define UNROLL4(w, op1, op2) { \ ! register uint32 x; \ for (x = w; x >= 4; x -= 4) { \ op1; \ REPEAT4(op2); \ --- 1270,1276 ---- } #define UNROLL4(w, op1, op2) { \ ! uint32 x; \ for (x = w; x >= 4; x -= 4) { \ op1; \ REPEAT4(op2); \ *************** *** 1038,1044 **** } #define UNROLL2(w, op1, op2) { \ ! register uint32 x; \ for (x = w; x >= 2; x -= 2) { \ op1; \ REPEAT2(op2); \ --- 1282,1288 ---- } #define UNROLL2(w, op1, op2) { \ ! uint32 x; \ for (x = w; x >= 2; x -= 2) { \ op1; \ REPEAT2(op2); \ *************** *** 1065,1071 **** int fromskew, toskew; { while (h-- > 0) { ! UNROLL8(w,0, *cp++ = PALmap[*pp++][0]); cp += toskew; pp += fromskew; } --- 1309,1315 ---- int fromskew, toskew; { while (h-- > 0) { ! UNROLL8(w,, *cp++ = PALmap[*pp++][0]); cp += toskew; pp += fromskew; } *************** *** 1218,1224 **** */ static void put16bitbwtile(cp, pp, Map, w, h, fromskew, toskew) byte *cp; ! u_char *pp; RGBvalue *Map; uint32 w, h; int fromskew, toskew; --- 1462,1468 ---- */ static void put16bitbwtile(cp, pp, Map, w, h, fromskew, toskew) byte *cp; ! u_short *pp; RGBvalue *Map; uint32 w, h; int fromskew, toskew; *************** *** 1227,1234 **** while (h-- > 0) { for (x=w; x>0; x--) { ! *cp++ = Map[(pp[0] << 8) + pp[1]]; ! pp += 2; } cp += toskew; pp += fromskew; --- 1471,1477 ---- while (h-- > 0) { for (x=w; x>0; x--) { ! *cp++ = Map[*pp++]; } cp += toskew; pp += fromskew; *************** *** 1262,1268 **** } } else { while (h-- > 0) { ! UNROLL8(w,0, *cp++ = pp[0]; *cp++ = pp[1]; *cp++ = pp[2]; --- 1505,1511 ---- } } else { while (h-- > 0) { ! UNROLL8(w,, *cp++ = pp[0]; *cp++ = pp[1]; *cp++ = pp[2]; *************** *** 1335,1341 **** } } else { while (h-- > 0) { ! UNROLL8(w,0, *cp++ = *r++; *cp++ = *g++; *cp++ = *b++; --- 1578,1584 ---- } } else { while (h-- > 0) { ! UNROLL8(w,, *cp++ = *r++; *cp++ = *g++; *cp++ = *b++; *************** *** 1381,1387 **** } } ! #define Code2V(c, RB, RW, CR) ((((c)-(int)RB)*(float)CR)/(float)(RW-RB)) #define CLAMP(f,min,max) \ (int)((f)+.5 < (min) ? (min) : (f)+.5 > (max) ? (max) : (f)+.5) --- 1624,1630 ---- } } ! #define Code2V(c, RB, RW, CR) (((((int)c)-(int)RB)*(float)CR)/(float)(RW-RB)) #define CLAMP(f,min,max) \ (int)((f)+.5 < (min) ? (min) : (f)+.5 > (max) ? (max) : (f)+.5) *************** *** 1489,1504 **** /* * Select the appropriate conversion routine for packed data. */ ! static tileContigRoutine pickTileContigCase(Map) RGBvalue* Map; { ! tileContigRoutine put = 0; switch (photometric) { case PHOTOMETRIC_RGB: switch (bitspersample) { ! case 8: put = (tileContigRoutine) putRGBcontig8bittile; break; ! case 16: put = (tileContigRoutine) putRGBcontig16bittile; break; } break; --- 1732,1747 ---- /* * Select the appropriate conversion routine for packed data. */ ! static xvtileContigRoutine pickTileContigCase(Map) RGBvalue* Map; { ! xvtileContigRoutine put = 0; switch (photometric) { case PHOTOMETRIC_RGB: switch (bitspersample) { ! case 8: put = putRGBcontig8bittile; break; ! case 16: put = (xvtileContigRoutine) putRGBcontig16bittile; break; } break; *************** *** 1514,1520 **** case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: switch (bitspersample) { ! case 16: put = put16bitbwtile; break; case 8: put = putgreytile; break; case 4: put = put4bitbwtile; break; case 2: put = put2bitbwtile; break; --- 1757,1763 ---- case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: switch (bitspersample) { ! case 16: put = (xvtileContigRoutine) put16bitbwtile; break; /* pbj */ case 8: put = putgreytile; break; case 4: put = put4bitbwtile; break; case 2: put = put2bitbwtile; break; *************** *** 1540,1555 **** * NB: we assume that unpacked single channel data is directed * to the "packed routines. */ ! static tileSeparateRoutine pickTileSeparateCase(Map) RGBvalue* Map; { ! tileSeparateRoutine put = 0; switch (photometric) { case PHOTOMETRIC_RGB: switch (bitspersample) { ! case 8: put = (tileSeparateRoutine) putRGBseparate8bittile; break; ! case 16: put = (tileSeparateRoutine) putRGBseparate16bittile; break; } break; } --- 1783,1798 ---- * NB: we assume that unpacked single channel data is directed * to the "packed routines. */ ! static xvtileSeparateRoutine pickTileSeparateCase(Map) RGBvalue* Map; { ! xvtileSeparateRoutine put = 0; switch (photometric) { case PHOTOMETRIC_RGB: switch (bitspersample) { ! case 8: put = (xvtileSeparateRoutine) putRGBseparate8bittile; break; ! case 16: put = (xvtileSeparateRoutine) putRGBseparate16bittile; break; } break; } diff -r -c -P xv-3.10a_before_patch/xvxwd.c xv-3.10a/xvxwd.c *** xv-3.10a_before_patch/xvxwd.c Thu Dec 22 17:34:40 1994 --- xv-3.10a/xvxwd.c Thu Feb 24 12:05:31 2000 *************** *** 396,406 **** h11P->pixmap_width; bits_per_item = h11P->bitmap_unit; - bits_used = bits_per_item; bits_per_pixel = h11P->bits_per_pixel; byte_order = h11P->byte_order; bit_order = h11P->bitmap_bit_order; if (bits_per_pixel == sizeof(pixel_mask) * 8) pixel_mask = (CARD32) -1; else pixel_mask = (1 << bits_per_pixel) - 1; --- 396,428 ---- h11P->pixmap_width; bits_per_item = h11P->bitmap_unit; bits_per_pixel = h11P->bits_per_pixel; byte_order = h11P->byte_order; bit_order = h11P->bitmap_bit_order; + + /* add sanity-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; + + + + if (bits_per_pixel == sizeof(pixel_mask) * 8) pixel_mask = (CARD32) -1; else pixel_mask = (1 << bits_per_pixel) - 1;