summaryrefslogtreecommitdiff
path: root/graphics/xv
diff options
context:
space:
mode:
authorhubertf <hubertf>1999-06-13 16:23:52 +0000
committerhubertf <hubertf>1999-06-13 16:23:52 +0000
commit7c99e5dcd8d3cc56a988862d9de32fd5eb3779f8 (patch)
treeb67ec3d3ff525a13bce747cb3cf34dbcd5aebf0c /graphics/xv
parent6b7766249b73b252044fd8a05ab6b43eb862ce41 (diff)
downloadpkgsrc-7c99e5dcd8d3cc56a988862d9de32fd5eb3779f8.tar.gz
Add patches from
http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png to enable PNG support. Set PKGNAME to ${DISTNAME}pl1 to reflect this.
Diffstat (limited to 'graphics/xv')
-rw-r--r--graphics/xv/Makefile4
-rw-r--r--graphics/xv/patches/patch-png1975
-rw-r--r--graphics/xv/patches/patch-png2963
-rw-r--r--graphics/xv/patches/patch-png2-Imakefile96
-rw-r--r--graphics/xv/patches/patch-png2-Makefile67
-rw-r--r--graphics/xv/patches/patch-png2-Makefile.std68
-rw-r--r--graphics/xv/patches/patch-png2-xv.c57
-rw-r--r--graphics/xv/patches/patch-png2-xv.h162
-rw-r--r--graphics/xv/patches/patch-png2-xvbrowse.c53
-rw-r--r--graphics/xv/patches/patch-png2-xvdir.c83
-rw-r--r--graphics/xv/patches/patch-png2-xvevent.c97
-rw-r--r--graphics/xv/patches/patch-png339
12 files changed, 2663 insertions, 1 deletions
diff --git a/graphics/xv/Makefile b/graphics/xv/Makefile
index fb82f537f44..c491848adda 100644
--- a/graphics/xv/Makefile
+++ b/graphics/xv/Makefile
@@ -1,8 +1,9 @@
-# $NetBSD: Makefile,v 1.18 1999/04/13 15:31:06 agc Exp $
+# $NetBSD: Makefile,v 1.19 1999/06/13 16:23:52 hubertf Exp $
# FreeBSD Id: Makefile,v 1.14 1997/07/03 07:37:08 asami Exp
#
DISTNAME= xv-3.10a
+PKGNAME= ${DISTNAME}pl1
CATEGORIES= graphics x11
MASTER_SITES= ftp://ftp.cis.upenn.edu/pub/xv/ \
ftp://ftp.kuis.kyoto-u.ac.jp/X11/contrib/clients/xv/ \
@@ -19,6 +20,7 @@ HOMEPAGE= http://www-vis.lbl.gov/software/xv.html
DEPENDS+= tiff-3.4:../../graphics/tiff
DEPENDS+= jpeg-6b:../../graphics/jpeg
DEPENDS+= ghostscript-5.50:../../print/ghostscript5
+DEPENDS+= png-1.0.3:../png
USE_IMAKE= yes
diff --git a/graphics/xv/patches/patch-png1 b/graphics/xv/patches/patch-png1
new file mode 100644
index 00000000000..093ed331de5
--- /dev/null
+++ b/graphics/xv/patches/patch-png1
@@ -0,0 +1,975 @@
+$NetBSD: patch-png1,v 1.1 1999/06/13 16:23:53 hubertf Exp $
+
+The source in this patch is available at
+http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png/xvpng.c
+
+---------------------------------------------------------------------------
+
+--- /dev/null Sun Jun 13 01:55:42 1999
++++ xvpng.c Fri Jun 14 01:42:11 1996
+@@ -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 <lehmann@mathematik.th-darmstadt.de>
++ * this file is a suplement to xv and is supplied under the same copying
++ * conditions (except the shareware part)
++ * Modified by Andreas Dilger <adilger@enel.ucalgary.ca> 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 --git a/graphics/xv/patches/patch-png2 b/graphics/xv/patches/patch-png2
new file mode 100644
index 00000000000..de1719f7cb3
--- /dev/null
+++ b/graphics/xv/patches/patch-png2
@@ -0,0 +1,963 @@
+$NetBSD: patch-png2,v 1.1 1999/06/13 16:23:53 hubertf Exp $
+
+This patch is based on
+http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png/xvpng.diff
+It was edited to fit into the NetBSD Packages Collection! - HF
+
+---------------------------------------------------------------------------
+
+This is v1.2 of the PNG patch for xv. This version adds a PNG dialog
+so that the gamma, compression, interlacing, and filters can be selected
+when saving PNG images. The gamma dial needed floating point values, so
+it required modifying the Dial widget, and subsequently affected all of
+the popups that use a Dial (jpeg, ps, and color).
+
+To add PNG support to xv, you need the xv-3.10a source code, libpng and zlib.
+
+To apply the patch, go into the xv-3.10a directory and execute
+patch -p1 < thisfile
+
+The Makefile expects libpng and zlib to be already compiled. The versions
+I used were libpng-0.89 and zlib 1.0.2, but it should work with later
+versions. You will also have to modify the makefile to give the location
+of libpng and zlib on your system.
+
+Andreas Dilger <adilger@enel.ucalgary.ca>
+http://www-mddsp.enel.ucalgary.ca/People/adilger/
+
+Alexander Lehmann <lehmann@mathematik.th-darmstadt.de>
+http://www.mathematik.th-darmstadt.de/~lehmann/
+
+diff -c3 xv-3.10a/xvdial.c xvdial.c
+*** xv-3.10a/xvdial.c Tue Jan 3 14:20:31 1995
+--- xvdial.c Wed May 29 14:37:54 1996
+***************
+*** 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 (maxv<minv) maxv=minv;
+! dp->min = 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 (maxv<minv) maxv=minv;
+! dp->min = 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 -c3 xv-3.10a/xvgam.c xvgam.c
+*** xv-3.10a/xvgam.c Fri Jan 13 12:51:14 1995
+--- xvgam.c Wed May 29 11:13:56 1996
+***************
+*** 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 -c3 xv-3.10a/xvjpeg.c xvjpeg.c
+*** xv-3.10a/xvjpeg.c Thu Jan 5 01:17:13 1995
+--- xvjpeg.c Wed May 29 11:15:02 1996
+***************
+*** 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,
+--- 85,94 ----
+
+ 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,
+***************
+*** 759,766 ****
+
+
+ jpeg_set_defaults(&cinfo);
+! jpeg_set_quality(&cinfo, qDial.val, TRUE);
+! cinfo.smoothing_factor = smDial.val;
+
+
+ jpeg_start_compress(&cinfo, TRUE);
+--- 757,764 ----
+
+
+ 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;
+--- 767,773 ----
+ /*** 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 -c3 xv-3.10a/xvmisc.c xvmisc.c
+*** xv-3.10a/xvmisc.c Fri Jan 13 16:41:34 1995
+--- xvmisc.c Tue May 28 14:57:52 1996
+***************
+*** 520,525 ****
+--- 520,529 ----
+ 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,720 ****
+--- 719,728 ----
+
+ #ifdef HAVE_TIFF
+ if (tiffW) XDefineCursor(theDisp, tiffW, otherc);
++ #endif
++
++ #ifdef HAVE_PNG
++ if (pngW) XDefineCursor(theDisp, pngW, otherc);
+ #endif
+ }
+
+diff -c3 xv-3.10a/xvpopup.c xvpopup.c
+*** xv-3.10a/xvpopup.c Thu Jan 19 11:09:31 1995
+--- xvpopup.c Wed May 29 11:18:43 1996
+***************
+*** 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;
+***************
+*** 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);
+ }
+ }
+
+--- 970,977 ----
+ 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 -c3 xv-3.10a/xvps.c xvps.c
+*** xv-3.10a/xvps.c Thu Dec 22 15:34:42 1994
+--- xvps.c Wed May 29 11:04:28 1996
+***************
+*** 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 --git a/graphics/xv/patches/patch-png2-Imakefile b/graphics/xv/patches/patch-png2-Imakefile
new file mode 100644
index 00000000000..940be820add
--- /dev/null
+++ b/graphics/xv/patches/patch-png2-Imakefile
@@ -0,0 +1,96 @@
+$NetBSD: patch-png2-Imakefile,v 1.1 1999/06/13 16:23:54 hubertf Exp $
+
+This patch is based on
+http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png/xvpng.diff
+It was edited to fit into the NetBSD Packages Collection! - HF
+
+---------------------------------------------------------------------------
+
+
+--- Imakefile.orig Sun Jun 13 04:15:05 1999
++++ Imakefile Sun Jun 13 04:31:20 1999
+@@ -23,6 +23,9 @@
+ #define HavePDS
+
+
++#define UseInstalledPng
++#define UseInstalledZlib
++
+ /*
+ * if you are running on a SysV-based machine, such as HP, Silicon Graphics,
+ * etc, uncomment one of the following lines to get you *most* of the way
+@@ -149,6 +152,35 @@
+ PDS = -DDOPDS
+ #endif
+
++/*
++###
++### if, for whatever reason, you're unable to get the PNG library to compile
++### on your machine, *COMMENT OUT* the following lines
++###
++*/
++#ifdef UseInstalledPng
++PNG = -DDOPNG
++PNGDIR = ${LOCALBASE}
++PNGINC = -I$(PNGDIR)/include
++PNGLIB = -L$(PNGDIR)/lib -lpng -lz
++LIBPNG = ${PNGLIB}
++PNGINCLUDE = ${PNGINC}
++#endif
++
++/*
++###
++### if, for whatever reason, you're unable to get the PNG library to compile
++### on your machine, *COMMENT OUT* the following lines
++###
++*/
++#ifdef UseInstalledZlib
++ZLIBDIR = /usr
++ZLIBINC = -I$(ZLIBDIR)/include
++ZLIBLIB = -L$(ZLIBDIR)/lib -lz
++LIBZLIB = ${ZLIB}
++ZLIBINCLUDE = ${ZLIBINC}
++#endif
++
+ #if defined(SCOArchitecture)
+ SCO= -Dsco -DPOSIX -DNO_RANDOM
+ SYS_LIBRARIES= -lm -lc -lx
+@@ -157,14 +189,14 @@
+ #endif
+
+
+-DEPLIBS = $(DEPLIBJPEG) $(DEPLIBTIFF)
+-LOCAL_LIBRARIES = $(XLIB) $(LIBJPEG) $(LIBTIFF)
++DEPLIBS = $(DEPLIBJPEG) $(DEPLIBTIFF) $(DEPLIBPNG) $(DEPLIBZLIB)
++LOCAL_LIBRARIES = $(XLIB) $(LIBJPEG) $(LIBTIFF) $(LIBPNG) $(LIBZLIB)
+
+ DEFINES= $(SCO) $(UNIX) $(NODIRENT) $(VPRINTF) $(TIMERS) \
+- $(HPUX7) $(JPEG) $(TIFF) $(PDS) $(DXWM) $(RAND) \
++ $(HPUX7) $(JPEG) $(TIFF) $(PNG) $(PDS) $(DXWM) $(RAND) \
+ $(BACKING_STORE) $(BSDTYPES) $(SGI)
+
+-INCLUDES = $(JPEGINCLUDE) $(TIFFINCLUDE)
++INCLUDES = $(JPEGINCLUDE) $(TIFFINCLUDE) $(PNGINCLUDE) $(ZLIBINCLUDE)
+
+ SRCS1 = xv.c xvevent.c xvroot.c xvmisc.c xvimage.c xvcolor.c xvsmooth.c \
+ xv24to8.c xvgif.c xvpm.c xvinfo.c xvctrl.c xvscrl.c xvalg.c \
+@@ -172,7 +204,8 @@
+ xvdial.c xvgraf.c xvsunras.c xvjpeg.c xvps.c xvpopup.c xvdflt.c \
+ xvtiff.c xvtiffwr.c xvpds.c xvrle.c xviris.c xvgrab.c vprintf.c \
+ xvbrowse.c xvtext.c xvpcx.c xviff.c xvtarga.c xvxpm.c xvcut.c \
+- xvxwd.c xvfits.c xvmag.c xvmaki.c xvpic.c xvpi.c xvpic2.c xvpcd.c
++ xvxwd.c xvfits.c xvmag.c xvmaki.c xvpic.c xvpi.c xvpic2.c xvpcd.c \
++ xvpng.c
+
+ OBJS1 = xv.o xvevent.o xvroot.o xvmisc.o xvimage.o xvcolor.o xvsmooth.o \
+ xv24to8.o xvgif.o xvpm.o xvinfo.o xvctrl.o xvscrl.o xvalg.o \
+@@ -180,7 +213,8 @@
+ 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 xvmag.o xvmaki.o xvpic.o xvpi.o xvpic2.o xvpcd.o
++ xvxwd.o xvfits.o xvmag.o xvmaki.o xvpic.o xvpi.o xvpic2.o xvpcd.o \
++ xvpng.o
+
+ SRCS2= bggen.c
+ OBJS2= bggen.o
diff --git a/graphics/xv/patches/patch-png2-Makefile b/graphics/xv/patches/patch-png2-Makefile
new file mode 100644
index 00000000000..16849979b9e
--- /dev/null
+++ b/graphics/xv/patches/patch-png2-Makefile
@@ -0,0 +1,67 @@
+$NetBSD: patch-png2-Makefile,v 1.1 1999/06/13 16:23:54 hubertf Exp $
+
+This patch is based on
+http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png/xvpng.diff
+It was edited to fit into the NetBSD Packages Collection! - HF
+
+---------------------------------------------------------------------------
+
+
+--- Makefile.patched Sun Jun 13 02:40:36 1999
++++ Makefile Sun Jun 13 02:44:11 1999
+@@ -54,6 +54,24 @@
+ $(JPEGLIB): $(JPEGDIR)/jconfig.h
+ cd $(JPEGDIR) ; make
+
++###
++### 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 = ${LOCALBASE}
++PNGINC = -I$(PNGDIR)/include
++PNGLIB = -L$(PNGDIR)/lib -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
++ZLIBINC = -I$(ZLIBDIR)/include
++ZLIBLIB = -L$(ZLIBDIR)/lib -lz
++
+
+ ###
+ ### if, for whatever reason, you're unable to get the TIFF library to compile
+@@ -188,9 +206,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 \
+@@ -198,7 +216,8 @@
+ 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 xvmag.o xvmaki.o xvpic.o xvpi.o xvpic2.o xcpcd.o
++ xvxwd.o xvfits.o xvmag.o xvmaki.o xvpic.o xvpi.o xvpic2.o xcpcd.o \
++ xvpng.o
+
+ MISC = README INSTALL CHANGELOG IDEAS
+
+@@ -269,7 +288,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 --git a/graphics/xv/patches/patch-png2-Makefile.std b/graphics/xv/patches/patch-png2-Makefile.std
new file mode 100644
index 00000000000..b3a37326e53
--- /dev/null
+++ b/graphics/xv/patches/patch-png2-Makefile.std
@@ -0,0 +1,68 @@
+$NetBSD: patch-png2-Makefile.std,v 1.1 1999/06/13 16:23:54 hubertf Exp $
+
+This patch is based on
+http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png/xvpng.diff
+It was edited to fit into the NetBSD Packages Collection! - HF
+
+---------------------------------------------------------------------------
+
+
+--- Makefile.std.patched Sun Jun 13 03:16:57 1999
++++ Makefile.std Sun Jun 13 03:21:41 1999
+@@ -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 = ${LOCALBASE}
++PNGINC = -I$(PNGDIR)/include
++PNGLIB = -L$(PNGDIR)/lib -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
++ZLIBINC = -I$(ZLIBDIR)/include
++ZLIBLIB = -L$(ZLIBDIR)/lib -lz
++
++
++###
+ ### if, for whatever reason, you're unable to get the TIFF library to compile
+ ### on your machine, *COMMENT OUT* the following lines
+ ###
+@@ -188,9 +207,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 \
+@@ -198,7 +217,8 @@
+ 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 xvmag.o xvmaki.o xvpic.o xvpi.o xvpic2.o xcpcd.o
++ xvxwd.o xvfits.o xvmag.o xvmaki.o xvpic.o xvpi.o xvpic2.o xcpcd.o \
++ xvpng.o
+
+ MISC = README INSTALL CHANGELOG IDEAS
+
+@@ -269,7 +289,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 --git a/graphics/xv/patches/patch-png2-xv.c b/graphics/xv/patches/patch-png2-xv.c
new file mode 100644
index 00000000000..8f010e153f7
--- /dev/null
+++ b/graphics/xv/patches/patch-png2-xv.c
@@ -0,0 +1,57 @@
+$NetBSD: patch-png2-xv.c,v 1.1 1999/06/13 16:23:54 hubertf Exp $
+
+This patch is based on
+http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png/xvpng.diff
+It was edited to fit into the NetBSD Packages Collection! - HF
+
+---------------------------------------------------------------------------
+
+
+--- xv.c.patched Sun Jun 13 02:45:51 1999
++++ xv.c Sun Jun 13 02:49:26 1999
+@@ -279,6 +279,10 @@
+
+ pcdW = (Window) NULL; pcdUp = 0;
+
++#ifdef HAVE_PNG
++ pngW = (Window) NULL; pngUp = 0;
++#endif
++
+ imap = ctrlmap = gmap = browmap = cmtmap = 0;
+
+ ch_offx = ch_offy = p_offx = p_offy = 0;
+@@ -786,6 +790,11 @@
+
+ CreatePCDW();
+ XSetTransientForHint(theDisp, pcdW, dirW);
++
++#ifdef HAVE_PNG
++ CreatePNGW();
++ XSetTransientForHint(theDisp, pngW, dirW);
++#endif
+
+ LoadFishCursors();
+ SetCursors(-1);
+@@ -2649,6 +2658,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 ||
+@@ -2740,6 +2754,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 --git a/graphics/xv/patches/patch-png2-xv.h b/graphics/xv/patches/patch-png2-xv.h
new file mode 100644
index 00000000000..f21bc711095
--- /dev/null
+++ b/graphics/xv/patches/patch-png2-xv.h
@@ -0,0 +1,162 @@
+$NetBSD: patch-png2-xv.h,v 1.1 1999/06/13 16:23:54 hubertf Exp $
+
+This patch is based on
+http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png/xvpng.diff
+It was edited to fit into the NetBSD Packages Collection! - HF
+
+---------------------------------------------------------------------------
+
+
+--- xv.h.orig Sun Jun 13 03:41:34 1999
++++ xv.h Sun Jun 13 03:53:34 1999
+@@ -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
+@@ -343,6 +343,10 @@
+ #define HAVE_TIFF
+ #endif
+
++#ifdef DOPNG
++#define HAVE_PNG
++#endif
++
+ #ifdef DOPDS
+ #define HAVE_PDS
+ #endif
+@@ -478,31 +482,38 @@
+ #define MACBSIZE 128
+ #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_MAG (12 + F_JPGINC + F_TIFINC)
+-#define F_PIC (13 + F_JPGINC + F_TIFINC)
+-#define F_MAKI (14 + F_JPGINC + F_TIFINC)
+-#define F_PI (15 + F_JPGINC + F_TIFINC)
+-#define F_PIC2_SS (16 + F_JPGINC + F_TIFINC)
+-#define F_PIC2_SF (17 + F_JPGINC + F_TIFINC)
+-#define F_PIC2_BM (18 + F_JPGINC + F_TIFINC)
+-#define F_PIC2_BI (19 + F_JPGINC + F_TIFINC) /* ----- */
+-#define F_DELIM1 (20 + F_JPGINC + F_TIFINC)
+-#define F_FILELIST (21 + F_JPGINC + F_TIFINC)
+-#define F_MAXFMTS (22 + F_JPGINC + F_TIFINC) /* 16, 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_MAG (12 + F_JPGINC + F_TIFINC + F_PNGINC)
++#define F_PIC (13 + F_JPGINC + F_TIFINC + F_PNGINC)
++#define F_MAKI (14 + F_JPGINC + F_TIFINC + F_PNGINC)
++#define F_PI (15 + F_JPGINC + F_TIFINC + F_PNGINC)
++#define F_PIC2_SS (16 + F_JPGINC + F_TIFINC + F_PNGINC)
++#define F_PIC2_SF (17 + F_JPGINC + F_TIFINC + F_PNGINC)
++#define F_PIC2_BM (18 + F_JPGINC + F_TIFINC + F_PNGINC)
++#define F_PIC2_BI (19 + F_JPGINC + F_TIFINC + F_PNGINC)
++#define F_DELIM1 (20 + F_JPGINC + F_TIFINC + F_PNGINC) /* ----- */
++#define F_FILELIST (21 + F_JPGINC + F_TIFINC + F_PNGINC)
++#define F_MAXFMTS (22 + F_JPGINC + F_TIFINC + F_PNGINC) /* 25, normally */
+
+
+
+@@ -538,6 +549,7 @@
+ #define RFT_PI 23
+ #define RFT_PIC2 24
+ #define RFT_PCD 25
++#define RFT_PNG 26 /* HF: was 20 */
+
+ /* definitions for page up/down, arrow up/down list control */
+ #define LS_PAGEUP 0
+@@ -798,9 +810,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 */
+@@ -1192,6 +1205,13 @@
+ WHERE Window pcdW;
+ WHERE int pcdUp; /* is pcdW mapped, or what? */
+
++#ifdef HAVE_PNG
++/* stuff used for 'png' box */
++WHERE Window pngW;
++WHERE int pngUp; /* is pngW mapped, or what? */
++#endif
++
++
+ #undef WHERE
+
+
+@@ -1506,12 +1526,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));
+@@ -1653,6 +1673,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 --git a/graphics/xv/patches/patch-png2-xvbrowse.c b/graphics/xv/patches/patch-png2-xvbrowse.c
new file mode 100644
index 00000000000..10d50e8aba2
--- /dev/null
+++ b/graphics/xv/patches/patch-png2-xvbrowse.c
@@ -0,0 +1,53 @@
+$NetBSD: patch-png2-xvbrowse.c,v 1.1 1999/06/13 16:23:54 hubertf Exp $
+
+This patch is based on
+http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png/xvpng.diff
+It was edited to fit into the NetBSD Packages Collection! - HF
+
+---------------------------------------------------------------------------
+
+
+--- xvbrowse.c.patched Sun Jun 13 03:22:27 1999
++++ xvbrowse.c Sun Jun 13 03:25:38 1999
+@@ -61,6 +61,7 @@
+ #include "bits/br_pic"
+ #include "bits/br_pi"
+ #include "bits/br_pic2"
++#include "bits/br_png"
+
+ #include "bits/br_trash"
+ #include "bits/fcurs"
+@@ -106,7 +107,8 @@
+ #define BF_PI 31
+ #define BF_PIC2 32
+ #define BF_PCD 33
+-#define BF_MAX 34 /* # of built-in icons */
++#define BF_PNG 34
++#define BF_MAX 35 /* # of built-in icons */
+
+ #define ISLOADABLE(ftyp) (ftyp!=BF_DIR && ftyp!=BF_CHR && ftyp!=BF_BLK && \
+ ftyp!=BF_SOCK && ftyp!=BF_FIFO)
+@@ -543,6 +545,7 @@
+ bfIcons[BF_PI] = MakePix1(br->win,br_pi_bits,br_pi_width,br_pi_height);
+ bfIcons[BF_PIC2]=MakePix1(br->win,br_pic2_bits,br_pic2_width,br_pic2_height);
+ bfIcons[BF_PCD] = MakePix1(br->win,br_pcd_bits,br_pcd_width,br_pcd_height);
++ bfIcons[BF_PNG]=MakePix1(br->win,br_png_bits,br_png_width,br_png_height);
+
+
+ /* check that they all got built */
+@@ -3045,6 +3048,7 @@
+ case RFT_PI: bf->ftype = BF_PI; break;
+ case RFT_PIC2: bf->ftype = BF_PIC2; break;
+ case RFT_PCD: bf->ftype = BF_PCD; break;
++ case RFT_PNG: bf->ftype = BF_PNG; break;
+ }
+ }
+ }
+@@ -3612,6 +3616,7 @@
+ case RFT_PI: strcat(str,"PI file"); break;
+ case RFT_PIC2: strcat(str,"PIC2 file"); break;
+ case RFT_PCD: strcat(str,"PhotoCD file"); break;
++ case RFT_PNG: strcat(str,"PNG file"); break;
+ default: strcat(str,"file of unknown type"); break;
+ }
+
diff --git a/graphics/xv/patches/patch-png2-xvdir.c b/graphics/xv/patches/patch-png2-xvdir.c
new file mode 100644
index 00000000000..9e37d81a0ff
--- /dev/null
+++ b/graphics/xv/patches/patch-png2-xvdir.c
@@ -0,0 +1,83 @@
+$NetBSD: patch-png2-xvdir.c,v 1.1 1999/06/13 16:23:54 hubertf Exp $
+
+This patch is based on
+http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png/xvpng.diff
+It was edited to fit into the NetBSD Packages Collection! - HF
+
+---------------------------------------------------------------------------
+
+
+--- xvdir.c.patched Sun Jun 13 03:27:12 1999
++++ xvdir.c Sun Jun 13 03:33:01 1999
+@@ -62,6 +62,9 @@
+ #ifdef HAVE_TIFF
+ "TIFF",
+ #endif
++#ifdef HAVE_PNG
++ "PNG",
++#endif
+ "PostScript",
+ "PBM/PGM/PPM (raw)",
+ "PBM/PGM/PPM (ascii)",
+@@ -1123,6 +1126,14 @@
+ }
+ #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
+
+
+
+@@ -1181,6 +1192,7 @@
+ case F_FITS:
+ rv = WriteFITS (fp, thepic, ptype, w, h, rp, gp, bp, nc, col,
+ picComments);
++ break;
+ case F_MAG:
+ rv = WriteMAG (fp, thepic, ptype, w, h, rp, gp, bp, nc, col,
+ picComments); break;
+@@ -1415,19 +1427,26 @@
+ (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) ||
++#endif
++#ifdef HAVE_PNG
++ (strcmp(lowsuf,"png" )==0) ||
++#endif
++ (strcmp(lowsuf,"xpm" )==0) ||
+ (strcmp(lowsuf,"mag" )==0) ||
+ (strcmp(lowsuf,"pic" )==0) ||
+ (strcmp(lowsuf,"mki" )==0) ||
+ (strcmp(lowsuf,"pi" )==0) ||
+- (strcmp(lowsuf,"p2" )==0)){
++ (strcmp(lowsuf,"p2" )==0)) {
+
+ /* found one. set lowsuf = to the new suffix, and tack on to filename */
+
+@@ -1462,6 +1481,9 @@
+
+ #ifdef HAVE_TIFF
+ case F_TIFF: strcpy(lowsuf,"tif"); break;
++#endif
++#ifdef HAVE_PNG
++ case F_PNG: strcpy(lowsuf,"png"); break;
+ #endif
+ case F_MAG: strcpy(lowsuf,"mag"); break;
+ case F_PIC: strcpy(lowsuf,"pic"); break;
diff --git a/graphics/xv/patches/patch-png2-xvevent.c b/graphics/xv/patches/patch-png2-xvevent.c
new file mode 100644
index 00000000000..b16ea1c65a9
--- /dev/null
+++ b/graphics/xv/patches/patch-png2-xvevent.c
@@ -0,0 +1,97 @@
+$NetBSD: patch-png2-xvevent.c,v 1.1 1999/06/13 16:23:54 hubertf Exp $
+
+This patch is based on
+http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png/xvpng.diff
+It was edited to fit into the NetBSD Packages Collection! - HF
+
+---------------------------------------------------------------------------
+
+
+--- xvevent.c.patched Sun Jun 13 03:34:03 1999
++++ xvevent.c Sun Jun 13 03:37:59 1999
+@@ -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 wasPcdUp=0;
+
+ static int mainWKludge=0; /* force first mainW expose after a mainW config
+@@ -234,6 +234,10 @@
+ if (TIFFCheckEvent(event)) break; /* event has been processed */
+ #endif
+
++#ifdef HAVE_PNG
++ if (PNGCheckEvent (event)) break; /* event has been processed */
++#endif
++
+ if (PCDCheckEvent(event)) break; /* event has been processed */
+
+ if (GamCheckEvent (event)) break; /* event has been processed */
+@@ -362,6 +366,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 == pcdW) PCDDialog(0);
+
+ else if (client_event->window == mainW) Quit(0);
+@@ -544,6 +552,10 @@
+ if (wasTiffUp) { TIFFDialog(wasTiffUp); wasTiffUp=0; }
+ #endif
+
++#ifdef HAVE_PNG
++ if (wasPngUp) { PNGDialog(wasJpegUp); wasPngUp=0; }
++#endif
++
+ if (wasPcdUp) { PCDDialog(wasPcdUp); wasPcdUp=0; }
+
+ }
+@@ -585,6 +597,10 @@
+ if (tiffUp) { wasTiffUp = tiffUp; TIFFDialog(0); }
+ #endif
+
++#ifdef HAVE_PNG
++ if (pngUp) { wasPngUp = pngUp; PNGDialog(0); }
++#endif
++
+ if (pcdUp) { wasPcdUp = pcdUp; PCDDialog(0); }
+
+ }
+@@ -1158,6 +1174,10 @@
+ if (TIFFCheckEvent(event)) break;
+ #endif
+
++#ifdef HAVE_PNG
++ if (PNGCheckEvent (event)) break;
++#endif
++
+ if (PCDCheckEvent(event)) break;
+
+ if (GamCheckEvent (event)) break;
+@@ -1379,6 +1399,10 @@
+ if (TIFFCheckEvent(event)) break;
+ #endif
+
++#ifdef HAVE_PNG
++ if (PNGCheckEvent (event)) break;
++#endif
++
+ if (PCDCheckEvent(event)) break;
+
+ if (GamCheckEvent (event)) break;
+@@ -2385,6 +2409,10 @@
+
+ #ifdef HAVE_TIFF
+ if (tiffUp) TIFFDialog(0); /* close tiff window */
++#endif
++
++#ifdef HAVE_PNG
++ if (pngUp) PNGDialog(0); /* close png window */
+ #endif
+
+ if (pcdUp) PCDDialog(0); /* close pcd window */
diff --git a/graphics/xv/patches/patch-png3 b/graphics/xv/patches/patch-png3
new file mode 100644
index 00000000000..559ad0b1d82
--- /dev/null
+++ b/graphics/xv/patches/patch-png3
@@ -0,0 +1,39 @@
+$NetBSD
+
+The source for this file can be found at
+http://www.mit.edu/afs/athena/contrib/graphics/src/xv/patches/png/bits/br_png
+
+- HF
+
+
+--- /dev/null Sun Jun 13 02:17:04 1999
++++ bits/br_png Thu Jun 13 22: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,
++ };