ref: 0617f98c17987d70020991f9536d6794b0c12093
parent: 032d83f1b0e022c09886d0a57815615332fce7c2
author: phil9 <telephil9@gmail.com>
date: Fri Nov 26 00:23:49 EST 2021
initial zoom support this is not fully functional as we are applying transformations to the zoomed image instead of the original one for the time being
--- a/view.c
+++ b/view.c
@@ -21,11 +21,28 @@
Mousectl *mctl;
Keyboardctl *kctl;
Image *bg;
+Image *orig;
Image *img;
Point pos;
+int zoomlevel;
+const char* zoomlevels[] = {+ "25%", "33%", "50%", "75%",
+ "100%",
+ "150%", "200%", "300%", "400%",
+};
+
enum
{+ Defaultzoomlevel = 4,
+ Nzoomlevels = nelem(zoomlevels),
+};
+
+enum
+{+ Mzoomin,
+ Mzoomout,
+ Morigsize,
Mhflip,
Mvflip,
Mrotleft,
@@ -34,6 +51,9 @@
};
char *menu2str[] =
{+ "zoom in",
+ "zoom out",
+ "orig. size",
"flip horiz.",
"flip vert.",
"rotate left",
@@ -133,6 +153,8 @@
i = load(filename);
if(i == nil)
return -1;
+ freeimage(orig);
+ orig = nil;
freeimage(img);
img = i;
pos = subpt(ZP, img->r.min);
@@ -241,20 +263,72 @@
Image*
rotate(int op)
{- static char *opcmd[] = {- [Mhflip] = "rotate -l",
- [Mvflip] = "rotate -u",
- [Mrotleft] = "rotate -r 270",
- [Mrotright] = "rotate -r 90",
- };
- if(op < 0 || op > 3){+ const char *cmd;
+
+ switch(op){+ case Mhflip:
+ cmd = "rotate -l";
+ break;
+ case Mvflip:
+ cmd = "rotate -u";
+ break;
+ case Mrotleft:
+ cmd = "rotate -r 270";
+ break;
+ case Mrotright:
+ cmd = "rotate -r 90";
+ break;
+ default:
werrstr("invalid rotate op");return nil;
}
- return ipipeto(img, opcmd[op]);
+ return ipipeto(img, cmd);
}
void
+zoom(int zop)
+{+ Image *i;
+ char cmd[255];
+
+ switch(zop){+ case Mzoomin:
+ if(zoomlevel + 1 >= Nzoomlevels)
+ return;
+ ++zoomlevel;
+ break;
+ case Mzoomout:
+ if(zoomlevel == 0)
+ return;
+ --zoomlevel;
+ break;
+ case Morigsize:
+ if(zoomlevel == Defaultzoomlevel)
+ return;
+ zoomlevel = Defaultzoomlevel;
+ img = orig;
+ goto Redraw;
+ }
+ if(snprint(cmd, sizeof cmd, "resize -x %s", zoomlevels[zoomlevel]) <= 0){+ fprint(2, "error creating zoom command: %r\n"); /* XXX */
+ return;
+ }
+ i = ipipeto(orig == nil ? img : orig, cmd);
+ if(i == nil){+ fprint(2, "unable to zoom image: %r\n"); /* XXX */
+ return;
+ }
+ if(orig == nil)
+ orig = img;
+ else
+ freeimage(img);
+ img = i;
+Redraw:
+ pos = subpt(ZP, img->r.min);
+ redraw();
+}
+
+void
menu2hit(void)
{Image *i;
@@ -264,6 +338,11 @@
i = nil;
n = menuhit(2, mctl, &menu2, nil);
switch(n){+ case Mzoomin:
+ case Mzoomout:
+ case Morigsize:
+ zoom(n);
+ return;
case Mhflip:
case Mvflip:
case Mrotleft:
@@ -275,12 +354,12 @@
}
break;
case Mpipeto:
- if(enter("command:", buf, sizeof buf, mctl, kctl, nil) > 0){- i = ipipeto(img, buf);
- if(i == nil){- fprint(2, "unable to pipe image: %r\n");
- return;
- }
+ if(enter("command:", buf, sizeof buf, mctl, kctl, nil) <= 0)+ return;
+ i = ipipeto(img, buf);
+ if(i == nil){+ fprint(2, "unable to pipe image: %r\n");
+ return;
}
break;
}
@@ -365,6 +444,7 @@
};
img = nil;
+ zoomlevel = Defaultzoomlevel;
ARGBEGIN{default:
usage();
--
⑨