Krolyxon
Commit eb82519

Branches

Refs →

nsxiveb82519

Preserve panning when switching images; fixes issue #131

Author
Bert Münnich
Date
2014-02-04 21:02 +0100
Parent
2e758f7
Commit
eb82519a80ab3d09fb3294d64a3526c678433d22

+29 −57

4 files changed

  1. M Makefile +1 −1
  2. M commands.c +4 −6
  3. M image.c +24 −49
  4. M image.h +0 −1
M Makefile View
@@ -1,4 +1,4 @@
1−VERSION = git-20140202
1+VERSION = git-20140204
22
33 PREFIX = /usr/local
44 MANPREFIX = $(PREFIX)/share/man
M commands.c View
@@ -433,14 +433,12 @@ cmdreturn_t i_set_zoom(arg_t a)
433433
434434 cmdreturn_t i_fit_to_win(arg_t a)
435435 {
436− cmdreturn_t ret = CMD_INVALID;
437436 scalemode_t sm = (scalemode_t) a;
438437
439− if (mode == MODE_IMAGE) {
440− if ((ret = img_fit_win(&img, sm)))
441− img_center(&img);
442− }
443− return ret;
438+ if (mode == MODE_IMAGE)
439+ return img_fit_win(&img, sm);
440+ else
441+ return CMD_INVALID;
444442 }
445443
446444 cmdreturn_t i_fit_to_img(arg_t a)
M image.c View
@@ -334,8 +334,7 @@ bool img_load(img_t *img, const fileinfo_t *file)
334334 img->w = imlib_image_get_width();
335335 img->h = imlib_image_get_height();
336336 img->scalemode = options->scalemode;
337− img->re = false;
338− img->checkpan = false;
337+ img->checkpan = true;
339338 img->dirty = true;
340339
341340 return true;
@@ -372,30 +371,29 @@ void img_check_pan(img_t *img, bool moved)
372371 {
373372 win_t *win;
374373 int ox, oy;
374+ float w, h;
375375
376376 if (img == NULL || img->im == NULL || img->win == NULL)
377377 return;
378378
379379 win = img->win;
380+ w = img->w * img->zoom;
381+ h = img->h * img->zoom;
380382 ox = img->x;
381383 oy = img->y;
382384
383− if (img->w * img->zoom > win->w) {
384− if (img->x > 0 && img->x + img->w * img->zoom > win->w)
385− img->x = 0;
386− if (img->x < 0 && img->x + img->w * img->zoom < win->w)
387− img->x = win->w - img->w * img->zoom;
388− } else {
389− img->x = (win->w - img->w * img->zoom) / 2;
390− }
391− if (img->h * img->zoom > win->h) {
392− if (img->y > 0 && img->y + img->h * img->zoom > win->h)
393− img->y = 0;
394− if (img->y < 0 && img->y + img->h * img->zoom < win->h)
395− img->y = win->h - img->h * img->zoom;
396− } else {
397− img->y = (win->h - img->h * img->zoom) / 2;
398− }
385+ if (w < win->w)
386+ img->x = (win->w - w) / 2;
387+ else if (img->x > 0)
388+ img->x = 0;
389+ else if (img->x + w < win->w)
390+ img->x = win->w - w;
391+ if (h < win->h)
392+ img->y = (win->h - h) / 2;
393+ else if (img->y > 0)
394+ img->y = 0;
395+ else if (img->y + h < win->h)
396+ img->y = win->h - h;
399397
400398 if (!moved && (ox != img->x || oy != img->y))
401399 img->dirty = true;
@@ -450,19 +448,6 @@ void img_render(img_t *img)
450448 win = img->win;
451449 img_fit(img);
452450
453− if (!img->re) {
454− /* rendered for the first time */
455− img->re = true;
456− if (img->zoom * img->w <= win->w)
457− img->x = (win->w - img->w * img->zoom) / 2;
458− else
459− img->x = 0;
460− if (img->zoom * img->h <= win->h)
461− img->y = (win->h - img->h * img->zoom) / 2;
462− else
463− img->y = 0;
464− }
465−
466451 if (img->checkpan) {
467452 img_check_pan(img, false);
468453 img->checkpan = false;
@@ -511,28 +496,18 @@ void img_render(img_t *img)
511496
512497 bool img_fit_win(img_t *img, scalemode_t sm)
513498 {
514− if (img == NULL || img->im == NULL)
515− return false;
516−
517− img->scalemode = sm;
518− return img_fit(img);
519−}
520−
521−bool img_center(img_t *img)
522−{
523− int ox, oy;
499+ float oz;
524500
525501 if (img == NULL || img->im == NULL || img->win == NULL)
526502 return false;
527−
528− ox = img->x;
529− oy = img->y;
530503
531− img->x = (img->win->w - img->w * img->zoom) / 2;
532− img->y = (img->win->h - img->h * img->zoom) / 2;
533−
534− if (ox != img->x || oy != img->y) {
535− img->dirty = true;
504+ oz = img->zoom;
505+ img->scalemode = sm;
506+
507+ if (img_fit(img)) {
508+ img->x = img->win->w / 2 - (img->win->w / 2 - img->x) * img->zoom / oz;
509+ img->y = img->win->h / 2 - (img->win->h / 2 - img->y) * img->zoom / oz;
510+ img->checkpan = true;
536511 return true;
537512 } else {
538513 return false;
M image.h View
@@ -76,7 +76,6 @@ void img_close(img_t*, bool);
7676 void img_render(img_t*);
7777
7878 bool img_fit_win(img_t*, scalemode_t);
79−bool img_center(img_t*);
8079
8180 bool img_zoom(img_t*, float);
8281 bool img_zoom_in(img_t*);