90e1260e0ceed6867d9c96a71ee7a9420e5296f3
[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 typedef void (*ImageLoaderBackendCbAreaPrepared)(gpointer loader, gpointer data);
20 typedef void (*ImageLoaderBackendCbSize)(gpointer loader, gint width, gint height, gpointer data);
21 typedef void (*ImageLoaderBackendCbAreaUpdated)(gpointer loader, guint x, guint y, guint w, guint h, gpointer data);
22
23 typedef gpointer (*ImageLoaderBackendFuncLoaderNew)(ImageLoaderBackendCbAreaUpdated, ImageLoaderBackendCbSize, ImageLoaderBackendCbAreaPrepared, gpointer data);
24 typedef void (*ImageLoaderBackendFuncSetSize)(gpointer loader, int width, int height);
25 typedef gboolean (*ImageLoaderBackendFuncLoad)(gpointer loader, const guchar *buf, gsize count, GError **error); /* optional, load whole image at once */
26 typedef gboolean (*ImageLoaderBackendFuncWrite)(gpointer loader, const guchar *buf, gsize count, GError **error);
27 typedef GdkPixbuf* (*ImageLoaderBackendFuncGetPixbuf)(gpointer loader);
28 typedef gboolean (*ImageLoaderBackendFuncClose)(gpointer loader, GError **error);
29 typedef void (*ImageLoaderBackendFuncAbort)(gpointer loader);
30 typedef void (*ImageLoaderBackendFuncFree)(gpointer loader);
31 typedef gchar* (*ImageLoaderBackendFuncGetFormatName)(gpointer loader);
32 typedef gchar** (*ImageLoaderBackendFuncGetFormatMimeTypes)(gpointer loader);
33
34 typedef struct _ImageLoaderBackend ImageLoaderBackend;
35 struct _ImageLoaderBackend
36 {
37         ImageLoaderBackendFuncLoaderNew loader_new;
38         ImageLoaderBackendFuncSetSize set_size;
39         ImageLoaderBackendFuncLoad load;
40         ImageLoaderBackendFuncWrite write;
41         ImageLoaderBackendFuncGetPixbuf get_pixbuf;
42         ImageLoaderBackendFuncClose close;
43         ImageLoaderBackendFuncAbort abort;
44         ImageLoaderBackendFuncFree free;
45         ImageLoaderBackendFuncGetFormatName get_format_name;
46         ImageLoaderBackendFuncGetFormatMimeTypes get_format_mime_types;
47 };
48
49
50 //typedef struct _ImageLoader ImageLoader;
51 typedef struct _ImageLoaderClass ImageLoaderClass;
52
53 struct _ImageLoader
54 {
55         GObject parent;
56         
57         /*< private >*/
58         GdkPixbuf *pixbuf;
59         FileData *fd;
60         gchar *path;
61
62         gsize bytes_read;
63         gsize bytes_total;
64
65         gboolean preview;
66
67         gint requested_width;
68         gint requested_height;
69         gboolean shrunk;
70
71         gboolean done;
72         guint idle_id; /* event source id */
73         gint idle_priority;
74
75         gpointer *loader;
76         GError *error;
77         ImageLoaderBackend backend;
78
79         guint idle_done_id; /* event source id */
80         GList *area_param_list;
81         GList *area_param_delayed_list;
82         
83         gboolean delay_area_ready;
84         
85         GMutex *data_mutex;
86         gboolean stopping;
87         gboolean can_destroy;
88         GCond *can_destroy_cond;
89         gboolean thread;
90
91         guchar *mapped_file;
92         gsize read_buffer_size;
93         guint idle_read_loop_count;
94 };
95
96 struct _ImageLoaderClass {
97         GObjectClass parent;
98         
99         /* class members */
100         void (*area_ready)(ImageLoader *, guint x, guint y, guint w, guint h, gpointer);
101         void (*error)(ImageLoader *, gpointer);
102         void (*done)(ImageLoader *, gpointer);
103         void (*percent)(ImageLoader *, gdouble, gpointer);
104 };
105
106 GType image_loader_get_type(void);
107
108 ImageLoader *image_loader_new(FileData *fd);
109
110 void image_loader_free(ImageLoader *il);
111
112 /* delay area_ready signals */
113 void image_loader_delay_area_ready(ImageLoader *il, gboolean enable);
114
115 /* Speed up loading when you only need at most width x height size image,
116  * only the jpeg GdkPixbuf loader benefits from it - so there is no
117  * guarantee that the image will scale down to the requested size..
118  */
119 void image_loader_set_requested_size(ImageLoader *il, gint width, gint height);
120
121 void image_loader_set_buffer_size(ImageLoader *il, guint size);
122
123 /* this only has effect if used before image_loader_start()
124  * default is G_PRIORITY_DEFAULT_IDLE
125  */
126 void image_loader_set_priority(ImageLoader *il, gint priority);
127
128 gboolean image_loader_start(ImageLoader *il);
129
130
131 GdkPixbuf *image_loader_get_pixbuf(ImageLoader *il);
132 gchar *image_loader_get_format(ImageLoader *il);
133 gdouble image_loader_get_percent(ImageLoader *il);
134 gboolean image_loader_get_is_done(ImageLoader *il);
135 FileData *image_loader_get_fd(ImageLoader *il);
136 gboolean image_loader_get_shrunk(ImageLoader *il);
137 const gchar *image_loader_get_error(ImageLoader *il);
138
139 gboolean image_load_dimensions(FileData *fd, gint *width, gint *height);
140
141 #endif
142 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */