Render image on window
This commit is contained in:
		
							
								
								
									
										4
									
								
								app.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								app.c
									
									
									
									
									
								
							@@ -28,7 +28,7 @@ void app_init(app_t *app) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	app->fileidx = 0;
 | 
						app->fileidx = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	app->img.zoom = 100;
 | 
						app->img.zoom = 1.0;
 | 
				
			||||||
	app->img.scalemode = SCALE_MODE;
 | 
						app->img.scalemode = SCALE_MODE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	app->win.w = WIN_WIDTH;
 | 
						app->win.w = WIN_WIDTH;
 | 
				
			||||||
@@ -52,4 +52,6 @@ void app_load_image(app_t *app) {
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	img_load(&app->img, app->filenames[app->fileidx]);
 | 
						img_load(&app->img, app->filenames[app->fileidx]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						img_render(&app->img, &app->win);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										55
									
								
								image.c
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								image.c
									
									
									
									
									
								
							@@ -47,3 +47,58 @@ void img_load(img_t *img, char *filename) {
 | 
				
			|||||||
	img->w = imlib_image_get_width();
 | 
						img->w = imlib_image_get_width();
 | 
				
			||||||
	img->h = imlib_image_get_height();
 | 
						img->h = imlib_image_get_height();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void img_render(img_t *img, win_t *win) {
 | 
				
			||||||
 | 
						float zw, zh;
 | 
				
			||||||
 | 
						unsigned int sx, sy, sw, sh;
 | 
				
			||||||
 | 
						unsigned int dx, dy, dw, dh;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!img || !win)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* set zoom level to fit image into window */
 | 
				
			||||||
 | 
						if (img->scalemode != SCALE_ZOOM) {
 | 
				
			||||||
 | 
							zw = (float) win->w / (float) img->w;
 | 
				
			||||||
 | 
							zh = (float) win->h / (float) img->h;
 | 
				
			||||||
 | 
							img->zoom = MIN(zw, zh);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (img->zoom * 100.0 < ZOOM_MIN)
 | 
				
			||||||
 | 
								img->zoom = ZOOM_MIN / 100.0;
 | 
				
			||||||
 | 
							else if (img->zoom * 100.0 > ZOOM_MAX)
 | 
				
			||||||
 | 
								img->zoom = ZOOM_MAX / 100.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (img->scalemode == SCALE_DOWN && img->zoom > 1.0)
 | 
				
			||||||
 | 
								img->zoom = 1.0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* center image in window */
 | 
				
			||||||
 | 
						img->x = (win->w - img->w * img->zoom) / 2;
 | 
				
			||||||
 | 
						img->y = (win->h - img->h * img->zoom) / 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (img->x < 0) {
 | 
				
			||||||
 | 
							sx = -img->x / img->zoom;
 | 
				
			||||||
 | 
							sw = (img->x + win->w) / img->zoom;
 | 
				
			||||||
 | 
							dx = 0;
 | 
				
			||||||
 | 
							dw = win->w;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							sx = 0;
 | 
				
			||||||
 | 
							sw = img->w;
 | 
				
			||||||
 | 
							dx = img->x;
 | 
				
			||||||
 | 
							dw = img->w * img->zoom;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (img->y < 0) {
 | 
				
			||||||
 | 
							sy = -img->y / img->zoom;
 | 
				
			||||||
 | 
							sh = (img->y + win->h) / img->zoom;
 | 
				
			||||||
 | 
							dy = 0;
 | 
				
			||||||
 | 
							dh = win->h;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							sy = 0;
 | 
				
			||||||
 | 
							sh = img->h;
 | 
				
			||||||
 | 
							dy = img->y;
 | 
				
			||||||
 | 
							dh = img->h * img->zoom;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						win_clear(win);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						imlib_render_image_part_on_drawable_at_size(sx, sy, sw, sh, dx, dy, dw, dh);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								image.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								image.h
									
									
									
									
									
								
							@@ -30,7 +30,7 @@ typedef enum scalemode_e {
 | 
				
			|||||||
} scalemode_t;
 | 
					} scalemode_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct img_s {
 | 
					typedef struct img_s {
 | 
				
			||||||
	int zoom;
 | 
						float zoom;
 | 
				
			||||||
	scalemode_t scalemode;
 | 
						scalemode_t scalemode;
 | 
				
			||||||
	int w;
 | 
						int w;
 | 
				
			||||||
	int h;
 | 
						int h;
 | 
				
			||||||
@@ -43,6 +43,6 @@ typedef struct img_s {
 | 
				
			|||||||
void imlib_init(win_t*);
 | 
					void imlib_init(win_t*);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void img_load(img_t*, char*);
 | 
					void img_load(img_t*, char*);
 | 
				
			||||||
void img_display(img_t*, win_t*);
 | 
					void img_render(img_t*, win_t*);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* IMAGE_H */
 | 
					#endif /* IMAGE_H */
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								sxiv.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								sxiv.h
									
									
									
									
									
								
							@@ -23,6 +23,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define VERSION "git-20110117"
 | 
					#define VERSION "git-20110117"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MIN(a,b) ((a) < (b) ? (a) : (b))
 | 
				
			||||||
 | 
					#define MAX(a,b) ((a) > (b) ? (a) : (b))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define WARN(...)                                                  \
 | 
					#define WARN(...)                                                  \
 | 
				
			||||||
	do {                                                             \
 | 
						do {                                                             \
 | 
				
			||||||
	  fprintf(stderr, "sxiv: %s:%d: warning: ", __FILE__, __LINE__); \
 | 
						  fprintf(stderr, "sxiv: %s:%d: warning: ", __FILE__, __LINE__); \
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								window.c
									
									
									
									
									
								
							@@ -106,3 +106,10 @@ int win_configure(win_t *win, XConfigureEvent *cev) {
 | 
				
			|||||||
	win->bw = cev->border_width;
 | 
						win->bw = cev->border_width;
 | 
				
			||||||
	return changed;
 | 
						return changed;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void win_clear(win_t *win) {
 | 
				
			||||||
 | 
						if (!win)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						XClearWindow(win->env.dpy, win->xwin);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user