c6ffbbd94ec56bc8aae951aadd7b5ee9041f8203
[geeqie.git] / src / image-load.h
1 /*
2  * Geeqie
3  * (C) 2004 John Ellis
4  * Copyright (C) 2008 - 2010 The Geeqie Team
5  *
6  * Author: John Ellis
7  *
8  * This software is released under the GNU General Public License (GNU GPL).
9  * Please read the included file COPYING for more information.
10  * This software comes with no warranty of any kind, use at your own risk!
11  */
12
13
14 #ifndef IMAGE_LOAD_H
15 #define IMAGE_LOAD_H
16
17 #define TYPE_IMAGE_LOADER               (image_loader_get_type())
18
19
20 typedef struct _ImageLoaderBackend ImageLoaderBackend;
21 struct _ImageLoaderBackend
22 {
23         gpointer (*loader_new)(GCallback area_updated_cb, GCallback size_cb, GCallback area_prepared_cb, gpointer data);
24         void (*set_size)(gpointer loader, int width, int height);
25         gboolean (*write)(gpointer loader, const guchar *buf, gsize count, GError **error);
26         GdkPixbuf* (*get_pixbuf)(gpointer loader);
27         gboolean (*close)(gpointer loader, GError **error);
28
29         gchar* (*get_format_name)(gpointer loader);
30         gchar** (*get_format_mime_types)(gpointer loader);
31 };
32
33
34 //typedef struct _ImageLoader ImageLoader;
35 typedef struct _ImageLoaderClass ImageLoaderClass;
36
37 struct _ImageLoader
38 {
39         GObject parent;
40         
41         /*< private >*/
42         GdkPixbuf *pixbuf;
43         FileData *fd;
44         gchar *path;
45
46         gsize bytes_read;
47         gsize bytes_total;
48
49         gboolean preview;
50
51         gint requested_width;
52         gint requested_height;
53         gboolean shrunk;
54
55         gboolean done;
56         guint idle_id; /* event source id */
57         gint idle_priority;
58
59         gpointer *loader;
60         GError *error;
61         ImageLoaderBackend backend;
62
63         guint idle_done_id; /* event source id */
64         GList *area_param_list;
65         GList *area_param_delayed_list;
66         
67         gboolean delay_area_ready;
68         
69         GMutex *data_mutex;
70         gboolean stopping;
71         gboolean can_destroy;
72         GCond *can_destroy_cond;
73         gboolean thread;
74
75         guchar *mapped_file;
76         gsize read_buffer_size;
77         guint idle_read_loop_count;
78 };
79
80 struct _ImageLoaderClass {
81         GObjectClass parent;
82         
83         /* class members */
84         void (*area_ready)(ImageLoader *, guint x, guint y, guint w, guint h, gpointer);
85         void (*error)(ImageLoader *, gpointer);
86         void (*done)(ImageLoader *, gpointer);
87         void (*percent)(ImageLoader *, gdouble, gpointer);
88 };
89
90 GType image_loader_get_type(void);
91
92 ImageLoader *image_loader_new(FileData *fd);
93
94 void image_loader_free(ImageLoader *il);
95
96 /* delay area_ready signals */
97 void image_loader_delay_area_ready(ImageLoader *il, gboolean enable);
98
99 /* Speed up loading when you only need at most width x height size image,
100  * only the jpeg GdkPixbuf loader benefits from it - so there is no
101  * guarantee that the image will scale down to the requested size..
102  */
103 void image_loader_set_requested_size(ImageLoader *il, gint width, gint height);
104
105 void image_loader_set_buffer_size(ImageLoader *il, guint size);
106
107 /* this only has effect if used before image_loader_start()
108  * default is G_PRIORITY_DEFAULT_IDLE
109  */
110 void image_loader_set_priority(ImageLoader *il, gint priority);
111
112 gboolean image_loader_start(ImageLoader *il);
113
114
115 GdkPixbuf *image_loader_get_pixbuf(ImageLoader *il);
116 gchar *image_loader_get_format(ImageLoader *il);
117 gdouble image_loader_get_percent(ImageLoader *il);
118 gboolean image_loader_get_is_done(ImageLoader *il);
119 FileData *image_loader_get_fd(ImageLoader *il);
120 gboolean image_loader_get_shrunk(ImageLoader *il);
121 const gchar *image_loader_get_error(ImageLoader *il);
122
123 gboolean image_load_dimensions(FileData *fd, gint *width, gint *height);
124
125 #endif
126 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */