Krolyxon
Commit bb12b8c

Branches

Refs →

nsxivbb12b8c

First try on zooming

Author
Bert
Date
2011-01-20 23:22 +0100
Parent
376c0d9
Commit
bb12b8c0fbc4d0a791f8a2cb8c7f2d64df995a4d

+79 −0

4 files changed

  1. M image.c +62 −0
  2. M image.h +3 −0
  3. M main.c +13 −0
  4. M sxiv.h +1 −0
M image.c View
@@ -88,6 +88,28 @@ void img_display(img_t *img, win_t *win) {
8888 img_render(img, win);
8989 }
9090
91+void img_check_pan(img_t *img, win_t *win) {
92+ if (!img)
93+ return;
94+
95+ if (img->w * img->zoom > win->w) {
96+ if (img->x > 0 && img->x + img->w * img->zoom > win->w)
97+ img->x = 0;
98+ if (img->x < 0 && img->x + img->w * img->zoom < win->w)
99+ img->x = win->w - img->w * img->zoom;
100+ } else {
101+ img->x = (win->w - img->w * img->zoom) / 2;
102+ }
103+ if (img->h * img->zoom > win->h) {
104+ if (img->y > 0 && img->y + img->h * img->zoom > win->h)
105+ img->y = 0;
106+ if (img->y < 0 && img->y + img->h * img->zoom < win->h)
107+ img->y = win->h - img->h * img->zoom;
108+ } else {
109+ img->y = (win->h - img->h * img->zoom) / 2;
110+ }
111+}
112+
91113 void img_render(img_t *img, win_t *win) {
92114 int sx, sy, sw, sh;
93115 int dx, dy, dw, dh;
@@ -95,6 +117,8 @@ void img_render(img_t *img, win_t *win) {
95117 if (!img || !win || !imlib_context_get_image())
96118 return;
97119
120+ img_check_pan(img, win);
121+
98122 if (img->x < 0) {
99123 sx = -img->x / img->zoom;
100124 sw = win->w / img->zoom;
@@ -125,3 +149,41 @@ void img_render(img_t *img, win_t *win) {
125149
126150 win_draw(win);
127151 }
152+
153+int img_zoom(img_t *img, int d) {
154+ int ad, iz;
155+ float z;
156+
157+ if (!img)
158+ return 0;
159+
160+ ad = ABS(d);
161+ iz = (int) (img->zoom * 1000.0) + d;
162+ if (iz % ad > ad / 2)
163+ iz += ad - iz % ad;
164+ else
165+ iz -= iz % ad;
166+ z = (float) iz / 1000.0;
167+
168+ if (z * 100.0 < ZOOM_MIN)
169+ z = ZOOM_MIN / 100.0;
170+ else if (z * 100.0 > ZOOM_MAX)
171+ z = ZOOM_MAX / 100.0;
172+
173+ if (z != img->zoom) {
174+ img->x -= (img->w * z - img->w * img->zoom) / 2;
175+ img->y -= (img->h * z - img->h * img->zoom) / 2;
176+ img->zoom = z;
177+ return 1;
178+ } else {
179+ return 0;
180+ }
181+}
182+
183+int img_zoom_in(img_t *img) {
184+ return img_zoom(img, 125);
185+}
186+
187+int img_zoom_out(img_t *img) {
188+ return img_zoom(img, -125);
189+}
M image.h View
@@ -43,4 +43,7 @@ int img_load(img_t*, const char*);
4343 void img_display(img_t*, win_t*);
4444 void img_render(img_t*, win_t*);
4545
46+int img_zoom_in(img_t*);
47+int img_zoom_out(img_t*);
48+
4649 #endif /* IMAGE_H */
M main.c View
@@ -142,6 +142,19 @@ void on_keypress(XEvent *ev) {
142142 update_title();
143143 }
144144 break;
145+ case XK_plus:
146+ case XK_equal:
147+ if (img_zoom_in(&img)) {
148+ img_render(&img, &win);
149+ update_title();
150+ }
151+ break;
152+ case XK_minus:
153+ if (img_zoom_out(&img)) {
154+ img_render(&img, &win);
155+ update_title();
156+ }
157+ break;
145158 }
146159 }
147160
M sxiv.h View
@@ -23,6 +23,7 @@
2323
2424 #define VERSION "git-20110119"
2525
26+#define ABS(a) ((a) < 0 ? (-(a)) : (a))
2627 #define MIN(a,b) ((a) < (b) ? (a) : (b))
2728 #define MAX(a,b) ((a) > (b) ? (a) : (b))
2829