Nicer zooming
This commit is contained in:
		
							
								
								
									
										12
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								config.h
									
									
									
									
									
								
							@@ -2,12 +2,14 @@
 | 
				
			|||||||
#define WIN_WIDTH  800
 | 
					#define WIN_WIDTH  800
 | 
				
			||||||
#define WIN_HEIGHT 600
 | 
					#define WIN_HEIGHT 600
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* */
 | 
				
			||||||
 | 
					#define BG_COLOR   "#888888"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* */
 | 
					/* */
 | 
				
			||||||
#define SCALE_MODE SCALE_DOWN
 | 
					#define SCALE_MODE SCALE_DOWN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* */
 | 
					/* */
 | 
				
			||||||
#define ZOOM_MIN   12.5
 | 
					static const float zoom_levels[] = {
 | 
				
			||||||
#define ZOOM_MAX   400
 | 
						 12.5,  25.0,  50.0,  75.0,
 | 
				
			||||||
 | 
						100.0, 150.0, 200.0, 400.0, 800.0
 | 
				
			||||||
/* */
 | 
					};
 | 
				
			||||||
#define BG_COLOR   "#888888"
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										61
									
								
								image.c
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								image.c
									
									
									
									
									
								
							@@ -24,6 +24,10 @@
 | 
				
			|||||||
#include "sxiv.h"
 | 
					#include "sxiv.h"
 | 
				
			||||||
#include "image.h"
 | 
					#include "image.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int zl_cnt;
 | 
				
			||||||
 | 
					float zoom_min;
 | 
				
			||||||
 | 
					float zoom_max;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void imlib_init(win_t *win) {
 | 
					void imlib_init(win_t *win) {
 | 
				
			||||||
	if (!win)
 | 
						if (!win)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
@@ -31,6 +35,10 @@ void imlib_init(win_t *win) {
 | 
				
			|||||||
	imlib_context_set_display(win->env.dpy);
 | 
						imlib_context_set_display(win->env.dpy);
 | 
				
			||||||
	imlib_context_set_visual(win->env.vis);
 | 
						imlib_context_set_visual(win->env.vis);
 | 
				
			||||||
	imlib_context_set_colormap(win->env.cmap);
 | 
						imlib_context_set_colormap(win->env.cmap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						zl_cnt = sizeof(zoom_levels) / sizeof(zoom_levels[0]);
 | 
				
			||||||
 | 
						zoom_min = zoom_levels[0] / 100.0;
 | 
				
			||||||
 | 
						zoom_max = zoom_levels[zl_cnt - 1] / 100.0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void imlib_destroy() {
 | 
					void imlib_destroy() {
 | 
				
			||||||
@@ -72,10 +80,10 @@ void img_display(img_t *img, win_t *win) {
 | 
				
			|||||||
		zh = (float) win->h / (float) img->h;
 | 
							zh = (float) win->h / (float) img->h;
 | 
				
			||||||
		img->zoom = MIN(zw, zh);
 | 
							img->zoom = MIN(zw, zh);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (img->zoom * 100.0 < ZOOM_MIN)
 | 
							if (img->zoom < zoom_min)
 | 
				
			||||||
			img->zoom = ZOOM_MIN / 100.0;
 | 
								img->zoom = zoom_min;
 | 
				
			||||||
		else if (img->zoom * 100.0 > ZOOM_MAX)
 | 
							else if (img->zoom > zoom_max)
 | 
				
			||||||
			img->zoom = ZOOM_MAX / 100.0;
 | 
								img->zoom = zoom_max;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (img->scalemode == SCALE_DOWN && img->zoom > 1.0)
 | 
							if (img->scalemode == SCALE_DOWN && img->zoom > 1.0)
 | 
				
			||||||
			img->zoom = 1.0;
 | 
								img->zoom = 1.0;
 | 
				
			||||||
@@ -150,25 +158,14 @@ void img_render(img_t *img, win_t *win) {
 | 
				
			|||||||
	win_draw(win);
 | 
						win_draw(win);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int img_zoom(img_t *img, int d) {
 | 
					int img_zoom(img_t *img, float z) {
 | 
				
			||||||
	int ad, iz;
 | 
					 | 
				
			||||||
	float z;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!img)
 | 
						if (!img)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ad = ABS(d);
 | 
						if (z < zoom_min)
 | 
				
			||||||
	iz = (int) (img->zoom * 1000.0) + d;
 | 
							z = zoom_min;
 | 
				
			||||||
	if (iz % ad > ad / 2)
 | 
						else if (z > zoom_max)
 | 
				
			||||||
		iz += ad - iz % ad;
 | 
							z = zoom_max;
 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		iz -= iz % ad;
 | 
					 | 
				
			||||||
	z = (float) iz / 1000.0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (z * 100.0 < ZOOM_MIN)
 | 
					 | 
				
			||||||
		z = ZOOM_MIN / 100.0;
 | 
					 | 
				
			||||||
	else if (z * 100.0 > ZOOM_MAX)
 | 
					 | 
				
			||||||
		z = ZOOM_MAX / 100.0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (z != img->zoom) {
 | 
						if (z != img->zoom) {
 | 
				
			||||||
		img->x -= (img->w * z - img->w * img->zoom) / 2;
 | 
							img->x -= (img->w * z - img->w * img->zoom) / 2;
 | 
				
			||||||
@@ -181,9 +178,29 @@ int img_zoom(img_t *img, int d) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int img_zoom_in(img_t *img) {
 | 
					int img_zoom_in(img_t *img) {
 | 
				
			||||||
	return img_zoom(img, 125);
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!img)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 1; i < zl_cnt; ++i) {
 | 
				
			||||||
 | 
							if (zoom_levels[i] > img->zoom * 100.0)
 | 
				
			||||||
 | 
								return img_zoom(img, zoom_levels[i] / 100.0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int img_zoom_out(img_t *img) {
 | 
					int img_zoom_out(img_t *img) {
 | 
				
			||||||
	return img_zoom(img, -125);
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!img)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = zl_cnt - 2; i >= 0; --i) {
 | 
				
			||||||
 | 
							if (zoom_levels[i] < img->zoom * 100.0)
 | 
				
			||||||
 | 
								return img_zoom(img, zoom_levels[i] / 100.0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user