Index: kit/draw.c
diff -u kit/draw.c:1.130 kit/draw.c:1.131
--- kit/draw.c:1.130	Tue Nov 17 10:16:00 1998
+++ kit/draw.c	Tue Nov 24 19:25:51 1998
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  */
 /*
- * $Id: draw.c,v 1.130 1998/11/17 01:16:00 itojun Exp $
+ * $Id: draw.c,v 1.131 1998/11/24 10:25:51 itojun Exp $
  */
 
 #include "mgp.h"
@@ -93,7 +93,6 @@
 	char *, int));
 
 static void back_gradation __P((struct render_state *, struct ctrl_grad *));
-static void image_zoomratio __P((struct render_state *, int *, int *, int, int, int));
 static void image_load __P((struct render_state *, char *, int, int, int, int, int, int));
 static void image_load_ps __P((struct render_state *, char *, int, int, int, int, int, int));
 static void process_icon __P((struct render_state *, struct ctrl *));
@@ -2456,103 +2455,6 @@
 	bg_image = myimage;
 	XUndefineCursor(display, state->target);
 	XFlush(display);
-}
-
-static void
-image_zoomratio(state, xp, yp, zoomflag, width, height)
-	struct render_state *state;
-	int *xp, *yp;
-	int zoomflag;
-	int width;	/* width of the image in file */
-	int height;	/* height of the image in file */
-{
-	int xmode, ymode;
-	int x, y;
-
-	if (!xp || !yp) {
-		fprintf(stderr, "internal error: "
-			"invalid parameter to image_zoomratio\n");
-		exit(1);
-	}
-
-	xmode = zoomflag & Z_XMASK;
-	ymode = (zoomflag & Z_YMASK) >> Z_YSHIFT;
-	if (xmode == ymode && xmode == Z_OBEY) {
-		fprintf(stderr, "internal error: "
-			"x and y axis obey each other (ignore zoom factor)\n");
-		return;
-	}
-
-	x = *xp;
-	y = *yp;
-
-	if (xmode == Z_OBEY)	/*DIRTY!*/
-		goto yfirst;
-
-	switch (xmode) {
-	case Z_ABSOLUTE:
-		x = 100 * x / width;
-		break;
-	case Z_NORMAL:	/* as is */
-		break;
-	case Z_SCREEN:	/* screen relative */
-		x = state->width * x / width;
-		break;
-	case Z_SCREEN0:	/* original screen size specified */
-		x = 100 * state->width / x;
-		break;
-	default:
-		fprintf(stderr, "wrong zooming mode for x axis %d\n", xmode);
-		exit(1);
-	}
-
-yfirst:
-	switch (ymode) {
-	case Z_ABSOLUTE:
-		y = 100 * y / height;
-		break;
-	case Z_NORMAL:
-		break;
-	case Z_SCREEN:
-		y = state->height * y / height;
-		break;
-	case Z_SCREEN0:
-		y = 100 * state->height / y;
-		break;
-	case Z_OBEY:
-		y = x;
-		break;
-	default:
-		fprintf(stderr, "wrong zooming mode for y axis %d\n", ymode);
-		exit(1);
-	}
-
-	if (xmode == Z_OBEY)
-		goto finish;
-
-	switch (xmode) {
-	case Z_ABSOLUTE:
-		x = 100 * x / width;
-		break;
-	case Z_NORMAL:	/* as is */
-		break;
-	case Z_SCREEN:	/* screen relative */
-		x = state->width * x / width;
-		break;
-	case Z_SCREEN0:	/* original screen size specified */
-		x = 100 * state->width / x;
-		break;
-	case Z_OBEY:
-		x = y;
-		break;
-	default:
-		fprintf(stderr, "wrong zooming mode for x axis %d\n", xmode);
-		exit(1);
-	}
-
-finish:
-	*xp = x;
-	*yp = y;
 }
 
 static void
Index: kit/mgp.h
diff -u kit/mgp.h:1.99 kit/mgp.h:1.100
--- kit/mgp.h:1.99	Mon Nov 16 22:04:35 1998
+++ kit/mgp.h	Tue Nov 24 19:25:49 1998
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  */
 /*
- * $Id: mgp.h,v 1.99 1998/11/16 13:04:35 itojun Exp $
+ * $Id: mgp.h,v 1.100 1998/11/24 10:25:49 itojun Exp $
  */
 
 #include <stdio.h>
@@ -633,6 +633,7 @@
 
 /* postscript.c */
 extern int ps_boundingbox __P((char *, int *, int *, int *, int *));
