You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							2489 lines
						
					
					
						
							72 KiB
						
					
					
				
			
		
		
	
	
							2489 lines
						
					
					
						
							72 KiB
						
					
					
				| # --- SDE-COPYRIGHT-NOTE-BEGIN --- | |
| # This copyright note is auto-generated by ./scripts/Create-CopyPatch. | |
| # | |
| # Filename: package/.../xv/xv.patch | |
| # Copyright (C) 2004 - 2006 The T2 SDE Project | |
| # Copyright (C) 1998 - 2003 Clifford Wolf | |
| # | |
| # More information can be found in the files COPYING and README. | |
| # | |
| # This patch file is dual-licensed. It is available under the license the | |
| # patched project is licensed under, as long as it is an OpenSource license | |
| # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms | |
| # of the GNU General Public License as published by the Free Software | |
| # Foundation; either version 2 of the License, or (at your option) any later | |
| # version. | |
| # --- SDE-COPYRIGHT-NOTE-END --- | |
|  | |
| diff -uNr Makefile Makefile | |
| --- ./Makefile	Mon Jan 23 21:20:54 1995 | |
| +++ ./Makefile	Tue Feb 20 17:48:33 2001 | |
| @@ -28,10 +28,10 @@ | |
|   | |
|   | |
|  ### Installation locations | |
| -BINDIR = /usr/local/bin | |
| -MANDIR = /usr/local/man/man1 | |
| +BINDIR = /usr/bin | |
| +MANDIR = /usr/man/man1 | |
|  MANSUF = 1 | |
| -LIBDIR = /usr/local/lib | |
| +LIBDIR = /usr/lib | |
|   | |
|   | |
|  buildit: all | |
| @@ -45,26 +45,31 @@ | |
|  ### 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 | |
| +JPEG    = -DDOJPEG | |
| +JPEGLIB = -ljpeg | |
| + | |
| + | |
| +### | |
| +### if, for whatever reason, you're unable to get the PNG library to compile | |
| +### on your machine, *COMMENT OUT* the following lines | |
| +### | |
| +PNG    = -DDOPNG | |
| +PNGLIB = -lpng | |
| + | |
| + | |
| +### | |
| +### if, for whatever reason, you're unable to get the PNG library to compile | |
| +### on your machine, *COMMENT OUT* the following lines | |
| +### | |
| +ZLIBLIB = -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)' ) | |
| +TIFF    = -DDOTIFF | |
| +TIFFLIB = -ltiff | |
|   | |
|   | |
|  ### | |
| @@ -184,11 +189,11 @@ | |
|   | |
|   | |
|   | |
| -CFLAGS = $(CCOPTS) $(JPEG) $(JPEGINC) $(TIFF) $(TIFFINC) $(PDS) \ | |
| +CFLAGS = $(CCOPTS) $(JPEG) $(TIFF) $(PDS) \ | |
|  	$(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \ | |
| -	$(DXWM) $(MCHN) | |
| +	$(DXWM) $(MCHN) $(PNG) | |
|   | |
| -LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) -lm | |
| +LIBS = -lX11 -L/usr/X11/lib $(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,7 +201,7 @@ | |
|  	xvdial.o xvgraf.o xvsunras.o xvjpeg.o xvps.o xvpopup.o xvdflt.o \ | |
|  	xvtiff.o xvtiffwr.o xvpds.o xvrle.o xviris.o xvgrab.o vprintf.o \ | |
|  	xvbrowse.o xvtext.o xvpcx.o xviff.o xvtarga.o xvxpm.o xvcut.o \ | |
| -	xvxwd.o xvfits.o | |
| +	xvxwd.o xvfits.o xvpng.o | |
|   | |
|  MISC = README INSTALL CHANGELOG IDEAS | |
|   | |
| @@ -206,10 +211,10 @@ | |
|   | |
|   | |
|   | |
| -all: $(JPEGLIB) $(TIFFLIB) xv bggen vdcomp xcmap xvpictoppm | |
| +all: xv bggen vdcomp xcmap xvpictoppm | |
|   | |
|   | |
| -xv: $(OBJS) $(JPEGLIB) $(TIFFLIB) | |
| +xv: $(OBJS) | |
|  	$(CC) -o xv $(CFLAGS) $(OBJS) $(LIBS) | |
|   | |
|  bggen: bggen.c | |
| @@ -267,7 +272,7 @@ | |
|  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 | |
| +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 -uNr Makefile.std Makefile.std | |
| --- ./Makefile.std	Tue Jan 24 02:06:26 1995 | |
| +++ ./Makefile.std	Tue Feb 20 17:04:44 2001 | |
| @@ -56,6 +56,25 @@ | |
|   | |
|   | |
|  ### | |
| +### 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,9 +205,9 @@ | |
|   | |
|  CFLAGS = $(CCOPTS) $(JPEG) $(JPEGINC) $(TIFF) $(TIFFINC) $(PDS) \ | |
|  	$(NODIRENT) $(VPRINTF) $(TIMERS) $(UNIX) $(BSDTYPES) $(RAND) \ | |
| -	$(DXWM) $(MCHN) | |
| +	$(DXWM) $(MCHN) $(PNG) $(PNGINC) $(ZLIBINC) | |
|   | |
| -LIBS = -lX11 $(JPEGLIB) $(TIFFLIB) -lm | |
| +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,7 +215,7 @@ | |
|  	xvdial.o xvgraf.o xvsunras.o xvjpeg.o xvps.o xvpopup.o xvdflt.o \ | |
|  	xvtiff.o xvtiffwr.o xvpds.o xvrle.o xviris.o xvgrab.o vprintf.o \ | |
|  	xvbrowse.o xvtext.o xvpcx.o xviff.o xvtarga.o xvxpm.o xvcut.o \ | |
| -	xvxwd.o xvfits.o | |
| +	xvxwd.o xvfits.o xvpng.o | |
|   | |
|  MISC = README INSTALL CHANGELOG IDEAS | |
|   | |
| @@ -267,7 +286,7 @@ | |
|  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 | |
| +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 -uNr bits/br_png bits/br_png | |
| --- ./bits/br_png	Thu Jan  1 01:00:00 1970 | |
| +++ ./bits/br_png	Thu Jun 13 23:32:08 1996 | |
| @@ -0,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 -uNr config.h config.h | |
| --- ./config.h	Thu Jan  5 19:49:21 1995 | |
| +++ ./config.h	Tue Feb 20 17:07:25 2001 | |
| @@ -13,13 +13,13 @@ | |
|   * definition appropriately. (use 'which gunzip' to find if you have gunzip,  | |
|   * and where it lives) | |
|   */ | |
| -#undef USE_GUNZIP | |
| +#define USE_GUNZIP | |
|   | |
|  #ifdef USE_GUNZIP | |
|  #  ifdef VMS | |
|  #    define GUNZIP "UNCOMPRESS" | |
|  #  else | |
| -#    define GUNZIP "/usr/local/bin/gunzip -q" | |
| +#    define GUNZIP "/bin/gunzip -q" | |
|  #  endif | |
|  #endif | |
|   | |
| @@ -88,9 +88,9 @@ | |
|   * should not need to be changed | |
|   */ | |
|   | |
| -/* #define GS_PATH "/usr/local/bin/gs" */ | |
| -/* #define GS_LIB  "."                 */ | |
| -/* #define GS_DEV  "ppmraw"            */ | |
| +#define GS_PATH "/usr/bin/gs" | |
| +#define GS_LIB  "." | |
| +#define GS_DEV  "ppmraw" | |
|   | |
|   | |
|  /*************************************************************************** | |
| diff -uNr xcmap.c xcmap.c | |
| --- ./xcmap.c	Tue Jan  3 22:14:52 1995 | |
| +++ ./xcmap.c	Tue Feb 20 17:04:13 2001 | |
| @@ -140,8 +140,13 @@ | |
|      nxcells = nycells = 8; | |
|    else if (dispcells>4) | |
|      nxcells = nycells = 4; | |
| -  else | |
| +  else if (dispcells>2) | |
|      nxcells = nycells = 2; | |
| +  else | |
| +  { | |
| +    nxcells = 2; | |
| +    nycells = 1; | |
| +  } | |
|     | |
|    /**************** Create/Open X Resources ***************/ | |
|    if ((mfinfo = XLoadQueryFont(theDisp,FONT))==NULL) { | |
| @@ -267,18 +272,25 @@ | |
|     | |
|    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); | |
| +  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 -uNr xv.c xv.c | |
| --- ./xv.c	Thu Jan 19 19:08:43 1995 | |
| +++ ./xv.c	Tue Feb 20 17:04:44 2001 | |
| @@ -277,6 +277,10 @@ | |
|    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,6 +786,10 @@ | |
|    XSetTransientForHint(theDisp, tiffW, dirW); | |
|  #endif | |
|     | |
| +#ifdef HAVE_PNG | |
| +  CreatePNGW(); | |
| +  XSetTransientForHint(theDisp, pngW, dirW); | |
| +#endif | |
|     | |
|    LoadFishCursors(); | |
|    SetCursors(-1); | |
| @@ -2611,6 +2619,11 @@ | |
|  	   (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 || | |
| @@ -2669,6 +2682,10 @@ | |
|   | |
|  #ifdef HAVE_TIFF | |
|    case RFT_TIFF:    rv = LoadTIFF  (fname, pinfo);           break; | |
| +#endif | |
| + | |
| +#ifdef HAVE_PNG | |
| +  case RFT_PNG:     rv = LoadPNG   (fname, pinfo);         break; | |
|  #endif | |
|   | |
|  #ifdef HAVE_PDS | |
| diff -uNr xv.h xv.h | |
| --- ./xv.h	Mon Jan 23 21:22:23 1995 | |
| +++ ./xv.h	Tue Feb 20 17:10:11 2001 | |
| @@ -8,8 +8,8 @@ | |
|  #include "config.h" | |
|   | |
|   | |
| -#define REVDATE   "Version 3.10a  Rev: 12/29/94" | |
| -#define VERSTR    "3.10a" | |
| +#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 | |
| @@ -116,7 +116,7 @@ | |
|  #  include <errno.h> | |
|     extern int   errno;             /* SHOULD be in errno.h, but often isn't */ | |
|  #  ifndef __NetBSD__ | |
| -     extern char *sys_errlist[];     /* this too... */ | |
| +//     extern char *sys_errlist[];     /* this too... */ | |
|  #  endif | |
|  #endif | |
|   | |
| @@ -327,6 +327,10 @@ | |
|  #define HAVE_TIFF | |
|  #endif | |
|   | |
| +#ifdef DOPNG | |
| +#define HAVE_PNG | |
| +#endif | |
| + | |
|  #ifdef DOPDS | |
|  #define HAVE_PDS | |
|  #endif | |
| @@ -458,24 +462,31 @@ | |
|  #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_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 */ | |
| +#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,6 +516,7 @@ | |
|  #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,9 +777,10 @@ | |
|  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 */ | |
| +		 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,6 +1167,13 @@ | |
|  #endif | |
|   | |
|   | |
| +#ifdef HAVE_PNG | |
| +/* stuff used for 'png' box */ | |
| +WHERE Window        pngW; | |
| +WHERE int           pngUp;        /* is pngW mapped, or what? */ | |
| +#endif | |
| + | |
| + | |
|  #undef WHERE | |
|   | |
|   | |
| @@ -1465,12 +1485,12 @@ | |
|   | |
|   | |
|  /*************************** 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 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 *, int, int, int, int)); | |
| -void DSetVal               PARM((DIAL *, int)); | |
| +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)); | |
| @@ -1612,6 +1632,13 @@ | |
|  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 -uNr xvbrowse.c xvbrowse.c | |
| --- ./xvbrowse.c	Thu Jan 19 18:49:17 1995 | |
| +++ ./xvbrowse.c	Tue Feb 20 17:04:44 2001 | |
| @@ -55,6 +55,7 @@ | |
|  #include "bits/br_xpm" | |
|  #include "bits/br_xwd" | |
|  #include "bits/br_fits" | |
| +#include "bits/br_png" | |
|   | |
|  #include "bits/br_trash" | |
|  #include "bits/fcurs" | |
| @@ -94,7 +95,8 @@ | |
|  #define BF_XPM      25 | |
|  #define BF_XWD      26 | |
|  #define BF_FITS     27 | |
| -#define BF_MAX      28    /* # of built-in icons */ | |
| +#define BF_PNG      28 | |
| +#define BF_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,6 +526,7 @@ | |
|    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 */ | |
| @@ -3020,6 +3023,7 @@ | |
|      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,6 +3571,7 @@ | |
|    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 -uNr xvdial.c xvdial.c | |
| --- ./xvdial.c	Tue Jan  3 22:20:31 1995 | |
| +++ ./xvdial.c	Tue Feb 20 17:04:44 2001 | |
| @@ -41,20 +41,21 @@ | |
|   | |
|   | |
|  /* local functions */ | |
| -static int  whereInDial     PARM((DIAL *, int, int)); | |
| -static void drawArrow       PARM((DIAL *)); | |
| -static void drawValStr      PARM((DIAL *)); | |
| -static void drawButt        PARM((DIAL *, int, int)); | |
| -static int  computeDialVal  PARM((DIAL *, int, int)); | |
| -static void dimDial         PARM((DIAL *)); | |
| +static int    whereInDial     PARM((DIAL *, int, int)); | |
| +static void   drawArrow       PARM((DIAL *)); | |
| +static void   drawValStr      PARM((DIAL *)); | |
| +static void   drawButt        PARM((DIAL *, int, int)); | |
| +static double computeDialVal  PARM((DIAL *, int, int)); | |
| +static void   dimDial         PARM((DIAL *)); | |
|   | |
|   | |
|  /***************************************************/ | |
| -void DCreate(dp, parent, x, y, w, h, minv, maxv, curv, page,  | |
| +void DCreate(dp, parent, x, y, w, h, minv, maxv, curv, inc, page,  | |
|  	          fg, bg, hi, lo, title, units) | |
|  DIAL         *dp; | |
|  Window        parent; | |
| -int           x,y,w,h,minv,maxv,curv,page; | |
| +int           x,y,w,h; | |
| +double        minv,maxv,curv,inc,page; | |
|  unsigned long fg,bg,hi,lo; | |
|  char         *title, *units; | |
|  { | |
| @@ -98,18 +99,18 @@ | |
|  				1,fg,bg); | |
|    if (!dp->win) FatalError("can't create dial window"); | |
|   | |
| -  DSetRange(dp, minv, maxv, curv, page); | |
| +  DSetRange(dp, minv, maxv, curv, inc, page); | |
|    XSelectInput(theDisp, dp->win, ExposureMask | ButtonPressMask); | |
|  } | |
|   | |
|   | |
|  /***************************************************/ | |
| -void DSetRange(dp, minv, maxv, curv, page) | |
| -DIAL *dp; | |
| -int   minv, maxv, curv, page; | |
| +void DSetRange(dp, minv, maxv, curv, inc, page) | |
| +DIAL   *dp; | |
| +double  minv, maxv, curv, inc, page; | |
|  { | |
|    if (maxv<minv) maxv=minv; | |
| -  dp->min = minv;    dp->max = maxv;    dp->page = page; | |
| +  dp->min = minv; dp->max = maxv; dp->inc = inc; dp->page = page; | |
|    dp->active =  (minv < maxv); | |
|   | |
|    DSetVal(dp, curv); | |
| @@ -118,8 +119,8 @@ | |
|   | |
|  /***************************************************/ | |
|  void DSetVal(dp, curv) | |
| -DIAL *dp; | |
| -int   curv; | |
| +DIAL  *dp; | |
| +double curv; | |
|  { | |
|    RANGE(curv, dp->min, dp->max);   /* make sure curv is in-range */ | |
|   | |
| @@ -129,7 +130,7 @@ | |
|    XSetForeground(theDisp, theGC, dp->bg);  | |
|    drawArrow(dp); | |
|   | |
| -  dp->val = curv; | |
| +  dp->val = (double)((int)(curv / dp->inc + (curv > 0 ? 0.5 : -0.5))) * dp->inc; | |
|   | |
|    /* draw new arrow and string */ | |
|    XSetForeground(theDisp, theGC, dp->fg); | |
| @@ -202,7 +203,8 @@ | |
|  int mx,my; | |
|  { | |
|    Window       rW,cW; | |
| -  int          rx,ry, x,y, ipos, pos, lit, i, origval; | |
| +  int          rx, ry, x, y, ipos, pos, lit; | |
| +  double       origval; | |
|    unsigned int mask; | |
|   | |
|    lit = 0; | |
| @@ -224,9 +226,9 @@ | |
|    if (ipos != INDIAL) { | |
|      drawButt(dp, ipos, 1); | |
|      switch (ipos) { | |
| -    case INCW1:  if (dp->val < dp->max) DSetVal(dp, dp->val+1); break; | |
| +    case INCW1:  if (dp->val < dp->max) DSetVal(dp, dp->val+dp->inc);  break; | |
|      case INCW2:  if (dp->val < dp->max) DSetVal(dp, dp->val+dp->page); break; | |
| -    case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-1); break; | |
| +    case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->inc);  break; | |
|      case INCCW2: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->page); break; | |
|      } | |
|      if (dp->drawobj != NULL) (dp->drawobj)();   | |
| @@ -235,8 +237,9 @@ | |
|    } | |
|   | |
|    else {  | |
| -    i = computeDialVal(dp, mx, my); | |
| -    DSetVal(dp, i); | |
| +    double v; | |
| +    v = computeDialVal(dp, mx, my); | |
| +    DSetVal(dp, v); | |
|      if (dp->drawobj != NULL) (dp->drawobj)();   | |
|    } | |
|   | |
| @@ -246,11 +249,11 @@ | |
|      if (!(mask & Button1Mask)) break;    /* button released */ | |
|   | |
|      if (ipos == INDIAL) { | |
| -      int j; | |
| -      i = computeDialVal(dp, x, y); | |
| -      j = dp->val; | |
| -      DSetVal(dp, i); | |
| -      if (j != dp->val) { | |
| +      double v, w; | |
| +      v = computeDialVal(dp, x, y); | |
| +      w = dp->val; | |
| +      DSetVal(dp, v); | |
| +      if (w != dp->val) { | |
|  	/* track whatever dial controls */ | |
|  	if (dp->drawobj != NULL) (dp->drawobj)();   | |
|        } | |
| @@ -266,11 +269,11 @@ | |
|   | |
|        if (lit) { | |
|  	switch (ipos) { | |
| -	case INCW1:  if (dp->val < dp->max) DSetVal(dp, dp->val+1);  | |
| +	case INCW1:  if (dp->val < dp->max) DSetVal(dp, dp->val+dp->inc);  | |
|  	             break; | |
|  	case INCW2:  if (dp->val < dp->max) DSetVal(dp, dp->val+dp->page); | |
|                       break; | |
| -	case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-1); | |
| +	case INCCW1: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->inc); | |
|                       break; | |
|  	case INCCW2: if (dp->val > dp->min) DSetVal(dp, dp->val-dp->page); | |
|                       break; | |
| @@ -320,19 +323,20 @@ | |
|  static void drawArrow(dp) | |
|  DIAL *dp; | |
|  { | |
| -  int i, rad, cx, cy; | |
| +  int rad, cx, cy; | |
| +  double v; | |
|    XPoint arrow[4]; | |
|   | |
|    rad = dp->rad;  cx = dp->cx;  cy = dp->cy; | |
|   | |
|    /* map pos (range minv..maxv) into degrees (range 240..-60) */ | |
| -  i = 240 + (-300 * (dp->val - dp->min)) / (dp->max - dp->min); | |
| -  arrow[0].x = cx + (int) ((double) rad * .80 * cos(i * DEG2RAD)); | |
| -  arrow[0].y = cy - (int) ((double) rad * .80 * sin(i * DEG2RAD)); | |
| -  arrow[1].x = cx + (int) ((double) rad * .33 * cos((i+160) * DEG2RAD)); | |
| -  arrow[1].y = cy - (int) ((double) rad * .33 * sin((i+160) * DEG2RAD)); | |
| -  arrow[2].x = cx + (int) ((double) rad * .33 * cos((i-160) * DEG2RAD)); | |
| -  arrow[2].y = cy - (int) ((double) rad * .33 * sin((i-160) * DEG2RAD)); | |
| +  v = 240 + (-300 * (dp->val - dp->min)) / (dp->max - dp->min); | |
| +  arrow[0].x = cx + (int) ((double) rad * .80 * cos(v * DEG2RAD)); | |
| +  arrow[0].y = cy - (int) ((double) rad * .80 * sin(v * DEG2RAD)); | |
| +  arrow[1].x = cx + (int) ((double) rad * .33 * cos((v+160) * DEG2RAD)); | |
| +  arrow[1].y = cy - (int) ((double) rad * .33 * sin((v+160) * DEG2RAD)); | |
| +  arrow[2].x = cx + (int) ((double) rad * .33 * cos((v-160) * DEG2RAD)); | |
| +  arrow[2].y = cy - (int) ((double) rad * .33 * sin((v-160) * DEG2RAD)); | |
|    arrow[3].x = arrow[0].x; | |
|    arrow[3].y = arrow[0].y; | |
|    XDrawLines(theDisp, dp->win, theGC, arrow, 4, CoordModeOrigin); | |
| @@ -343,23 +347,37 @@ | |
|  static void drawValStr(dp) | |
|  DIAL *dp; | |
|  { | |
| -  int  i, x1, x2; | |
| +  int  tot, i, x1, x2; | |
|    char foo[60], foo1[60]; | |
|   | |
|    /* compute longest string necessary so we can right-align this thing */ | |
| -  sprintf(foo,"%d",dp->min);    x1 = strlen(foo); | |
| -  sprintf(foo,"%d",dp->max);    x2 = strlen(foo); | |
| +  sprintf(foo,"%d",(int)dp->min);    x1 = strlen(foo); | |
| +  sprintf(foo,"%d",(int)dp->max);    x2 = strlen(foo); | |
|    if (dp->min < 0 && dp->max > 0) x2++;   /* put '+' at beginning */ | |
|    i = x1;  if (x2>x1) i = x2; | |
|    if (dp->units) i += strlen(dp->units); | |
|   | |
| -  if (dp->min < 0 && dp->max > 0) sprintf(foo,"%+d", dp->val); | |
| -  else sprintf(foo,"%d", dp->val); | |
| +  sprintf(foo,"%g",dp->inc);   /* space for decimal values */ | |
| +  tot = i + strlen(foo) - 1;   /* Take away the 0 from the beginning */ | |
| + | |
| +  if (dp->min < 0.0 && dp->max > 0.0) sprintf(foo,"%+g", dp->val); | |
| +  else sprintf(foo,"%g", dp->val); | |
| + | |
| +  if (dp->inc < 1.0) | |
| +  { | |
| +    int j; | |
| + | |
| +    if (dp->val == (double)((int)dp->val)) | |
| +      strcat(foo,"."); | |
| + | |
| +    for (j = strlen(foo); j < tot; j++) | |
| +      strcat(foo,"0"); | |
| +  } | |
|   | |
|    if (dp->units) strcat(foo,dp->units); | |
|    foo1[0] = '\0'; | |
|    if (strlen(foo) < (size_t) i) { | |
| -    for (i = i - strlen(foo); i>0; i--) strcat(foo1," "); | |
| +    for (i-=strlen(foo);i>0;i--) strcat(foo1," "); | |
|    } | |
|    strcat(foo1, foo); | |
|   | |
| @@ -411,12 +429,13 @@ | |
|   | |
|   | |
|  /***************************************************/ | |
| -static int computeDialVal(dp, x, y) | |
| +static double computeDialVal(dp, x, y) | |
|  DIAL *dp; | |
|  int x, y; | |
|  { | |
| -  int dx, dy, val; | |
| -  double angle; | |
| +  int dx, dy; | |
| +  | |
| +  double angle, val; | |
|   | |
|    /* compute dx, dy (distance from cx, cy).  Note: +dy is *up* */ | |
|    dx = x - dp->cx;  dy = dp->cy - y; | |
| @@ -436,8 +455,10 @@ | |
|    if (angle > 270.0) angle -= 360.0; | |
|    if (angle < -90.0) angle += 360.0; | |
|   | |
| -  val = (int) ((dp->max - dp->min) * (240.0 - angle) / 300.0) + dp->min; | |
| +  val = ((dp->max - dp->min) * (240.0 - angle) / 300.0) + dp->min; | |
|   | |
| +  /* round value to be an even multiple of dp->inc */ | |
| +  val = (double)((int)(val / dp->inc + 0.5)) * dp->inc; | |
|    return val; | |
|  } | |
|   | |
| diff -uNr xvdir.c xvdir.c | |
| --- ./xvdir.c	Tue Jan  3 22:21:39 1995 | |
| +++ ./xvdir.c	Tue Feb 20 17:04:44 2001 | |
| @@ -62,6 +62,9 @@ | |
|  #ifdef HAVE_TIFF | |
|  			       "TIFF", | |
|  #endif | |
| +#ifdef HAVE_PNG | |
| +			       "PNG", | |
| +#endif | |
|  			       "PostScript", | |
|  			       "PBM/PGM/PPM (raw)", | |
|  			       "PBM/PGM/PPM (ascii)", | |
| @@ -1115,6 +1118,15 @@ | |
|    } | |
|  #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,7 +1180,8 @@ | |
|       | |
|    case F_XPM: | |
|      rv = WriteXPM   (fp, thepic, ptype, w, h, rp, gp, bp, nc, col,  | |
| -		     fullname, picComments);     | |
| +		     fullname, picComments); | |
| +    break; | |
|    case F_FITS: | |
|      rv = WriteFITS  (fp, thepic, ptype, w, h, rp, gp, bp, nc, col,  | |
|  		     picComments);     | |
| @@ -1380,14 +1393,21 @@ | |
|        (strcmp(lowsuf,"eps" )==0) || | |
|        (strcmp(lowsuf,"rgb" )==0) || | |
|        (strcmp(lowsuf,"tga" )==0) || | |
| -      (strcmp(lowsuf,"xpm" )==0) || | |
|        (strcmp(lowsuf,"fits")==0) || | |
|        (strcmp(lowsuf,"fts" )==0) || | |
| +#ifdef HAVE_JPEG | |
|        (strcmp(lowsuf,"jpg" )==0) || | |
|        (strcmp(lowsuf,"jpeg")==0) || | |
|        (strcmp(lowsuf,"jfif")==0) || | |
| +#endif | |
| +#ifdef HAVE_TIFF | |
|        (strcmp(lowsuf,"tif" )==0) || | |
| -      (strcmp(lowsuf,"tiff")==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,6 +1442,10 @@ | |
|   | |
|  #ifdef HAVE_TIFF | |
|      case F_TIFF:     strcpy(lowsuf,"tif");  break; | |
| +#endif | |
| + | |
| +#ifdef HAVE_PNG | |
| +    case F_PNG:      strcpy(lowsuf,"png");  break; | |
|  #endif | |
|      } | |
|   | |
| diff -uNr xvevent.c xvevent.c | |
| --- ./xvevent.c	Tue Jan 24 00:20:24 1995 | |
| +++ ./xvevent.c	Tue Feb 20 17:04:44 2001 | |
| @@ -154,7 +154,7 @@ | |
|       int    *donep; | |
|  { | |
|    static int wasInfoUp=0, wasCtrlUp=0, wasDirUp=0, wasGamUp=0, wasPsUp=0; | |
| -  static int wasJpegUp=0, wasTiffUp=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,6 +233,10 @@ | |
|      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,6 +363,10 @@ | |
|        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,6 +546,10 @@ | |
|  #ifdef HAVE_TIFF | |
|  	if (wasTiffUp) { TIFFDialog(wasTiffUp);  wasTiffUp=0; } | |
|  #endif | |
| + | |
| +#ifdef HAVE_PNG | |
| +	if (wasPngUp)  { PNGDialog(wasJpegUp);   wasPngUp=0; } | |
| +#endif | |
|        } | |
|      } | |
|    } | |
| @@ -576,6 +588,10 @@ | |
|  #ifdef HAVE_TIFF | |
|  	  if (tiffUp) { wasTiffUp = tiffUp;  TIFFDialog(0); } | |
|  #endif | |
| + | |
| +#ifdef HAVE_PNG | |
| +	  if (pngUp)  { wasPngUp  = pngUp;   PNGDialog(0); } | |
| +#endif | |
|  	} | |
|        } | |
|      } | |
| @@ -1147,6 +1163,10 @@ | |
|      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,6 +1386,10 @@ | |
|      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,6 +2394,10 @@ | |
|   | |
|  #ifdef HAVE_TIFF | |
|    if (tiffUp) TIFFDialog(0);  /* close tiff window */ | |
| +#endif | |
| + | |
| +#ifdef HAVE_PNG | |
| +  if (pngUp) PNGDialog(0);    /* close png window */ | |
|  #endif | |
|   | |
|    ClosePopUp(); | |
| diff -uNr xvgam.c xvgam.c | |
| --- ./xvgam.c	Fri Jan 13 20:51:14 1995 | |
| +++ ./xvgam.c	Tue Feb 20 17:04:44 2001 | |
| @@ -265,11 +265,11 @@ | |
|    BTCreate(&gbut[G_BRNDCOL], cmapF,  5 + 66 + 67 + 2, 189, 66, BUTTH,  | |
|  	   "Random", infofg, infobg, hicol, locol); | |
|   | |
| -  DCreate(&rhDial, cmapF, 5, 215, 66, 100,   0,360,180, 5,  | |
| +  DCreate(&rhDial, cmapF, 5, 215, 66, 100,   0.0, 360.0, 180.0, 1.0, 5.0,  | |
|  	  infofg, infobg, hicol, locol, "Hue", NULL); | |
| -  DCreate(&gsDial, cmapF, 72, 215, 66, 100,  0,360,180, 5,  | |
| +  DCreate(&gsDial, cmapF, 72, 215, 66, 100,  0.0, 360.0, 180.0, 1.0, 5.0,  | |
|  	  infofg, infobg, hicol, locol, "Sat.", NULL); | |
| -  DCreate(&bvDial, cmapF, 139, 215, 66, 100,   0,360,180, 5,  | |
| +  DCreate(&bvDial, cmapF, 139, 215, 66, 100, 0.0, 360.0, 180.0, 1.0, 5.0,  | |
|  	  infofg, infobg, hicol, locol, "Value", NULL); | |
|   | |
|    rhDial.drawobj = gsDial.drawobj = bvDial.drawobj = dragEditColor; | |
| @@ -359,7 +359,7 @@ | |
|   | |
|    srcHD.drawobj = dstHD.drawobj = whtHD.drawobj = dragHueDial; | |
|   | |
| -  DCreate(&satDial, hsvF, 100, 199, 100, 121, -100, 100, 0, 5,  | |
| +  DCreate(&satDial, hsvF, 100, 199, 100, 121, -100.0, 100.0, 0.0, 1.0, 5.0,  | |
|  	   infofg, infobg,hicol,locol, "Saturation", "%"); | |
|   | |
|    hueRB = RBCreate(NULL, hsvF,  7, 153, "1",  | |
| @@ -722,7 +722,7 @@ | |
|   | |
|    if (whtHD.enabCB.val && whtHD.satval) hsvnonlinear++; | |
|   | |
| -  if (satDial.val != 0) hsvnonlinear++; | |
| +  if (satDial.val != 0.0) hsvnonlinear++; | |
|   | |
|    /* check intensity graf */ | |
|    for (i=0; i<256 && intGraf.func[i]==i; i++); | |
| @@ -1291,14 +1291,14 @@ | |
|      rgb2hsv(rcmap[editColor], gcmap[editColor], bcmap[editColor], &h, &s, &v); | |
|      if (h<0) h = 0; | |
|   | |
| -    DSetVal(&rhDial, (int) h); | |
| -    DSetVal(&gsDial, (int) (s*100)); | |
| -    DSetVal(&bvDial, (int) (v*100)); | |
| +    DSetVal(&rhDial, h); | |
| +    DSetVal(&gsDial, s*100); | |
| +    DSetVal(&bvDial, v*100); | |
|    } | |
|    else { | |
| -    DSetVal(&rhDial, rcmap[editColor]); | |
| -    DSetVal(&gsDial, gcmap[editColor]); | |
| -    DSetVal(&bvDial, bcmap[editColor]); | |
| +    DSetVal(&rhDial, (double)rcmap[editColor]); | |
| +    DSetVal(&gsDial, (double)gcmap[editColor]); | |
| +    DSetVal(&bvDial, (double)bcmap[editColor]); | |
|    } | |
|  } | |
|     | |
| @@ -1310,16 +1310,15 @@ | |
|   | |
|    if (hsvmode) { | |
|      int rv, gv, bv; | |
| -    hsv2rgb((double) rhDial.val, ((double) gsDial.val) / 100.0,  | |
| -	    ((double) bvDial.val) / 100.0, &rv, &gv, &bv); | |
| +    hsv2rgb(rhDial.val, gsDial.val / 100.0, bvDial.val / 100.0, &rv, &gv, &bv); | |
|      rcmap[editColor] = rv; | |
|      gcmap[editColor] = gv; | |
|      bcmap[editColor] = bv; | |
|    } | |
|    else { | |
| -    rcmap[editColor] = rhDial.val; | |
| -    gcmap[editColor] = gsDial.val; | |
| -    bcmap[editColor] = bvDial.val; | |
| +    rcmap[editColor] = (int)rhDial.val; | |
| +    gcmap[editColor] = (int)gsDial.val; | |
| +    bcmap[editColor] = (int)bvDial.val; | |
|    } | |
|  } | |
|   | |
| @@ -1561,9 +1560,9 @@ | |
|      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); | |
| +    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,9 +1580,9 @@ | |
|  	    &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); | |
| +    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,7 +1890,7 @@ | |
|      } | |
|   | |
|      /* apply satDial value to s */ | |
| -    s = s + ((double) satDial.val) / 100.0; | |
| +    s = s + satDial.val / 100.0; | |
|      if (s<0.0) s = 0.0; | |
|      if (s>1.0) s = 1.0; | |
|   | |
| @@ -2007,7 +2006,7 @@ | |
|   | |
|    gs->hueRBnum = RBWhich(hueRB); | |
|   | |
| -  gs->satval = satDial.val; | |
| +  gs->satval = (int)satDial.val; | |
|    GetGrafState(&intGraf,&gs->istate); | |
|    GetGrafState(&rGraf,  &gs->rstate); | |
|    GetGrafState(&gGraf,  &gs->gstate); | |
| @@ -2064,8 +2063,8 @@ | |
|      changed++; | |
|    } | |
|       | |
| -  if (gs->satval != satDial.val) { | |
| -    DSetVal(&satDial,gs->satval); | |
| +  if (gs->satval != (int)satDial.val) { | |
| +    DSetVal(&satDial,(double)gs->satval); | |
|      changed++; | |
|    } | |
|   | |
| @@ -3200,7 +3199,7 @@ | |
|   | |
|    if (whtHD.enabCB.val && whtHD.satval) hsvmod++; | |
|   | |
| -  if (satDial.val != 0) hsvmod++; | |
| +  if (satDial.val != 0.0) hsvmod++; | |
|   | |
|    /* check intensity graf */ | |
|    for (i=0; i<256; i++) { | |
| @@ -3284,7 +3283,7 @@ | |
|        } | |
|   | |
|        /* apply satDial value to s */ | |
| -      s = s + satDial.val; | |
| +      s = s + (int)satDial.val; | |
|        if (s<  0) s =   0; | |
|        if (s>100) s = 100; | |
|   | |
| diff -uNr xvjpeg.c xvjpeg.c | |
| --- ./xvjpeg.c	Thu Jan  5 09:17:13 1995 | |
| +++ ./xvjpeg.c	Tue Feb 20 17:49:14 2001 | |
| @@ -12,8 +12,8 @@ | |
|   | |
|  #include <setjmp.h> | |
|   | |
| -#include "jpeglib.h" | |
| -#include "jerror.h" | |
| +#include <jpeglib.h> | |
| +#include <jerror.h> | |
|   | |
|  #define CREATOR_STR "CREATOR: " | |
|   | |
| @@ -51,11 +51,11 @@ | |
|  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)); | |
| +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)); | |
| +METHODDEF(boolean)     xv_process_comment PARM((j_decompress_ptr)); | |
|  static    int          writeJFIF          PARM((FILE *, byte *, int,int,int)); | |
|   | |
|   | |
| @@ -87,10 +87,10 @@ | |
|     | |
|    XSelectInput(theDisp, jpegW, ExposureMask | ButtonPressMask | KeyPressMask); | |
|     | |
| -  DCreate(&qDial, jpegW, 10, 10, 80, 100, 1, 100, 75, 5,  | |
| +  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, 100, 0, 5,  | |
| +  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,7 +400,7 @@ | |
|   | |
|   | |
|  /**************************************************/ | |
| -METHODDEF void xv_error_exit(cinfo)  | |
| +METHODDEF (void) xv_error_exit(cinfo)  | |
|       j_common_ptr cinfo; | |
|  { | |
|    my_error_ptr myerr; | |
| @@ -412,7 +412,7 @@ | |
|   | |
|   | |
|  /**************************************************/ | |
| -METHODDEF void xv_error_output(cinfo)  | |
| +METHODDEF (void) xv_error_output(cinfo)  | |
|       j_common_ptr cinfo; | |
|  { | |
|    my_error_ptr myerr; | |
| @@ -426,7 +426,7 @@ | |
|   | |
|   | |
|  /**************************************************/ | |
| -METHODDEF void xv_prog_meter(cinfo) | |
| +METHODDEF (void) xv_prog_meter(cinfo) | |
|       j_common_ptr cinfo; | |
|  { | |
|    struct jpeg_progress_mgr *prog; | |
| @@ -671,7 +671,7 @@ | |
|   | |
|   | |
|  /**************************************************/ | |
| -METHODDEF boolean xv_process_comment(cinfo) | |
| +METHODDEF (boolean) xv_process_comment(cinfo) | |
|       j_decompress_ptr cinfo; | |
|  { | |
|    int          length, hasnull; | |
| @@ -759,8 +759,8 @@ | |
|   | |
|   | |
|    jpeg_set_defaults(&cinfo); | |
| -  jpeg_set_quality(&cinfo, qDial.val, TRUE); | |
| -  cinfo.smoothing_factor = smDial.val; | |
| +  jpeg_set_quality(&cinfo, (int)qDial.val, TRUE); | |
| +  cinfo.smoothing_factor = (int)smDial.val; | |
|   | |
|   | |
|    jpeg_start_compress(&cinfo, TRUE); | |
| @@ -769,7 +769,7 @@ | |
|    /*** COMMENT HANDLING ***/ | |
|   | |
|    sprintf(xvcmt, "%sXV %s  Quality = %d, Smoothing = %d\n", | |
| -	  CREATOR_STR, REVDATE, qDial.val, smDial.val); | |
| +	  CREATOR_STR, REVDATE, (int)qDial.val, (int)smDial.val); | |
|     | |
|    if (picComments) {   /* append XV comment */ | |
|      char *sp, *sp1;  int done; | |
| diff -uNr xvmisc.c xvmisc.c | |
| --- ./xvmisc.c	Sat Jan 14 00:41:34 1995 | |
| +++ ./xvmisc.c	Tue Feb 20 17:04:44 2001 | |
| @@ -520,6 +520,10 @@ | |
|      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; | |
| @@ -715,6 +719,10 @@ | |
|     | |
|  #ifdef HAVE_TIFF | |
|    if (tiffW) XDefineCursor(theDisp, tiffW, otherc); | |
| +#endif | |
| + | |
| +#ifdef HAVE_PNG | |
| +  if (pngW)  XDefineCursor(theDisp, pngW, otherc); | |
|  #endif | |
|  } | |
|   | |
| diff -uNr xvpng.c xvpng.c | |
| --- ./xvpng.c	Thu Jan  1 01:00:00 1970 | |
| +++ ./xvpng.c	Tue Feb 20 17:49:44 2001 | |
| @@ -0,0 +1,965 @@ | |
| +/* | |
| + * 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 <[email protected]> | |
| + *   this file is a suplement to xv and is supplied under the same copying | |
| + *   conditions (except the shareware part) | |
| + * Modified by Andreas Dilger <[email protected]> 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 | |
| + | |
| +/*** 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_struct *png_ptr, char *message)); | |
| +static    void png_xv_warning PARM((png_struct *png_ptr, char *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, 2.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; i<P_NBUTTS; i++) BTRedraw(&pbut[i]); | |
| + | |
| +  DrawString(pngW,       15,  6+ASCENT,                          title); | |
| + | |
| +  sprintf(ctitle1, "Default = %d", COMPRESSION); | |
| +  DrawString(pngW,       18,  6+DHIGH+cDial.y+ASCENT,            ctitle1); | |
| +  DrawString(pngW,       17,  6+DHIGH+cDial.y+ASCENT+LINEHIGH,   ctitle2); | |
| +  DrawString(pngW,       17,  6+DHIGH+cDial.y+ASCENT+2*LINEHIGH, ctitle3); | |
| +  DrawString(pngW,       17,  6+DHIGH+cDial.y+ASCENT+3*LINEHIGH, ctitle4); | |
| + | |
| +  sprintf(gtitle, "Default = %g", DISPLAY_GAMMA); | |
| +  DrawString(pngW, DWIDE+30,  6+DHIGH+gDial.y+ASCENT,            gtitle); | |
| + | |
| +  ULineString(pngW, FdefCB.x, FdefCB.y-3-DESCENT, ftitle); | |
| +  XDrawRectangle(theDisp, pngW, theGC, FdefCB.x-11, FdefCB.y-LINEHIGH-3, | |
| +                                       93, 8*LINEHIGH+15); | |
| +  CBRedraw(&FdefCB); | |
| +  XDrawLine(theDisp, pngW, theGC, FdefCB.x-11, FdefCB.y+LINEHIGH+4, | |
| +                                  FdefCB.x+82, FdefCB.y+LINEHIGH+4); | |
| + | |
| +  CBRedraw(&FnoneCB); | |
| +  CBRedraw(&FupCB); | |
| +  CBRedraw(&FsubCB); | |
| +  CBRedraw(&FavgCB); | |
| +  CBRedraw(&FPaethCB); | |
| + | |
| +  CBRedraw(&interCB); | |
| + | |
| +  XSetClipMask(theDisp, theGC, None); | |
| +} | |
| + | |
| + | |
| +/*******************************************/ | |
| +static void clickPD(x,y) | |
| +     int x,y; | |
| +{ | |
| +  int i; | |
| +  BUTT *bp; | |
| + | |
| +  /* check BUTTs */ | |
| +   | |
| +  for (i=0; i<P_NBUTTS; i++) { | |
| +    bp = &pbut[i]; | |
| +    if (PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) break; | |
| +  } | |
| +   | |
| +  if (i<P_NBUTTS) {  /* found one */ | |
| +    if (BTTrack(bp)) doCmd(i); | |
| +  } | |
| + | |
| +  /* check CBUTTs */ | |
| + | |
| +  else if (CBClick(&FdefCB,x,y)) { | |
| +    int oldval = FdefCB.val; | |
| + | |
| +    CBTrack(&FdefCB); | |
| + | |
| +    if (oldval != FdefCB.val) | |
| +    { | |
| +      CBSetActive(&FnoneCB, !FdefCB.val); | |
| +      CBSetActive(&FsubCB, !FdefCB.val); | |
| +      CBSetActive(&FupCB, !FdefCB.val); | |
| +      CBSetActive(&FavgCB, !FdefCB.val); | |
| +      CBSetActive(&FPaethCB, !FdefCB.val); | |
| + | |
| +      CBRedraw(&FnoneCB); | |
| +      CBRedraw(&FupCB); | |
| +      CBRedraw(&FsubCB); | |
| +      CBRedraw(&FavgCB); | |
| +      CBRedraw(&FPaethCB); | |
| +    } | |
| +  } | |
| +  else if (CBClick(&FnoneCB,x,y))  CBTrack(&FnoneCB); | |
| +  else if (CBClick(&FsubCB,x,y))   CBTrack(&FsubCB); | |
| +  else if (CBClick(&FupCB,x,y))    CBTrack(&FupCB); | |
| +  else if (CBClick(&FavgCB,x,y))   CBTrack(&FavgCB); | |
| +  else if (CBClick(&FPaethCB,x,y)) CBTrack(&FPaethCB); | |
| +  else if (CBClick(&interCB,x,y))  CBTrack(&interCB); | |
| +} | |
| + | |
| + | |
| +/*******************************************/ | |
| +static void doCmd(cmd) | |
| +     int cmd; | |
| +{ | |
| +  switch (cmd) { | |
| +  case P_BOK: { | |
| +    char *fullname; | |
| + | |
| +    writePNG(); | |
| +    PNGDialog(0); | |
| +     | |
| +    fullname = GetDirFullName(); | |
| +    if (!ISPIPE(fullname[0])) { | |
| +      XVCreatedFile(fullname); | |
| +      StickInCtrlList(0); | |
| +    } | |
| +  } | |
| +    break; | |
| + | |
| +  case P_BCANC:  PNGDialog(0);  break; | |
| + | |
| +  default:        break; | |
| +  } | |
| +} | |
| + | |
| + | |
| +/*******************************************/ | |
| +static void writePNG() | |
| +{ | |
| +  FILE       *fp; | |
| +  int         w, h, nc, rv, ptype, pfree; | |
| +  byte       *inpix, *rmap, *gmap, *bmap; | |
| + | |
| +  fp = OpenOutFile(filename); | |
| +  if (!fp) return; | |
| + | |
| +  fbasename = BaseName(filename); | |
| + | |
| +  WaitCursor(); | |
| +  inpix = GenSavePic(&ptype, &w, &h, &pfree, &nc, &rmap, &gmap, &bmap); | |
| + | |
| +  rv = WritePNG(fp, inpix, ptype, w, h, rmap, gmap, bmap, nc); | |
| + | |
| +  SetCursors(-1); | |
| + | |
| +  if (CloseOutFile(fp, filename, rv) == 0) DirBox(0); | |
| + | |
| +  if (pfree) free(inpix); | |
| +} | |
| + | |
| + | |
| +/*******************************************/ | |
| +int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, numcols) | |
| +     FILE *fp; | |
| +     byte *pic; | |
| +     int   ptype, w, h; | |
| +     byte *rmap, *gmap, *bmap; | |
| +     int   numcols; | |
| +{ | |
| +  png_struct *png_ptr; | |
| +  png_info   *info_ptr; | |
| +  png_color   palette[256]; | |
| +  png_textp   text; | |
| +  byte        remap[256]; | |
| +  int         i, filter, linesize = 0, pass; | |
| +  byte       *p, *png_line; | |
| +  char        software[256]; | |
| +  char       *savecmnt = NULL; | |
| + | |
| +  if ((png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, | |
| +       png_xv_error, png_xv_warning)) == NULL) { | |
| +    FatalError("malloc failure in WritePNG"); | |
| +  } | |
| + | |
| +  if ((info_ptr = png_create_info_struct(png_ptr)) == NULL) | |
| +  { | |
| +    png_destroy_write_struct(&png_ptr, &info_ptr); | |
| +    FatalError("malloc failure in WritePNG"); | |
| +  } | |
| + | |
| +  if (setjmp(png_ptr->jmpbuf)) { | |
| +    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++) { | |
| +  fflush(stdout); | |
| +      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  /* rbg 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++; | |
| +          } | |
| +        } | |
| +        /* It is just a generic comment */ | |
| +        else { | |
| +          tp->key = "Comment"; | |
| +          tp->text = key; | |
| +          tp->text_length = strlen(tp->text); | |
| +          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); | |
| +  png_destroy_write_struct(&png_ptr, &info_ptr); | |
| + | |
| +  if (text) | |
| +  { | |
| +    free(text); | |
| +    if (savecmnt) | |
| +      free(savecmnt); | |
| +  } | |
| + | |
| +  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; | |
| +{ | |
| +  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; | |
| +{ | |
| +  if (!png_ptr) | |
| +    return; | |
| + | |
| +  SetISTR(ISTR_WARNING,"%s:  libpng warning: %s", fbasename, message); | |
| +} | |
| + | |
| +#endif | |
| diff -uNr xvpopup.c xvpopup.c | |
| --- ./xvpopup.c	Thu Jan 19 19:09:31 1995 | |
| +++ ./xvpopup.c	Tue Feb 20 17:04:44 2001 | |
| @@ -200,14 +200,14 @@ | |
|       | |
|      if (!padHaveDooDads) { | |
|        DCreate(&padWDial, popW, 16,      puhigh-16-100-1,75,100, | |
| -	      1, 2048, pWIDE, 10, | |
| +	      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, 2048, pHIGH, 10, | |
| +	      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, 100, 100, 10, | |
| +	      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,9 +258,9 @@ | |
|    else if (poptyp == ISPAD) { | |
|      BTSetActive(&bts[0], (int) strlen(gsBuf)); | |
|      i = pWIDE * 3;  RANGE(i,2048,9999);   | |
| -    DSetRange(&padWDial, 1, i, padWDial.val, 10); | |
| +    DSetRange(&padWDial, 1.0, (double)i, padWDial.val, 1.0, 10.0); | |
|      i = pHIGH * 3;  RANGE(i,2048,9999);   | |
| -    DSetRange(&padHDial, 1, i, padHDial.val, 10); | |
| +    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,9 +465,9 @@ | |
|    changedGSBuf();      /* careful!  popW doesn't exist yet! */ | |
|   | |
|    if (padHaveDooDads) {  | |
| -    oldW = padWDial.val;   | |
| -    oldH = padHDial.val; | |
| -    oldO = padODial.val; | |
| +    oldW = (int)padWDial.val;   | |
| +    oldH = (int)padHDial.val; | |
| +    oldO = (int)padODial.val; | |
|    } | |
|    else { oldW = pWIDE;  oldH = pHIGH;  oldO = 100; } | |
|   | |
| @@ -486,9 +486,9 @@ | |
|    } | |
|   | |
|    if (rv == 1) {   /* cancelled:  restore normal values */ | |
| -    DSetVal(&padWDial, oldW); | |
| -    DSetVal(&padHDial, oldH); | |
| -    DSetVal(&padODial, oldO); | |
| +    DSetVal(&padWDial, (double)oldW); | |
| +    DSetVal(&padHDial, (double)oldH); | |
| +    DSetVal(&padODial, (double)oldO); | |
|    } | |
|   | |
|    XUnmapWindow(theDisp, padWDial.win); | |
| @@ -498,9 +498,9 @@ | |
|    /* load up return values */ | |
|    *pMode   = padMode;   | |
|    *pStr    = padBuf;   | |
| -  *pWide   = padWDial.val; | |
| -  *pHigh   = padHDial.val; | |
| -  *pOpaque = padODial.val; | |
| +  *pWide   = (int)padWDial.val; | |
| +  *pHigh   = (int)padHDial.val; | |
| +  *pOpaque = (int)padODial.val; | |
|    *pOmode  = padOMode; | |
|   | |
|    return rv; | |
| @@ -972,8 +972,8 @@ | |
|    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); | |
| +	DSetVal(&padWDial, (double)pWIDE); | |
| +	DSetVal(&padHDial, (double)pHIGH); | |
|        } | |
|      } | |
|   | |
| diff -uNr xvps.c xvps.c | |
| --- ./xvps.c	Thu Dec 22 23:34:42 1994 | |
| +++ ./xvps.c	Tue Feb 20 17:04:44 2001 | |
| @@ -139,9 +139,9 @@ | |
|    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,  | |
| +  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, 800, 100, 5,  | |
| +  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,10 +236,10 @@ | |
|   | |
|    if (rd_int("psres")) {             /* xv.psres:  default paper resolution */ | |
|      if (def_int >= 10 && def_int <= 720) { | |
| -      int i = (int) ((PIX2INCH * 100) / def_int); | |
| +      double v = (PIX2INCH * 100) / def_int; | |
|   | |
| -      DSetVal(&xsDial, i); | |
| -      DSetVal(&ysDial, i); | |
| +      DSetVal(&xsDial, v); | |
| +      DSetVal(&ysDial, v); | |
|      } | |
|    } | |
|   | |
| @@ -836,7 +836,7 @@ | |
|    if (scx < scy) { sz_iny = h * scx; } | |
|              else { sz_inx = w * scy; } | |
|   | |
| -  DSetVal(&xsDial, (int) ((100 * (sz_inx * PIX2INCH) / w) + .5)); | |
| +  DSetVal(&xsDial, 100 * (sz_inx * PIX2INCH) / w); | |
|    DSetVal(&ysDial, xsDial.val); | |
|   | |
|    sz_inx = (double) w / PIX2INCH * (xsDial.val / 100.0);   | |
| diff -uNr xvtiff.c xvtiff.c | |
| --- ./xvtiff.c	Fri Jan 13 20:53:34 1995 | |
| +++ ./xvtiff.c	Tue Feb 20 17:50:02 2001 | |
| @@ -12,7 +12,7 @@ | |
|   | |
|  #ifdef HAVE_TIFF | |
|   | |
| -#include "tiffio.h"     /* has to be after xv.h, as it needs varargs/stdarg */ | |
| +#include <tiffio.h>     /* has to be after xv.h, as it needs varargs/stdarg */ | |
|   | |
|   | |
|  static byte *loadPalette PARM((TIFF *, uint32, uint32, int, int, PICINFO *)); | |
| @@ -186,7 +186,7 @@ | |
|      break; | |
|    } | |
|   | |
| -  sprintf(pinfo->shrtInfo, "%ux%u TIFF.",w,h); | |
| +  sprintf(pinfo->shrtInfo, "%lux%lu TIFF.",w,h); | |
|   | |
|    pic8 = (byte *) malloc((size_t) w*h); | |
|    if (!pic8) FatalError("loadPalette() - couldn't malloc 'pic8'"); | |
| @@ -214,7 +214,7 @@ | |
|  	   "???"), | |
|  	  filesize); | |
|   | |
| -  sprintf(pinfo->shrtInfo, "%ux%u TIFF.",w,h); | |
| +  sprintf(pinfo->shrtInfo, "%lux%lu TIFF.",w,h); | |
|   | |
|    /* allocate 24-bit image */ | |
|    pic24 = (byte *) malloc((size_t) w*h*3); | |
| @@ -301,10 +301,10 @@ | |
|  static	byte **BWmap; | |
|  static	byte **PALmap; | |
|   | |
| -typedef void (*tileContigRoutine)   PARM((byte*, u_char*, RGBvalue*,  | |
| +typedef void (*xvtileContigRoutine)   PARM((byte*, u_char*, RGBvalue*,  | |
|  					  uint32, uint32, int, int)); | |
|   | |
| -typedef void (*tileSeparateRoutine) PARM((byte*, u_char*, u_char*, u_char*,  | |
| +typedef void (*xvtileSeparateRoutine) PARM((byte*, u_char*, u_char*, u_char*,  | |
|                                           RGBvalue*, uint32, uint32, int, int)); | |
|   | |
|   | |
| @@ -366,8 +366,8 @@ | |
|  static void   putcontig8bitYCbCrtile  PARM((byte *, u_char *, RGBvalue *, | |
|  					  uint32, uint32, int, int)); | |
|   | |
| -static tileContigRoutine   pickTileContigCase   PARM((RGBvalue *)); | |
| -static tileSeparateRoutine pickTileSeparateCase PARM((RGBvalue *)); | |
| +static xvtileContigRoutine   pickTileContigCase   PARM((RGBvalue *)); | |
| +static xvtileSeparateRoutine pickTileSeparateCase PARM((RGBvalue *)); | |
|   | |
|   | |
|  /*******************************************/ | |
| @@ -641,7 +641,7 @@ | |
|    u_char *buf; | |
|    int fromskew, toskew; | |
|    u_int nrow; | |
| -  tileContigRoutine put; | |
| +  xvtileContigRoutine put; | |
|   | |
|    put = pickTileContigCase(Map); | |
|    if (put == 0) return (0); | |
| @@ -708,7 +708,7 @@ | |
|    int tilesize; | |
|    int fromskew, toskew; | |
|    u_int nrow; | |
| -  tileSeparateRoutine put; | |
| +  xvtileSeparateRoutine put; | |
|     | |
|    put = pickTileSeparateCase(Map); | |
|    if (put == 0) return (0); | |
| @@ -779,7 +779,7 @@ | |
|  { | |
|    uint32 row, y, nrow; | |
|    u_char *buf; | |
| -  tileContigRoutine put; | |
| +  xvtileContigRoutine put; | |
|    uint32 rowsperstrip; | |
|    uint32 imagewidth; | |
|    int scanline; | |
| @@ -832,7 +832,7 @@ | |
|    u_char *r, *g, *b; | |
|    uint32 row, y, nrow; | |
|    int scanline; | |
| -  tileSeparateRoutine put; | |
| +  xvtileSeparateRoutine put; | |
|    uint32 rowsperstrip; | |
|    uint32 imagewidth; | |
|    u_int stripsize; | |
| @@ -1065,7 +1065,7 @@ | |
|       int fromskew, toskew; | |
|  { | |
|    while (h-- > 0) { | |
| -    UNROLL8(w,0, *cp++ = PALmap[*pp++][0]); | |
| +    UNROLL8(w,, *cp++ = PALmap[*pp++][0]); | |
|      cp += toskew; | |
|      pp += fromskew; | |
|    } | |
| @@ -1262,7 +1262,7 @@ | |
|      } | |
|    } else { | |
|      while (h-- > 0) { | |
| -      UNROLL8(w,0, | |
| +      UNROLL8(w,, | |
|  	      *cp++ = pp[0]; | |
|  	      *cp++ = pp[1]; | |
|  	      *cp++ = pp[2]; | |
| @@ -1335,7 +1335,7 @@ | |
|      } | |
|    } else { | |
|      while (h-- > 0) { | |
| -      UNROLL8(w,0, | |
| +      UNROLL8(w,, | |
|  	      *cp++ = *r++; | |
|  	      *cp++ = *g++; | |
|  	      *cp++ = *b++; | |
| @@ -1489,16 +1489,16 @@ | |
|  /* | |
|   * Select the appropriate conversion routine for packed data. | |
|   */ | |
| -static tileContigRoutine pickTileContigCase(Map) | |
| +static xvtileContigRoutine pickTileContigCase(Map) | |
|       RGBvalue* Map; | |
|  { | |
| -  tileContigRoutine put = 0; | |
| +  xvtileContigRoutine put = 0; | |
|     | |
|    switch (photometric) { | |
|    case PHOTOMETRIC_RGB: | |
|      switch (bitspersample) { | |
| -    case 8:  put = (tileContigRoutine) putRGBcontig8bittile;   break; | |
| -    case 16: put = (tileContigRoutine) putRGBcontig16bittile;  break; | |
| +    case 8:  put = putRGBcontig8bittile;   break; | |
| +    case 16: put = (xvtileContigRoutine)putRGBcontig16bittile;  break; | |
|      } | |
|      break; | |
|       | |
| @@ -1540,16 +1540,16 @@ | |
|   * NB: we assume that unpacked single channel data is directed | |
|   *	 to the "packed routines. | |
|   */ | |
| -static tileSeparateRoutine pickTileSeparateCase(Map) | |
| +static xvtileSeparateRoutine pickTileSeparateCase(Map) | |
|       RGBvalue* Map; | |
|  { | |
| -  tileSeparateRoutine put = 0; | |
| +  xvtileSeparateRoutine put = 0; | |
|     | |
|    switch (photometric) { | |
|    case PHOTOMETRIC_RGB: | |
|      switch (bitspersample) { | |
| -    case  8: put = (tileSeparateRoutine) putRGBseparate8bittile;  break; | |
| -    case 16: put = (tileSeparateRoutine) putRGBseparate16bittile; break; | |
| +    case  8: put = (xvtileSeparateRoutine) putRGBseparate8bittile;  break; | |
| +    case 16: put = (xvtileSeparateRoutine) putRGBseparate16bittile; break; | |
|      } | |
|      break; | |
|    } | |
| diff -uNr xvtiffwr.c xvtiffwr.c | |
| --- ./xvtiffwr.c	Tue Jan  3 22:28:13 1995 | |
| +++ ./xvtiffwr.c	Tue Feb 20 17:50:12 2001 | |
| @@ -9,7 +9,7 @@ | |
|   | |
|  #ifdef HAVE_TIFF | |
|   | |
| -#include "tiffio.h"    /* has to be after xv.h, as it needs varargs/stdarg */ | |
| +#include <tiffio.h>    /* has to be after xv.h, as it needs varargs/stdarg */ | |
|   | |
|   | |
|  #define ALLOW_JPEG 0  /* set to '1' to allow 'JPEG' choice in dialog box */
 | |
| 
 |