Skip to content
Snippets Groups Projects
imlib.c 32.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • 	if (i) {
    		if (reset_output) {
    			/* There's just been an error message. Unfortunate ;) */
    			for (j = 0; j < (((i % 50) + ((i % 50) / 10)) + 7); j++)
    
    				putc(' ', stderr);
    
    			fprintf(stderr, " %5d/%d (%d)\n[%3d%%] ",
    
    					i, init_len, len, ((int) ((float) i / init_len * 100)));
    
    
    		} else if ((!(i % 10)) && (!reset_output))
    
    			putc(' ', stderr);
    
    		fputs("[  0%] ", stderr);
    
    	fprintf(stderr, "%c", stat);
    	fflush(stderr);
    
    void feh_edit_inplace(winwidget w, int op)
    
    	Imlib_Image old = NULL;
    	Imlib_Load_Error err = IMLIB_LOAD_ERROR_NONE;
    
    	if (!w->file || !w->file->data || !FEH_FILE(w->file->data)->filename)
    
    	if (!strcmp(gib_imlib_image_format(w->im), "jpeg") &&
    			!path_is_url(FEH_FILE(w->file->data)->filename)) {
    
    		feh_edit_inplace_lossless(w, op);
    
    	old = imlib_load_image_with_error_return(FEH_FILE(w->file->data)->filename, &err);
    
    	if ((old != NULL) && (err == IMLIB_LOAD_ERROR_NONE)) {
    		imlib_context_set_image(old);
    		if (op == INPLACE_EDIT_FLIP)
    
    			imlib_image_flip_vertical();
    
    			imlib_image_flip_horizontal();
    
    		gib_imlib_save_image_with_error_return(old,
    
    			FEH_FILE(w->file->data)->filename, &err);
    
    			feh_imlib_print_load_error(FEH_FILE(w->file->data)->filename,
    				w, err);
    
    		/*
    		 * Image was opened using curl/magick or has been deleted after
    		 * opening it
    		 */
    		imlib_context_set_image(w->im);
    		if (op == INPLACE_EDIT_FLIP)
    			imlib_image_flip_vertical();
    		else if (op == INPLACE_EDIT_MIRROR)
    			imlib_image_flip_horizontal();
    		else {
    			imlib_image_orientate(op);
    			tmp = w->im_w;
    			FEH_FILE(w->file->data)->info->width = w->im_w = w->im_h;
    			FEH_FILE(w->file->data)->info->height = w->im_h = tmp;
    		}
    		im_weprintf(w, "unable to edit in place. Changes have not been saved.");
    		winwidget_render_image(w, 1, 0);
    
    gib_list *feh_wrap_string(char *text, int wrap_width, Imlib_Font fn, gib_style * style)
    
    	gib_list *ll, *lines = NULL, *list = NULL, *words;
    	gib_list *l = NULL;
    	char delim[2] = { '\n', '\0' };
    	int w, line_width;
    	int tw, th;
    	char *p, *pp;
    	char *line = NULL;
    	char *temp;
    	int space_width = 0, m_width = 0, t_width = 0, new_width = 0;
    
    	lines = gib_string_split(text, delim);
    
    	if (wrap_width) {
    		gib_imlib_get_text_size(fn, "M M", style, &t_width, NULL, IMLIB_TEXT_TO_RIGHT);
    		gib_imlib_get_text_size(fn, "M", style, &m_width, NULL, IMLIB_TEXT_TO_RIGHT);
    		space_width = t_width - (2 * m_width);
    		w = wrap_width;
    		l = lines;
    		while (l) {
    			line_width = 0;
    			p = (char *) l->data;
    			/* quick check to see if whole line fits okay */
    			gib_imlib_get_text_size(fn, p, style, &tw, &th, IMLIB_TEXT_TO_RIGHT);
    			if (tw <= w) {
    				list = gib_list_add_end(list, estrdup(p));
    			} else if (strlen(p) == 0) {
    				list = gib_list_add_end(list, estrdup(""));
    			} else if (!strcmp(p, " ")) {
    				list = gib_list_add_end(list, estrdup(" "));
    			} else {
    				words = gib_string_split(p, " ");
    				if (words) {
    					ll = words;
    					while (ll) {
    						pp = (char *) ll->data;
    						if (strcmp(pp, " ")) {
    							gib_imlib_get_text_size
    							    (fn, pp, style, &tw, &th, IMLIB_TEXT_TO_RIGHT);
    							if (line_width == 0)
    								new_width = tw;
    							else
    								new_width = line_width + space_width + tw;
    							if (new_width <= w) {
    								/* add word to line */
    								if (line) {
    									int len;
    
    									len = strlen(line)
    									    + strlen(pp)
    									    + 2;
    									temp = emalloc(len);
    									snprintf(temp, len, "%s %s", line, pp);
    									free(line);
    									line = temp;
    								} else {
    									line = estrdup(pp);
    								}
    								line_width = new_width;
    							} else if (line_width == 0) {
    								/* can't fit single word in :/
    								   increase width limit to width of word
    								   and jam the bastard in anyhow */
    								w = tw;
    								line = estrdup(pp);
    								line_width = new_width;
    							} else {
    								/* finish this line, start next and add word there */
    								if (line) {
    									list = gib_list_add_end(list, estrdup(line));
    									free(line);
    									line = NULL;
    								}
    								line = estrdup(pp);
    								line_width = tw;
    							}
    						}
    						ll = ll->next;
    					}
    					if (line) {
    						/* finish last line */
    						list = gib_list_add_end(list, estrdup(line));
    						free(line);
    						line = NULL;
    					}
    					gib_list_free_and_data(words);
    				}
    			}
    			l = l->next;
    		}
    		gib_list_free_and_data(lines);
    		lines = list;
    	}
    	return lines;
    
    void feh_edit_inplace_lossless(winwidget w, int op)
    
    	char *filename = FEH_FILE(w->file->data)->filename;
    
    	int len = strlen(filename) + 1;
    	char *file_str = emalloc(len);
    	int pid, status;
    
    	char op_name[]  = "rotate";     /* message */
    	char op_op[]    = "-rotate";    /* jpegtran option */
    	char op_value[] = "horizontal"; /* jpegtran option's value */
    
    
    	if (op == INPLACE_EDIT_FLIP) {
    		sprintf(op_name,  "flip");
    		sprintf(op_op,    "-flip");
    		sprintf(op_value, "vertical");
    	} else if (op == INPLACE_EDIT_MIRROR) {
    		sprintf(op_name,  "mirror");
    		sprintf(op_op,    "-flip");
    	} else
    		snprintf(op_value, 4, "%d", 90 * op);
    
    	snprintf(file_str, len, "%s", filename);
    
    		im_weprintf(w, "lossless %s: fork failed:", op_name);
    
    		execlp("jpegtran", "jpegtran", "-copy", "all", op_op, op_value,
    				"-outfile", file_str, file_str, NULL);
    
    		weprintf("lossless %s: Is 'jpegtran' installed? Failed to exec:", op_name);
    		_exit(1);
    
    		waitpid(pid, &status, 0);
    
    		if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
    
    					"lossless %s: Got exitcode %d from jpegtran."
    
    					"jpegtran -copy all %s %s -outfile %s %s",
    					op_name, status >> 8, op_op, op_value, file_str, file_str);
    
    	if ((pid = fork()) < 0) {
    
    		im_weprintf(w, "lossless %s: fork failed while updating EXIF tags:", op_name);
    
    	}
    	else if (pid == 0) {
    
    		/* discard normal output */
    		devnull = open("/dev/null", O_WRONLY);
    		dup2(devnull, 1);
    
    		execlp("jpegexiforient", "jpegexiforient", "-1", file_str, NULL);
    
    		weprintf("lossless %s: Failed to exec jpegexiforient:", op_name);
    		_exit(1);
    
    	}
    	else {
    		waitpid(pid, &status, 0);
    
    		if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
    			im_weprintf(w,
    
    					"lossless %s: Failed to update EXIF orientation tag:"
    					" jpegexiforient returned %d",
    					op_name, status >> 8);
    
    void feh_draw_actions(winwidget w)
    
    	static Imlib_Font fn = NULL;
    	int tw = 0, th = 0;
    	int th_offset = 0;
    	int max_tw = 0;
    	int line_th = 0;
    	Imlib_Image im = NULL;
    	int i = 0;
    	int num_actions = 0;
    	int cur_action = 0;
    
    orbea's avatar
    orbea committed
    	char index[3];
    
    	char *line;
    
    	/* Count number of defined actions. This method sucks a bit since it needs
    	 * to be changed if the number of actions changes, but at least it doesn't
    	 * miss actions 2 to 9 if action1 isn't defined
    	 */
    	for (i = 0; i < 10; i++) {
    		if (opt.actions[i])
    			num_actions++;
    	}
    
    	if (num_actions == 0)
    		return;
    
    	if ((!w->file) || (!FEH_FILE(w->file->data))
    			|| (!FEH_FILE(w->file->data)->filename))
    
    
    	gib_imlib_get_text_size(fn, "defined actions:", NULL, &tw, &th, IMLIB_TEXT_TO_RIGHT);
    
    /* Check for the widest line */
    
    	max_tw = tw;
    
    	for (i = 0; i < 10; i++) {
    		if (opt.actions[i]) {
    
    			line = emalloc(strlen(opt.action_titles[i]) + 5);
    
    			line = strcat(line, opt.action_titles[i]);
    
    			gib_imlib_get_text_size(fn, line, NULL, &tw, &th, IMLIB_TEXT_TO_RIGHT);
    			free(line);
    
    			if (tw > max_tw)
    				max_tw = tw;
    		}
    	}
    
    	tw = max_tw;
    	tw += 3;
    	th += 3;
    	line_th = th;
    	th = (th * num_actions) + line_th;
    
    	/* This depends on feh_draw_filename internals...
    	 * should be fixed some time
    	 */
    
    	if (opt.draw_filename)
    
    		th_offset = line_th * 2;
    
    	im = imlib_create_image(tw, th);
    	if (!im)
    		eprintf("Couldn't create image. Out of memory?");
    
    
    
    	gib_imlib_text_draw(im, fn, NULL, 2, 2, "defined actions:", IMLIB_TEXT_TO_RIGHT, 0, 0, 0, 255);
    	gib_imlib_text_draw(im, fn, NULL, 1, 1, "defined actions:", IMLIB_TEXT_TO_RIGHT, 255, 255, 255, 255);
    
    	for (i = 0; i < 10; i++) {
    
    		if (opt.action_titles[i]) {
    
    			line = emalloc(strlen(opt.action_titles[i]) + 5);
    
    			sprintf(index, "%d", i);
    			strcpy(line, index);
    			strcat(line, ": ");
    
    			strcat(line, opt.action_titles[i]);
    
    
    			gib_imlib_text_draw(im, fn, NULL, 2,
    					(cur_action * line_th) + 2, line,
    					IMLIB_TEXT_TO_RIGHT, 0, 0, 0, 255);
    			gib_imlib_text_draw(im, fn, NULL, 1,
    					(cur_action * line_th) + 1, line,
    					IMLIB_TEXT_TO_RIGHT, 255, 255, 255, 255);
    			free(line);
    		}
    	}
    
    	gib_imlib_render_image_on_drawable(w->bg_pmap, im, 0, 0 + th_offset, 1, 1, 0);
    
    	gib_imlib_free_image_and_decache(im);