Added dirty flag to img struct
This commit is contained in:
		
							parent
							
								
									510512714d
								
							
						
					
					
						commit
						e2d4b9c791
					
				
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,4 +1,4 @@ | |||||||
| VERSION = git-20110910 | VERSION = git-20110911 | ||||||
| 
 | 
 | ||||||
| CC      = gcc | CC      = gcc | ||||||
| CFLAGS  = -Wall -pedantic -O2 | CFLAGS  = -Wall -pedantic -O2 | ||||||
|  | |||||||
							
								
								
									
										95
									
								
								image.c
									
									
									
									
									
								
							
							
						
						
									
										95
									
								
								image.c
									
									
									
									
									
								
							| @ -17,6 +17,7 @@ | |||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #define _POSIX_C_SOURCE 200112L | #define _POSIX_C_SOURCE 200112L | ||||||
|  | #define _IMAGE_CONFIG | ||||||
| 
 | 
 | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| @ -34,10 +35,10 @@ | |||||||
| #include "image.h" | #include "image.h" | ||||||
| #include "options.h" | #include "options.h" | ||||||
| #include "util.h" | #include "util.h" | ||||||
| 
 |  | ||||||
| #define _IMAGE_CONFIG |  | ||||||
| #include "config.h" | #include "config.h" | ||||||
| 
 | 
 | ||||||
|  | #define ZOOMDIFF(z1,z2) ((z1) - (z2) > 0.001 || (z1) - (z2) < -0.001) | ||||||
|  | 
 | ||||||
| enum { MIN_GIF_DELAY = 50 }; | enum { MIN_GIF_DELAY = 50 }; | ||||||
| 
 | 
 | ||||||
