Commit Diff


commit - d19fdc056d160a429d046e472287073edec11ea3
commit + 94349f64d16ed2159cc944a2af7a3fcaedd9c9d9
blob - c59a0edb4cb84f6996b21f9901f6dfc5f89d393e
blob + e9378dc69a89a9750e1f1776554f7c5ede02c839
--- src/cmd/page/view.c
+++ src/cmd/page/view.c
@@ -18,6 +18,7 @@
 Document *doc;
 Mousectl *mc;
 Image *im;
+Image *tofree;
 int page;
 int angle = 0;
 int showbottom = 0;		/* on the next showpage, move the image so the bottom is visible. */
@@ -61,6 +62,16 @@ enum {
 
 	RMenu = 3,
 };
+
+static void
+delayfreeimage(Image *m)
+{
+	if(m == tofree)
+		return;
+	if(tofree)
+		freeimage(tofree);
+	tofree = m;
+}
 
 void
 unhide(void)
@@ -121,6 +132,7 @@ showpage(int page, Menu *m)
 		m->lasthit = reverse ? doc->npage-1-page : page;
 	
 	setcursor(mc, &reading);
+	delayfreeimage(nil);
 	im = cachedpage(doc, angle, page);
 	if(im == nil)
 		wexits(0);
@@ -553,8 +565,8 @@ viewer(Document *dd)
 							wexits("memory");
 						}
 						resample(im, tmp);
-						freeimage(im);
 						im = tmp;
+						delayfreeimage(tmp);
 						setcursor(mc, nil);
 						ul = screen->r.min;
 						redraw(screen);
@@ -578,8 +590,8 @@ viewer(Document *dd)
 							wexits("memory");
 						}
 						resample(im, tmp);
-						freeimage(im);
 						im = tmp;
+						delayfreeimage(tmp);
 						setcursor(mc, nil);
 						ul = screen->r.min;
 						redraw(screen);