+extern void image_zoomratio __P((struct render_state *, int *, int *, int, int, int));
 
 /* tfont.c */
 extern int tfc_setsize __P((u_int));
Index: kit/postscript.c
diff -u kit/postscript.c:1.3 kit/postscript.c:1.5
--- kit/postscript.c:1.3	Tue Nov  3 00:54:20 1998
+++ kit/postscript.c	Thu Nov 26 15:33:17 1998
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  */
 /*
- * $Id: postscript.c,v 1.3 1998/11/02 15:54:20 itojun Exp $
+ * $Id: postscript.c,v 1.5 1998/11/26 06:33:17 itojun Exp $
  */
 
 #include "mgp.h"
@@ -83,4 +83,131 @@
 	if (epsfp)
 		fclose(epsfp);
 	return -1;
+}
+
+void
+image_zoomratio(state, xp, yp, zoomflag, width, height)
+	struct render_state *state;
+	int *xp, *yp;
+	int zoomflag;
+	int width;	/* width of the image in file */
+	int height;	/* height of the image in file */
+{
+	int xmode, ymode;
+	double x, y;
+
+	if (!xp || !yp) {
+		fprintf(stderr, "internal error: "
+			"invalid parameter to image_zoomratio\n");
+		exit(1);
+	}
+
+	xmode = zoomflag & Z_XMASK;
+	ymode = (zoomflag & Z_YMASK) >> Z_YSHIFT;
+
+	if (mgp_flag & FL_VERBOSE) {
+		char *xmodestr, *ymodestr;
+
+		xmodestr = ymodestr = "?";
+		switch (xmode) {
+		case Z_ABSOLUTE: xmodestr = "abs"; break;
+		case Z_NORMAL:	xmodestr = "asis"; break;
+		case Z_SCREEN:	xmodestr = "screen"; break;
+		case Z_SCREEN0:	xmodestr = "screen0"; break;
+		case Z_OBEY:	xmodestr = "obey"; break;
+		}
+		switch (ymode) {
+		case Z_ABSOLUTE: ymodestr = "abs"; break;
+		case Z_NORMAL:	ymodestr = "asis"; break;
+		case Z_SCREEN:	ymodestr = "screen"; break;
+		case Z_SCREEN0:	ymodestr = "screen0"; break;
+		case Z_OBEY:	ymodestr = "obey"; break;
+		}
+
+		fprintf(stderr, "computing zoom: screen=(%d,%d) "
+			"image=(%d,%d) zoom param=(%d/%s,%d/%s)\n",
+			state->width, state->height,
+			width, height,
+			*xp, xmodestr, *yp, ymodestr);
+	}
+
+	if (xmode == ymode && xmode == Z_OBEY) {
+		fprintf(stderr, "internal error: "
+			"x and y axis obey each other (ignore zoom factor)\n");
+		return;
+	}
+
+	x = (double)*xp / 100;
+	y = (double)*yp / 100;
+
+	if (xmode == Z_OBEY)	/*DIRTY!*/
+		goto yfirst;
+
+	switch (xmode) {
+	case Z_ABSOLUTE:
+		x = (double)*xp / 100;
+		break;
+	case Z_NORMAL:	/* as is */
+		break;
+	case Z_SCREEN:	/* screen relative */
+		x = x * state->width / width;
+		break;
+	case Z_SCREEN0:	/* original screen size specified */
+		x = state->width / x;
+		break;
+	default:
+		fprintf(stderr, "wrong zooming mode for x axis %d\n", xmode);
+		exit(1);
+	}
+
+yfirst:
+	switch (ymode) {
+	case Z_ABSOLUTE:
+		y = (double)*yp / 100;
+		break;
+	case Z_NORMAL:
+		break;
+	case Z_SCREEN:
+		y = y * state->height / height;
+		break;
+	case Z_SCREEN0:
+		y = state->height / y;
+		break;
+	case Z_OBEY:
+		y = x;
+		break;
+	default:
+		fprintf(stderr, "wrong zooming mode for y axis %d\n", ymode);
+		exit(1);
+	}
+
+	if (xmode != Z_OBEY)
+		goto finish;
+
+	switch (xmode) {
+	case Z_ABSOLUTE:
+		x = 100 * x / width;
+		break;
+	case Z_NORMAL:	/* as is */
+		break;
+	case Z_SCREEN:	/* screen relative */
+		x = state->width * x / width;
+		break;
+	case Z_SCREEN0:	/* original screen size specified */
+		x = state->width / x;
+		break;
+	case Z_OBEY:
+		x = y;
+		break;
+	default:
+		fprintf(stderr, "wrong zooming mode for x axis %d\n", xmode);
+		exit(1);
+	}
+
+finish:
+	if (mgp_flag & FL_VERBOSE) {
+		fprintf(stderr, "resulting zoom=(%f,%f)\n", x, y);
+	}
+	*xp = (int)(x * 100);
+	*yp = (int)(y * 100);
 }