| float zoom_min; | float zoom_min; | ||||||
| @ -54,6 +55,8 @@ void img_init(img_t *img, win_t *win) { | |||||||
| 		img->zoom = options->zoom; | 		img->zoom = options->zoom; | ||||||
| 		img->zoom = MAX(img->zoom, zoom_min); | 		img->zoom = MAX(img->zoom, zoom_min); | ||||||
| 		img->zoom = MIN(img->zoom, zoom_max); | 		img->zoom = MIN(img->zoom, zoom_max); | ||||||
|  | 		img->checkpan = 0; | ||||||
|  | 		img->dirty = 0; | ||||||
| 		img->aa = options->aa; | 		img->aa = options->aa; | ||||||
| 		img->alpha = 1; | 		img->alpha = 1; | ||||||
| 		img->slideshow = 0; | 		img->slideshow = 0; | ||||||
| @ -313,6 +316,7 @@ int 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->dirty = 1; | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -339,10 +343,15 @@ void img_close(img_t *img, int decache) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void img_check_pan(img_t *img, win_t *win) { | void img_check_pan(img_t *img, win_t *win, int moved) { | ||||||
|  | 	int ox, oy; | ||||||
|  | 
 | ||||||
| 	if (!img || !win) | 	if (!img || !win) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
|  | 	ox = img->x; | ||||||
|  | 	oy = img->y; | ||||||
|  | 
 | ||||||
| 	if (img->w * img->zoom > win->w) { | 	if (img->w * img->zoom > win->w) { | ||||||
| 		if (img->x > 0 && img->x + img->w * img->zoom > win->w) | 		if (img->x > 0 && img->x + img->w * img->zoom > win->w) | ||||||
| 			img->x = 0; | 			img->x = 0; | ||||||
| @ -359,23 +368,32 @@ void img_check_pan(img_t *img, win_t *win) { | |||||||
| 	} else { | 	} else { | ||||||
| 		img->y = (win->h - img->h * img->zoom) / 2; | 		img->y = (win->h - img->h * img->zoom) / 2; | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	if (!moved && (ox != img->x || oy != img->y)) | ||||||
|  | 		img->dirty = 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int img_fit(img_t *img, win_t *win) { | int img_fit(img_t *img, win_t *win) { | ||||||
| 	float oz, zw, zh; | 	float z, zmax, zw, zh; | ||||||
| 
 | 
 | ||||||
| 	if (!img || !win) | 	if (!img || !win || img->scalemode == SCALE_ZOOM) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
| 	oz = img->zoom; | 	zmax = img->scalemode == SCALE_DOWN ? 1.0 : zoom_max; | ||||||
| 	zw = (float) win->w / (float) img->w; | 	zw = (float) win->w / (float) img->w; | ||||||
| 	zh = (float) win->h / (float) img->h; | 	zh = (float) win->h / (float) img->h; | ||||||
| 
 | 
 | ||||||
| 	img->zoom = MIN(zw, zh); | 	z = MIN(zw, zh); | ||||||
| 	img->zoom = MAX(img->zoom, zoom_min); | 	z = MAX(z, zoom_min); | ||||||
| 	img->zoom = MIN(img->zoom, zoom_max); | 	z = MIN(z, zmax); | ||||||
| 
 | 
 | ||||||
| 	return oz != img->zoom; | 	if (ZOOMDIFF(z, img->zoom)) { | ||||||
|  | 		img->zoom = z; | ||||||
|  | 		img->dirty = 1; | ||||||
|  | 		return 1; | ||||||
|  | 	} else { | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void img_render(img_t *img, win_t *win) { | void img_render(img_t *img, win_t *win) { | ||||||
| @ -385,11 +403,7 @@ void img_render(img_t *img, win_t *win) { | |||||||
| 	if (!img || !img->im || !win) | 	if (!img || !img->im || !win) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (img->scalemode != SCALE_ZOOM) { | 	img_fit(img, win); | ||||||
| 		img_fit(img, win); |  | ||||||
| 		if (img->scalemode == SCALE_DOWN && img->zoom > 1.0) |  | ||||||
| 			img->zoom = 1.0; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	if (!img->re) { | 	if (!img->re) { | ||||||
| 		/* rendered for the first time */ | 		/* rendered for the first time */ | ||||||
| @ -405,10 +419,13 @@ void img_render(img_t *img, win_t *win) { | |||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	if (img->checkpan) { | 	if (img->checkpan) { | ||||||
| 		img_check_pan(img, win); | 		img_check_pan(img, win, 0); | ||||||
| 		img->checkpan = 0; | 		img->checkpan = 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if (!img->dirty) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
| 	/* calculate source and destination offsets */ | 	/* calculate source and destination offsets */ | ||||||
| 	if (img->x < 0) { | 	if (img->x < 0) { | ||||||
| 		sx = -img->x / img->zoom; | 		sx = -img->x / img->zoom; | ||||||
| @ -444,6 +461,8 @@ void img_render(img_t *img, win_t *win) { | |||||||
| 	imlib_render_image_part_on_drawable_at_size(sx, sy, sw, sh, dx, dy, dw, dh); | 	imlib_render_image_part_on_drawable_at_size(sx, sy, sw, sh, dx, dy, dw, dh); | ||||||
| 
 | 
 | ||||||
| 	win_draw(win); | 	win_draw(win); | ||||||
|  | 
 | ||||||
|  | 	img->dirty = 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int img_fit_win(img_t *img, win_t *win) { | int img_fit_win(img_t *img, win_t *win) { | ||||||
| @ -466,7 +485,12 @@ int img_center(img_t *img, win_t *win) { | |||||||
| 	img->x = (win->w - img->w * img->zoom) / 2; | 	img->x = (win->w - img->w * img->zoom) / 2; | ||||||
| 	img->y = (win->h - img->h * img->zoom) / 2; | 	img->y = (win->h - img->h * img->zoom) / 2; | ||||||
| 	 | 	 | ||||||
| 	return ox != img->x || oy != img->y; | 	if (ox != img->x || oy != img->y) { | ||||||
|  | 		img->dirty = 1; | ||||||
|  | 		return 1; | ||||||
|  | 	} else { | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int img_zoom(img_t *img, win_t *win, float z) { | int img_zoom(img_t *img, win_t *win, float z) { | ||||||
| @ -478,11 +502,12 @@ int img_zoom(img_t *img, win_t *win, float z) { | |||||||
| 
 | 
 | ||||||
| 	img->scalemode = SCALE_ZOOM; | 	img->scalemode = SCALE_ZOOM; | ||||||
| 
 | 
 | ||||||
| 	if (z != img->zoom) { | 	if (ZOOMDIFF(z, img->zoom)) { | ||||||
| 		img->x = win->w / 2 - (win->w / 2 - img->x) * z / img->zoom; | 		img->x = win->w / 2 - (win->w / 2 - img->x) * z / img->zoom; | ||||||
| 		img->y = win->h / 2 - (win->h / 2 - img->y) * z / img->zoom; | 		img->y = win->h / 2 - (win->h / 2 - img->y) * z / img->zoom; | ||||||
| 		img->zoom = z; | 		img->zoom = z; | ||||||
| 		img->checkpan = 1; | 		img->checkpan = 1; | ||||||
|  | 		img->dirty = 1; | ||||||
| 		return 1; | 		return 1; | ||||||
| 	} else { | 	} else { | ||||||
| 		return 0; | 		return 0; | ||||||
| @ -527,9 +552,14 @@ int img_move(img_t *img, win_t *win, int dx, int dy) { | |||||||
| 	img->x += dx; | 	img->x += dx; | ||||||
| 	img->y += dy; | 	img->y += dy; | ||||||
| 
 | 
 | ||||||
| 	img_check_pan(img, win); | 	img_check_pan(img, win, 1); | ||||||
| 
 | 
 | ||||||
| 	return ox != img->x || oy != img->y; | 	if (ox != img->x || oy != img->y) { | ||||||
|  | 		img->dirty = 1; | ||||||
|  | 		return 1; | ||||||
|  | 	} else { | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int img_pan(img_t *img, win_t *win, direction_t dir, int screen) { | int img_pan(img_t *img, win_t *win, direction_t dir, int screen) { | ||||||
| @ -546,7 +576,6 @@ int img_pan(img_t *img, win_t *win, direction_t dir, int screen) { | |||||||
| 		case DIR_DOWN: | 		case DIR_DOWN: | ||||||
| 			return img_move(img, win, 0, win->h / (screen ? 1 : 5) * -1); | 			return img_move(img, win, 0, win->h / (screen ? 1 : 5) * -1); | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -574,9 +603,14 @@ int img_pan_edge(img_t *img, win_t *win, direction_t dir) { | |||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	img_check_pan(img, win); | 	img_check_pan(img, win, 1); | ||||||
| 
 | 
 | ||||||
| 	return ox != img->x || oy != img->y; | 	if (ox != img->x || oy != img->y) { | ||||||
|  | 		img->dirty = 1; | ||||||
|  | 		return 1; | ||||||
|  | 	} else { | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void img_rotate(img_t *img, win_t *win, int d) { | void img_rotate(img_t *img, win_t *win, int d) { | ||||||
| @ -599,6 +633,7 @@ void img_rotate(img_t *img, win_t *win, int d) { | |||||||
| 	img->h = tmp; | 	img->h = tmp; | ||||||
| 
 | 
 | ||||||
| 	img->checkpan = 1; | 	img->checkpan = 1; | ||||||
|  | 	img->dirty = 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void img_rotate_left(img_t *img, win_t *win) { | void img_rotate_left(img_t *img, win_t *win) { | ||||||
| @ -610,11 +645,13 @@ void img_rotate_right(img_t *img, win_t *win) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void img_toggle_antialias(img_t *img) { | void img_toggle_antialias(img_t *img) { | ||||||
| 	if (img && img->im) { | 	if (!img || !img->im) | ||||||
| 		img->aa ^= 1; | 		return; | ||||||
| 		imlib_context_set_image(img->im); | 
 | ||||||
| 		imlib_context_set_anti_alias(img->aa); | 	img->aa ^= 1; | ||||||
| 	} | 	imlib_context_set_image(img->im); | ||||||
|  | 	imlib_context_set_anti_alias(img->aa); | ||||||
|  | 	img->dirty = 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int img_frame_goto(img_t *img, int n) { | int img_frame_goto(img_t *img, int n) { | ||||||
| @ -631,6 +668,7 @@ int img_frame_goto(img_t *img, int n) { | |||||||
| 	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->checkpan = 1; | 	img->checkpan = 1; | ||||||
|  | 	img->dirty = 1; | ||||||
| 
 | 
 | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| @ -664,5 +702,6 @@ int img_frame_animate(img_t *img, int restart) { | |||||||
| 	} | 	} | ||||||
| 	img->multi.animate = 1; | 	img->multi.animate = 1; | ||||||
| 
 | 
 | ||||||
|  | 	img->dirty = 1; | ||||||
| 	return img->multi.frames[img->multi.sel].delay; | 	return img->multi.frames[img->multi.sel].delay; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Bert
						Bert