Fix panning and pedantries
dkl9

dkl9 commited on 2026-126 01:07:20
Showing 2 changed files, with 16 additions and 9 deletions.

... ...
@@ -1,5 +1,5 @@
1 1
 iv : main.o
2
-	cc -O2 -o iv main.o -lSDL2 -lSDL2_image
2
+	cc -O2 -o iv main.o -lSDL2 -lSDL2_image -lm
3 3
 
4 4
 main.o : main.c
5 5
 	cc -O2 -c -Wall main.c
... ...
@@ -1,6 +1,7 @@
1 1
 /* iv/main.c - see README */
2 2
 
3 3
 #include <libgen.h>
4
+#include <math.h>
4 5
 #include <stdio.h>
5 6
 #include <stdlib.h>
6 7
 #include <string.h>
... ...
@@ -241,6 +242,8 @@ int main(int argc, char** argv) {
241 242
     unsigned int wdim[2] = {iw, ih};
242 243
     /* mouse position */
243 244
     int mpos[2];
245
+    int iic;
246
+    float dz;
244 247
 
245 248
     while (r) {
246 249
         ef = 0;
... ...
@@ -248,7 +251,7 @@ int main(int argc, char** argv) {
248 251
             switch (ev.type) {
249 252
 
250 253
                 case SDL_KEYUP:
251
-                    int iic = 0;
254
+                    iic = 0;
252 255
                     switch (handlekey(ev.key.keysym.sym, &sl[ci], ci, fc, wdim)) {
253 256
                         case 4:
254 257
                             r = 0;
... ...
@@ -286,17 +289,21 @@ int main(int argc, char** argv) {
286 289
                 case SDL_MOUSEMOTION:
287 290
                     /* pan-dragging if mouse is down */
288 291
                     if (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(1)) {
289
-                        int hid, big;
292
+                        int hid, rhid;
290 293
                         int rel[2] = {ev.motion.xrel, ev.motion.yrel};
291 294
                         /* clamp panning to edges of window */
292 295
                         TWICE(
296
+                            /* scaled (onscreen) image size, halved */
293 297
                             hid = ZSH(sl[ci].idim[j], sl[ci].zoom - 1.0);
294
-                            big = 2 * hid > wdim[j];
298
+                            rhid = wdim[j] - hid;
299
+                            if (2 * hid > wdim[j]) {
300
+                                int tmp = hid;
301
+                                hid = rhid;
302
+                                rhid = tmp;
303
+                            }
295 304
                             sl[ci].pan[j] = CLAMP(
296
-                                big ? wdim[j] - hid : hid,
297
-                                sl[ci].pan[j] + rel[j],
298
-                                big ? hid : wdim[j] - hid
299
-                            )
305
+                                hid, sl[ci].pan[j] + rel[j], rhid
306
+                            );
300 307
                         )
301 308
                         ef = 1;
302 309
                     }
... ...
@@ -306,7 +313,7 @@ int main(int argc, char** argv) {
306 313
 
307 314
                 case SDL_MOUSEWHEEL:
308 315
                     /* scrolling changes zoom */
309
-                    float dz = DZDS * ev.wheel.y;
316
+                    dz = DZDS * ev.wheel.y;
310 317
                     sl[ci].zoom += dz;
311 318
                     TWICE(sl[ci].pan[j] = mpos[j] - ZSH((mpos[j] - sl[ci].pan[j]), dz))
312 319
                     ef = 1;
313 320