Index: kit/print.c
diff -u kit/print.c:1.68 kit/print.c:1.69
--- kit/print.c:1.68	Tue Nov  3 00:54:22 1998
+++ kit/print.c	Tue Nov 24 19:25:55 1998
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  */
 /*
- * $Id: print.c,v 1.68 1998/11/02 15:54:22 itojun Exp $
+ * $Id: print.c,v 1.69 1998/11/24 10:25:55 itojun Exp $
  */
 /*
  * Paper size selection code is based on psutil.c by Angus J. C. Duggan
@@ -1194,6 +1194,8 @@
 	char *epsname;
 	char buf[BUFSIZ];
 	Image *myimage;
+	int xzoom, yzoom;
+	struct render_state state;
 
 	if (epsname = checkeps(cp->ctm_fname)) {
 		int x1, y1, x2, y2, width, height, swidth, sheight, xim, yim;
@@ -1206,6 +1208,7 @@
 		xim = (!cp->ctm_ximagesize ? 100 : cp->ctm_ximagesize);
 		yim = (!cp->ctm_yimagesize ? 100 : cp->ctm_yimagesize);
 
+#if 0
 		switch (cp->ctm_zoomflag) {
 		case 0:	/* relative to screen size */
 			swidth = window_width * xim / 100;
@@ -1220,6 +1223,16 @@
 			sheight = height;
 			break;
 		}
+#else
+		xzoom = xim;
+		yzoom = yim;
+		state.width = window_width;
+		state.height = window_height;
+		image_zoomratio(&state, &xzoom, &yzoom, cp->ctm_zoomflag,
+			width, height);
+		swidth = width * xzoom / 100;
+		sheight = height * yzoom / 100;
+#endif
 		pool->xsiz = swidth;
 		pool->ysiz = sheight;
 		pool->xoffset = linewidth;
@@ -1257,6 +1270,7 @@
 	int xzoomrate, yzoomrate;
 	static Cursor curs;
 	u_int	print_width, print_height;
+	struct render_state state;
 
 	int xpos;
 
@@ -1292,6 +1306,7 @@
 	if (numcolor)
 		myimage = reduce(myimage, numcolor, verbose);
 
+#if 0
 	if (ximagesize != 0 && yimagesize != 0) {
 		if (!zoomflag) {
 			xzoomrate = window_width * ximagesize / width;
@@ -1305,6 +1320,14 @@
 		freeImage(image);
 	} else
 		xzoomrate = yzoomrate = 100;
+#else
+	xzoomrate = ximagesize;
+	yzoomrate = yimagesize;
+	state.width = window_width;
+	state.height = window_height;
+	image_zoomratio(&state, &xzoomrate, &yzoomrate, zoomflag,
+		width, height);
+#endif
 
 	if (! (ximageinfo= imageToXImage(display, screen, visual, depth,
 			myimage, 0, 0, 0, verbose))) {
@@ -1566,8 +1589,10 @@
 	char line[BUFSIZ];
 	int x1, y1, x2, y2, height, width, sheight, swidth;
 	int xpos;
+	int xzoomrate, yzoomrate;
 	double xscale, yscale;
 	int noboundingbox;
+	struct render_state state;
 
 	if (fgets(line1, sizeof(line1), epsfp) == NULL) {
 		fprintf(stderr, "no first line in %s.\n", filename);
@@ -1604,6 +1629,7 @@
 	ximagesize = (!ximagesize ? 100 : ximagesize);
 	yimagesize = (!yimagesize ? 100 : yimagesize);
 
+#if 0
 	/* scaling factor */
 	switch (zoomflag) {
 	case 0:	/* relative to screen size */
@@ -1619,6 +1645,16 @@
 		yscale = 1.0;
 		break;
 	}
+#else
+	xzoomrate = ximagesize;
+	yzoomrate = yimagesize;
+	state.width = window_width;
+	state.height = window_height;
+	image_zoomratio(&state, &xzoomrate, &yzoomrate, zoomflag,
+		width, height);
+	xscale = xzoomrate / 100.0;
+	yscale = yzoomrate / 100.0;
+#endif
 
 	/* scaled image size */
 	swidth = (int)(xscale * width);
