Preserve panning when switching images; fixes issue #131
This commit is contained in:
parent
2e758f78c1
commit
eb82519a80
2
Makefile
2
Makefile
|
@ -1,4 +1,4 @@
|
||||||
VERSION = git-20140202
|
VERSION = git-20140204
|
||||||
|
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
MANPREFIX = $(PREFIX)/share/man
|
MANPREFIX = $(PREFIX)/share/man
|
||||||
|
|
10
commands.c
10
commands.c
|
@ -433,14 +433,12 @@ cmdreturn_t i_set_zoom(arg_t a)
|
||||||
|
|
||||||
cmdreturn_t i_fit_to_win(arg_t a)
|
cmdreturn_t i_fit_to_win(arg_t a)
|
||||||
{
|
{
|
||||||
cmdreturn_t ret = CMD_INVALID;
|
|
||||||
scalemode_t sm = (scalemode_t) a;
|
scalemode_t sm = (scalemode_t) a;
|
||||||
|
|
||||||
if (mode == MODE_IMAGE) {
|
if (mode == MODE_IMAGE)
|
||||||
if ((ret = img_fit_win(&img, sm)))
|
return img_fit_win(&img, sm);
|
||||||
img_center(&img);
|
else
|
||||||
}
|
return CMD_INVALID;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdreturn_t i_fit_to_img(arg_t a)
|
cmdreturn_t i_fit_to_img(arg_t a)
|
||||||
|
|
67
image.c
67
image.c
|
@ -334,8 +334,7 @@ bool img_load(img_t *img, const fileinfo_t *file)
|
||||||
img->w = imlib_image_get_width();
|
img->w = imlib_image_get_width();
|
||||||
img->h = imlib_image_get_height();
|
img->h = imlib_image_get_height();
|
||||||
img->scalemode = options->scalemode;
|
img->scalemode = options->scalemode;
|
||||||
img->re = false;
|
img->checkpan = true;
|
||||||
img->checkpan = false;
|
|
||||||
img->dirty = true;
|
img->dirty = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -372,30 +371,29 @@ void img_check_pan(img_t *img, bool moved)
|
||||||
{
|
{
|
||||||
win_t *win;
|
win_t *win;
|
||||||
int ox, oy;
|
int ox, oy;
|
||||||
|
float w, h;
|
||||||
|
|
||||||
if (img == NULL || img->im == NULL || img->win == NULL)
|
if (img == NULL || img->im == NULL || img->win == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
win = img->win;
|
win = img->win;
|
||||||
|
w = img->w * img->zoom;
|
||||||
|
h = img->h * img->zoom;
|
||||||
ox = img->x;
|
ox = img->x;
|
||||||
oy = img->y;
|
oy = img->y;
|
||||||
|
|
||||||
if (img->w * img->zoom > win->w) {
|
if (w < win->w)
|
||||||
if (img->x > 0 && img->x + img->w * img->zoom > win->w)
|
img->x = (win->w - w) / 2;
|
||||||
|
else if (img->x > 0)
|
||||||
img->x = 0;
|
img->x = 0;
|
||||||
if (img->x < 0 && img->x + img->w * img->zoom < win->w)
|
else if (img->x + w < win->w)
|
||||||
img->x = win->w - img->w * img->zoom;
|
img->x = win->w - w;
|
||||||
} else {
|
if (h < win->h)
|
||||||
img->x = (win->w - img->w * img->zoom) / 2;
|
img->y = (win->h - h) / 2;
|
||||||
}
|
else if (img->y > 0)
|
||||||
if (img->h * img->zoom > win->h) {
|
|
||||||
if (img->y > 0 && img->y + img->h * img->zoom > win->h)
|
|
||||||
img->y = 0;
|
img->y = 0;
|
||||||
if (img->y < 0 && img->y + img->h * img->zoom < win->h)
|
else if (img->y + h < win->h)
|
||||||
img->y = win->h - img->h * img->zoom;
|
img->y = win->h - h;
|
||||||
} else {
|
|
||||||
img->y = (win->h - img->h * img->zoom) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!moved && (ox != img->x || oy != img->y))
|
if (!moved && (ox != img->x || oy != img->y))
|
||||||
img->dirty = true;
|
img->dirty = true;
|
||||||
|
@ -450,19 +448,6 @@ void img_render(img_t *img)
|
||||||
win = img->win;
|
win = img->win;
|
||||||
img_fit(img);
|
img_fit(img);
|
||||||
|
|
||||||
if (!img->re) {
|
|
||||||
/* rendered for the first time */
|
|
||||||
img->re = true;
|
|
||||||
if (img->zoom * img->w <= win->w)
|
|
||||||
img->x = (win->w - img->w * img->zoom) / 2;
|
|
||||||
else
|
|
||||||
img->x = 0;
|
|
||||||
if (img->zoom * img->h <= win->h)
|
|
||||||
img->y = (win->h - img->h * img->zoom) / 2;
|
|
||||||
else
|
|
||||||
img->y = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (img->checkpan) {
|
if (img->checkpan) {
|
||||||
img_check_pan(img, false);
|
img_check_pan(img, false);
|
||||||
img->checkpan = false;
|
img->checkpan = false;
|
||||||
|
@ -511,28 +496,18 @@ void img_render(img_t *img)
|
||||||
|
|
||||||
bool img_fit_win(img_t *img, scalemode_t sm)
|
bool img_fit_win(img_t *img, scalemode_t sm)
|
||||||
{
|
{
|
||||||
if (img == NULL || img->im == NULL)
|
float oz;
|
||||||
return false;
|
|
||||||
|
|
||||||
img->scalemode = sm;
|
|
||||||
return img_fit(img);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool img_center(img_t *img)
|
|
||||||
{
|
|
||||||
int ox, oy;
|
|
||||||
|
|
||||||
if (img == NULL || img->im == NULL || img->win == NULL)
|
if (img == NULL || img->im == NULL || img->win == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
ox = img->x;
|
oz = img->zoom;
|
||||||
oy = img->y;
|
img->scalemode = sm;
|
||||||
|
|
||||||
img->x = (img->win->w - img->w * img->zoom) / 2;
|
if (img_fit(img)) {
|
||||||
img->y = (img->win->h - img->h * img->zoom) / 2;
|
img->x = img->win->w / 2 - (img->win->w / 2 - img->x) * img->zoom / oz;
|
||||||
|
img->y = img->win->h / 2 - (img->win->h / 2 - img->y) * img->zoom / oz;
|
||||||
if (ox != img->x || oy != img->y) {
|
img->checkpan = true;
|
||||||
img->dirty = true;
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|
1
image.h
1
image.h
|
@ -76,7 +76,6 @@ void img_close(img_t*, bool);
|
||||||
void img_render(img_t*);
|
void img_render(img_t*);
|
||||||
|
|
||||||
bool img_fit_win(img_t*, scalemode_t);
|
bool img_fit_win(img_t*, scalemode_t);
|
||||||
bool img_center(img_t*);
|
|
||||||
|
|
||||||
bool img_zoom(img_t*, float);
|
bool img_zoom(img_t*, float);
|
||||||
bool img_zoom_in(img_t*);
|
bool img_zoom_in(img_t*);
|
||||||
|
|
Loading…
Reference in a new issue