📄 image.c
字号:
imd->size = source->size; imd->mtime = source->mtime; image_set_path(imd, image_get_path(source)); image_loader_free(imd->il); imd->il = NULL; if (source->il) { imd->il = source->il; source->il = NULL; image_loader_sync_data(imd->il, imd); imd->delay_alter_type = source->delay_alter_type; source->delay_alter_type = ALTER_NONE; } image_loader_free(imd->read_ahead_il); imd->read_ahead_il = source->read_ahead_il; source->read_ahead_il = NULL; if (imd->read_ahead_il) image_loader_sync_data(imd->read_ahead_il, imd); if (imd->read_ahead_pixbuf) g_object_unref(imd->read_ahead_pixbuf); imd->read_ahead_pixbuf = source->read_ahead_pixbuf; source->read_ahead_pixbuf = NULL; g_free(imd->read_ahead_path); imd->read_ahead_path = source->read_ahead_path; source->read_ahead_path = NULL; if (imd->prev_pixbuf) g_object_unref(imd->prev_pixbuf); imd->prev_pixbuf = source->prev_pixbuf; source->prev_pixbuf = NULL; g_free(imd->prev_path); imd->prev_path = source->prev_path; source->prev_path = NULL; imd->completed = source->completed; pixbuf_renderer_move(PIXBUF_RENDERER(imd->pr), PIXBUF_RENDERER(source->pr));}/* manipulation */void image_area_changed(ImageWindow *imd, gint x, gint y, gint width, gint height){ pixbuf_renderer_area_changed((PixbufRenderer *)imd->pr, x, y, width, height);}void image_reload(ImageWindow *imd){ if (pixbuf_renderer_get_tiles((PixbufRenderer *)imd->pr)) return; image_change_complete(imd, image_zoom_get(imd), FALSE);}void image_scroll(ImageWindow *imd, gint x, gint y){ pixbuf_renderer_scroll((PixbufRenderer *)imd->pr, x, y);}void image_scroll_to_point(ImageWindow *imd, gint x, gint y, gdouble x_align, gdouble y_align){ pixbuf_renderer_scroll_to_point((PixbufRenderer *)imd->pr, x, y, x_align, y_align);}void image_alter(ImageWindow *imd, AlterType type){ if (pixbuf_renderer_get_tiles((PixbufRenderer *)imd->pr)) return; if (imd->il) { /* still loading, wait till done */ imd->delay_alter_type = type; return; } image_alter_real(imd, type, TRUE);}void image_zoom_adjust(ImageWindow *imd, gdouble increment){ pixbuf_renderer_zoom_adjust((PixbufRenderer *)imd->pr, increment);}void image_zoom_adjust_at_point(ImageWindow *imd, gdouble increment, gint x, gint y){ pixbuf_renderer_zoom_adjust_at_point((PixbufRenderer *)imd->pr, increment, x, y);}void image_zoom_set_limits(ImageWindow *imd, gdouble min, gdouble max){ pixbuf_renderer_zoom_set_limits((PixbufRenderer *)imd->pr, min, max);}void image_zoom_set(ImageWindow *imd, gdouble zoom){ pixbuf_renderer_zoom_set((PixbufRenderer *)imd->pr, zoom);}void image_zoom_set_fill_geometry(ImageWindow *imd, gint vertical){ PixbufRenderer *pr; gdouble zoom; gint width, height; pr = (PixbufRenderer *)imd->pr; if (!pixbuf_renderer_get_pixbuf(pr) || !pixbuf_renderer_get_image_size(pr, &width, &height)) return; if (vertical) { zoom = (gdouble)pr->window_height / height; } else { zoom = (gdouble)pr->window_width / width; } if (zoom < 1.0) { zoom = 0.0 - 1.0 / zoom; } pixbuf_renderer_zoom_set(pr, zoom);}gdouble image_zoom_get(ImageWindow *imd){ return pixbuf_renderer_zoom_get((PixbufRenderer *)imd->pr);}gdouble image_zoom_get_real(ImageWindow *imd){ return pixbuf_renderer_zoom_get_scale((PixbufRenderer *)imd->pr);}gchar *image_zoom_get_as_text(ImageWindow *imd){ gdouble zoom; gdouble scale; gdouble l = 1.0; gdouble r = 1.0; gint pl = 0; gint pr = 0; gchar *approx = " "; zoom = image_zoom_get(imd); scale = image_zoom_get_real(imd); if (zoom > 0.0) { l = zoom; } else if (zoom < 0.0) { r = 0.0 - zoom; } else if (zoom == 0.0 && scale != 0.0) { if (scale >= 1.0) { l = scale; } else { r = 1.0 / scale; } approx = " ~"; } if (rint(l) != l) pl = 1; if (rint(r) != r) pr = 1; return g_strdup_printf("%.*f :%s%.*f", pl, l, approx, pr, r);}gdouble image_zoom_get_default(ImageWindow *imd, gint mode){ gdouble zoom; if (mode == ZOOM_RESET_ORIGINAL) { zoom = 1.0; } else if (mode == ZOOM_RESET_FIT_WINDOW) { zoom = 0.0; } else { if (imd) { zoom = image_zoom_get(imd); } else { zoom = 1.0; } } return zoom;}/* read ahead */void image_prebuffer_set(ImageWindow *imd, const gchar *path){ if (pixbuf_renderer_get_tiles((PixbufRenderer *)imd->pr)) return; if (path) { image_read_ahead_set(imd, path); } else { image_read_ahead_cancel(imd); }}static gint image_auto_refresh_cb(gpointer data){ ImageWindow *imd = data; time_t newtime; if (!imd || !image_get_pixbuf(imd) || imd->il || !imd->image_path || !update_on_time_change) return TRUE; newtime = filetime(imd->image_path); if (newtime > 0 && newtime != imd->mtime) { imd->mtime = newtime; image_reload(imd); } return TRUE;}/* image auto refresh on time stamp change, in 1/1000's second, -1 disables */void image_auto_refresh(ImageWindow *imd, gint interval){ if (!imd) return; if (pixbuf_renderer_get_tiles((PixbufRenderer *)imd->pr)) return; if (imd->auto_refresh_id > -1) { g_source_remove(imd->auto_refresh_id); imd->auto_refresh_id = -1; imd->auto_refresh_interval = -1; } if (interval < 0) return; if (interval == 0) interval = IMAGE_AUTO_REFRESH_TIME; imd->auto_refresh_id = g_timeout_add((guint32)interval, image_auto_refresh_cb, imd); imd->auto_refresh_interval = interval;}void image_top_window_set_sync(ImageWindow *imd, gint allow_sync){ imd->top_window_sync = allow_sync; g_object_set(G_OBJECT(imd->pr), "window_fit", allow_sync, NULL);}void image_background_set_black(ImageWindow *imd, gint black){ pixbuf_renderer_set_black((PixbufRenderer *)imd->pr, black);}void image_background_set_color(ImageWindow *imd, GdkColor *color){ pixbuf_renderer_set_color((PixbufRenderer *)imd->pr, color);}void image_set_delay_flip(ImageWindow *imd, gint delay){ if (!imd || imd->delay_flip == delay) return; imd->delay_flip = delay; g_object_set(G_OBJECT(imd->pr), "delay_flip", delay, NULL); if (!imd->delay_flip && imd->il) { PixbufRenderer *pr; pr = PIXBUF_RENDERER(imd->pr); if (pr->pixbuf) g_object_unref(pr->pixbuf); pr->pixbuf = NULL; image_load_pixbuf_ready(imd); }}void image_to_root_window(ImageWindow *imd, gint scaled){ GdkScreen *screen; GdkWindow *rootwindow; GdkPixmap *pixmap; GdkPixbuf *pixbuf; GdkPixbuf *pb; gint width, height; if (!imd) return; pixbuf = image_get_pixbuf(imd); if (!pixbuf) return; screen = gtk_widget_get_screen(imd->widget); rootwindow = gdk_screen_get_root_window(screen); if (gdk_drawable_get_visual(rootwindow) != gdk_visual_get_system()) return; if (scaled) { width = gdk_screen_width(); height = gdk_screen_height(); } else { pixbuf_renderer_get_scaled_size((PixbufRenderer *)imd->pr, &width, &height); } pb = gdk_pixbuf_scale_simple(pixbuf, width, height, (GdkInterpType)zoom_quality); gdk_pixbuf_render_pixmap_and_mask (pb, &pixmap, NULL, 128); gdk_window_set_back_pixmap(rootwindow, pixmap, FALSE); gdk_window_clear(rootwindow); g_object_unref(pb); g_object_unref(pixmap); gdk_flush();}/* *------------------------------------------------------------------- * prefs sync *------------------------------------------------------------------- */static void image_options_set(ImageWindow *imd){ g_object_set(G_OBJECT(imd->pr), "zoom_quality", zoom_quality, "zoom_2pass", two_pass_zoom, "zoom_expand", zoom_to_fit_expands, "dither_quality", dither_quality, "scroll_reset", scroll_reset_method, "cache_display", tile_cache_max, "window_fit", (imd->top_window_sync && fit_window), "window_limit", limit_window_size, "window_limit_value", max_window_size, NULL); pixbuf_renderer_set_parent((PixbufRenderer *)imd->pr, (GtkWindow *)imd->top_window);}void image_options_sync(void){ GList *work; work = image_list; while (work) { ImageWindow *imd; imd = work->data; work = work->next; image_options_set(imd); }}/* *------------------------------------------------------------------- * init / destroy *------------------------------------------------------------------- */static void image_free(ImageWindow *imd){ image_list = g_list_remove(image_list, imd); image_reset(imd); image_read_ahead_cancel(imd); image_post_buffer_set(imd, NULL, NULL); image_auto_refresh(imd, -1); g_free(imd->image_path); g_free(imd->title); g_free(imd->title_right); g_free(imd);}static void image_destroy_cb(GtkObject *widget, gpointer data){ ImageWindow *imd = data; image_free(imd);}ImageWindow *image_new(gint frame){ ImageWindow *imd; imd = g_new0(ImageWindow, 1); imd->top_window = NULL; imd->title = NULL; imd->title_right = NULL; imd->title_show_zoom = FALSE; imd->unknown = TRUE; imd->has_frame = frame; imd->top_window_sync = FALSE; imd->delay_alter_type = ALTER_NONE; imd->read_ahead_il = NULL; imd->read_ahead_pixbuf = NULL; imd->read_ahead_path = NULL; imd->completed = FALSE; imd->auto_refresh_id = -1; imd->auto_refresh_interval = -1; imd->delay_flip = FALSE; imd->func_update = NULL; imd->func_complete = NULL; imd->func_tile_request = NULL; imd->func_tile_dispose = NULL; imd->func_button = NULL; imd->func_scroll = NULL; imd->pr = GTK_WIDGET(pixbuf_renderer_new()); image_options_set(imd); if (imd->has_frame) { imd->widget = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(imd->widget), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(imd->widget), imd->pr); gtk_widget_show(imd->pr); GTK_WIDGET_SET_FLAGS(imd->widget, GTK_CAN_FOCUS); g_signal_connect(G_OBJECT(imd->widget), "focus_in_event", G_CALLBACK(image_focus_in_cb), imd); g_signal_connect(G_OBJECT(imd->widget), "focus_out_event", G_CALLBACK(image_focus_out_cb), imd); g_signal_connect_after(G_OBJECT(imd->widget), "expose_event", G_CALLBACK(image_focus_expose), imd); } else { imd->widget = imd->pr; } g_signal_connect(G_OBJECT(imd->pr), "clicked", G_CALLBACK(image_click_cb), imd); g_signal_connect(G_OBJECT(imd->pr), "scroll_notify", G_CALLBACK(image_scroll_notify_cb), imd); g_signal_connect(G_OBJECT(imd->pr), "scroll_event", G_CALLBACK(image_scroll_cb), imd); g_signal_connect(G_OBJECT(imd->pr), "destroy", G_CALLBACK(image_destroy_cb), imd); g_signal_connect(G_OBJECT(imd->pr), "zoom", G_CALLBACK(image_zoom_cb), imd); g_signal_connect(G_OBJECT(imd->pr), "render_complete", G_CALLBACK(image_render_complete_cb), imd); image_list = g_list_append(image_list, imd); return imd;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -