void feh_edit_inplace(winwidget w, int op) { int tmp; Imlib_Image old = NULL; Imlib_Load_Error err = IMLIB_LOAD_ERROR_NONE; if (!w->file || !w->file->data || !FEH_FILE(w->file->data)->filename) return; if (!strcmp(gib_imlib_image_format(w->im), "jpeg") && !path_is_url(FEH_FILE(w->file->data)->filename)) { feh_edit_inplace_lossless(w, op); feh_reload_image(w, 1, 1); return; } 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(); else if (op == INPLACE_EDIT_MIRROR) imlib_image_flip_horizontal(); else imlib_image_orientate(op); gib_imlib_save_image_with_error_return(old, FEH_FILE(w->file->data)->filename, &err); gib_imlib_free_image(old); if (err) feh_imlib_print_load_error(FEH_FILE(w->file->data)->filename, w, err); feh_reload_image(w, 1, 1); } else { /* * 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); } return; }
void feh_edit_inplace(winwidget w, int op) { int ret; Imlib_Image old; Imlib_Load_Error err; if (!w->file || !w->file->data || !FEH_FILE(w->file->data)->filename) return; if (!strcmp(gib_imlib_image_format(w->im), "jpeg")) { feh_edit_inplace_lossless(w, op); feh_reload_image(w, 1, 1); return; } ret = feh_load_image(&old, FEH_FILE(w->file->data)); if (ret) { if (op == INPLACE_EDIT_FLIP) { imlib_context_set_image(old); imlib_image_flip_vertical(); } else if (op == INPLACE_EDIT_MIRROR) { imlib_context_set_image(old); imlib_image_flip_horizontal(); } else gib_imlib_image_orientate(old, op); ungib_imlib_save_image_with_error_return(old, FEH_FILE(w->file->data)->filename, &err); gib_imlib_free_image(old); if (err) feh_imlib_print_load_error(FEH_FILE(w->file->data)->filename, w, err); feh_reload_image(w, 1, 1); } else { im_weprintf(w, "failed to load image from disk to edit it in place"); } return; }
void feh_menu_draw_item(feh_menu_item * i, Imlib_Image im, int ox, int oy) { D(("drawing item %p (text %s)\n", i, i->text)); if (i->text) { D(("text item\n")); if (MENU_ITEM_IS_SELECTED(i)) { D(("selected item\n")); /* draw selected image */ feh_menu_item_draw_at(i->x, i->y, i->w, i->h, im, ox, oy, 1); } else { D(("unselected item\n")); /* draw unselected image */ feh_menu_item_draw_at(i->x, i->y, i->w, i->h, im, ox, oy, 0); } /* draw text */ gib_imlib_text_draw(im, opt.menu_fn, opt.menu_style_l, i->x - ox + i->text_x, i->y - oy + FEH_MENUITEM_PAD_TOP, i->text, IMLIB_TEXT_TO_RIGHT, 0, 0, 0, 255); if (i->icon) { Imlib_Image im2; D(("icon item\n")); im2 = i->icon; if (im2) { int iw, ih, ow, oh; iw = gib_imlib_image_get_width(im2); ih = gib_imlib_image_get_height(im2); if (ih <= (i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM)) { ow = iw; oh = ih; } else { ow = (iw * (i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM)) / ih; oh = i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM; } gib_imlib_blend_image_onto_image(im, im2, 0, 0, 0, iw, ih, i->x + i->icon_x - ox, i->y + FEH_MENUITEM_PAD_TOP + (((i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM) - oh) / 2) - oy, ow, oh, 1, 1, 1); gib_imlib_free_image(im2); } } if (i->submenu) { D(("submenu item\n")); feh_menu_draw_submenu_at(i->x + i->sub_x, i->y + FEH_MENUITEM_PAD_TOP + ((i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM - FEH_MENU_SUBMENU_H) / 2), im, ox, oy); } if (i->is_toggle) { D(("toggleable item\n")); feh_menu_draw_toggle_at(i->x + i->toggle_x, i->y + FEH_MENUITEM_PAD_TOP + ((i->h - FEH_MENUITEM_PAD_TOP - FEH_MENUITEM_PAD_BOTTOM - FEH_MENU_TOGGLE_H) / 2), FEH_MENU_TOGGLE_W, FEH_MENU_TOGGLE_H, im, ox, oy, MENU_ITEM_IS_ON(i)); } } else { D(("separator item\n")); feh_menu_draw_separator_at(i->x, i->y, i->w, i->h, im, ox, oy); } return; }
void feh_menu_redraw(feh_menu * m) { Imlib_Updates u, uu; if ((!m->needs_redraw) || (!m->visible) || (!m->updates)) return; m->needs_redraw = 0; if (!m->pmap) m->pmap = XCreatePixmap(disp, m->win, m->w, m->h, depth); XSetWindowBackgroundPixmap(disp, m->win, m->pmap); u = imlib_updates_merge_for_rendering(m->updates, m->w, m->h); m->updates = NULL; if (u) { D(("I have updates to render\n")); for (uu = u; u; u = imlib_updates_get_next(u)) { int x, y, w, h; Imlib_Image im; imlib_updates_get_coordinates(u, &x, &y, &w, &h); D(("update coords %d,%d %d*%d\n", x, y, w, h)); im = imlib_create_image(w, h); gib_imlib_image_fill_rectangle(im, 0, 0, w, h, 0, 0, 0, 0); if (im) { feh_menu_draw_to_buf(m, im, x, y); gib_imlib_render_image_on_drawable(m->pmap, im, x, y, 1, 0, 0); gib_imlib_free_image(im); XClearArea(disp, m->win, x, y, w, h, False); } } imlib_updates_free(uu); } return; }