Krolyxon
Commit b92ebf6

Branches

Refs →

nsxivb92ebf6

Implemented panning

Author
Bert
Date
2011-01-21 13:48 +0100
Parent
72e56e5
Commit
b92ebf67ee04134e7c9e006cdef3dace969539aa

+74 −21

3 files changed

  1. M image.c +34 −2
  2. M image.h +10 −0
  3. M main.c +30 −19
M image.c View
@@ -123,11 +123,13 @@ void img_render(img_t *img, win_t *win) {
123123 /* center image in window */
124124 img->x = (win->w - img->w * img->zoom) / 2;
125125 img->y = (win->h - img->h * img->zoom) / 2;
126− } else {
127− /* typically after zooming and panning */
126+ } else if (img->cp) {
127+ /* only useful after zooming */
128128 img_check_pan(img, win);
129+ img->cp = 0;
129130 }
130131
132+ /* calculate source and destination offsets */
131133 if (img->x < 0) {
132134 sx = -img->x / img->zoom;
133135 sw = win->w / img->zoom;
@@ -172,6 +174,7 @@ int img_zoom(img_t *img, float z) {
172174 img->x -= (img->w * z - img->w * img->zoom) / 2;
173175 img->y -= (img->h * z - img->h * img->zoom) / 2;
174176 img->zoom = z;
177+ img->cp = 1;
175178 return 1;
176179 } else {
177180 return 0;
@@ -205,3 +208,32 @@ int img_zoom_out(img_t *img) {
205208
206209 return 0;
207210 }
211+
212+int img_pan(img_t *img, win_t *win, pandir_t dir) {
213+ int ox, oy;
214+
215+ if (!img || !win)
216+ return 0;
217+
218+ ox = img->x;
219+ oy = img->y;
220+
221+ switch (dir) {
222+ case PAN_LEFT:
223+ img->x += win->w / 5;
224+ break;
225+ case PAN_RIGHT:
226+ img->x -= win->w / 5;
227+ break;
228+ case PAN_UP:
229+ img->y += win->h / 5;
230+ break;
231+ case PAN_DOWN:
232+ img->y -= win->h / 5;
233+ break;
234+ }
235+
236+ img_check_pan(img, win);
237+
238+ return ox != img->x || oy != img->y;
239+}
M image.h View
@@ -27,9 +27,17 @@ enum scalemode {
2727 SCALE_ZOOM
2828 };
2929
30+typedef enum pandir_e {
31+ PAN_LEFT = 0,
32+ PAN_RIGHT,
33+ PAN_UP,
34+ PAN_DOWN
35+} pandir_t;
36+
3037 typedef struct img_s {
3138 float zoom;
3239 unsigned char re;
40+ unsigned char cp;
3341 int x;
3442 int y;
3543 int w;
@@ -45,4 +53,6 @@ void img_render(img_t*, win_t*);
4553 int img_zoom_in(img_t*);
4654 int img_zoom_out(img_t*);
4755
56+int img_pan(img_t*, win_t*, pandir_t);
57+
4858 #endif /* IMAGE_H */
M main.c View
@@ -108,13 +108,14 @@ void cleanup() {
108108
109109 void on_keypress(XEvent *ev) {
110110 char key;
111− int len;
112111 KeySym keysym;
112+ int changed;
113113
114114 if (!ev)
115115 return;
116116
117− len = XLookupString(&ev->xkey, &key, 1, &keysym, NULL);
117+ XLookupString(&ev->xkey, &key, 1, &keysym, NULL);
118+ changed = 0;
118119
119120 switch (keysym) {
120121 case XK_Escape:
@@ -122,48 +123,58 @@ void on_keypress(XEvent *ev) {
122123 exit(2);
123124 case XK_space:
124125 key = 'n';
125− len = 1;
126126 break;
127127 case XK_BackSpace:
128128 key = 'p';
129− len = 1;
130129 break;
131130 }
132131
133− if (!len)
134− return;
135−
136132 switch (key) {
137133 case 'q':
138134 cleanup();
139135 exit(0);
136+
137+ /* navigate through image list */
140138 case 'n':
141139 if (fileidx + 1 < filecnt) {
142140 img_load(&img, filenames[++fileidx]);
143− img_render(&img, &win);
144− update_title();
141+ changed = 1;
145142 }
146143 break;
147144 case 'p':
148145 if (fileidx > 0) {
149146 img_load(&img, filenames[--fileidx]);
150− img_render(&img, &win);
151− update_title();
147+ changed = 1;
152148 }
153149 break;
150+
151+ /* zooming */
154152 case '+':
155153 case '=':
156− if (img_zoom_in(&img)) {
157− img_render(&img, &win);
158− update_title();
159− }
154+ changed = img_zoom_in(&img);
160155 break;
161156 case '-':
162− if (img_zoom_out(&img)) {
163− img_render(&img, &win);
164− update_title();
165− }
157+ changed = img_zoom_out(&img);
166158 break;
159+
160+ /* panning */
161+ case 'h':
162+ changed = img_pan(&img, &win, PAN_LEFT);
163+ break;
164+ case 'j':
165+ changed = img_pan(&img, &win, PAN_DOWN);
166+ break;
167+ case 'k':
168+ changed = img_pan(&img, &win, PAN_UP);
169+ break;
170+ case 'l':
171+ changed = img_pan(&img, &win, PAN_RIGHT);
172+ break;
173+ }
174+
175+ if (changed) {
176+ img_render(&img, &win);
177+ update_title();
167178 }
168179 }
169180