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.
This commit is contained in:
hubertf 1999-06-13 16:23:52 +00:00
parent 25cb23d49d
commit ac91b297b4
12 changed files with 2663 additions and 1 deletions

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 *));

View file

@ -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;
}

View file

@ -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;

View file

@ -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 */

View file

@ -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,
+ };