⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 image.c

📁 Gqview,Linux下基于GTK+库写成的轻量级而能丰富的图像浏览程序。
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -