Fix #314: Remote commands for thumbnail maintenance
[geeqie.git] / src / image-load.h
1 /*
2  * Copyright (C) 2004 John Ellis
3  * Copyright (C) 2008 - 2016 The Geeqie Team
4  *
5  * Author: John Ellis
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #ifndef IMAGE_LOAD_H
23 #define IMAGE_LOAD_H
24
25 #define TYPE_IMAGE_LOADER               (image_loader_get_type())
26
27 typedef void (*ImageLoaderBackendCbAreaPrepared)(gpointer loader, gpointer data);
28 typedef void (*ImageLoaderBackendCbSize)(gpointer loader, gint width, gint height, gpointer data);
29 typedef void (*ImageLoaderBackendCbAreaUpdated)(gpointer loader, guint x, guint y, guint w, guint h, gpointer data);
30
31 typedef gpointer (*ImageLoaderBackendFuncLoaderNew)(ImageLoaderBackendCbAreaUpdated, ImageLoaderBackendCbSize, ImageLoaderBackendCbAreaPrepared, gpointer data);
32 typedef void (*ImageLoaderBackendFuncSetSize)(gpointer loader, int width, int height);
33 typedef gboolean (*ImageLoaderBackendFuncLoad)(gpointer loader, const guchar *buf, gsize count, GError **error); /* optional, load whole image at once */
34 typedef gboolean (*ImageLoaderBackendFuncWrite)(gpointer loader, const guchar *buf, gsize count, GError **error);
35 typedef GdkPixbuf* (*ImageLoaderBackendFuncGetPixbuf)(gpointer loader);
36 typedef gboolean (*ImageLoaderBackendFuncClose)(gpointer loader, GError **error);
37 typedef void (*ImageLoaderBackendFuncAbort)(gpointer loader);
38 typedef void (*ImageLoaderBackendFuncFree)(gpointer loader);
39 typedef gchar* (*ImageLoaderBackendFuncGetFormatName)(gpointer loader);
40 typedef gchar** (*ImageLoaderBackendFuncGetFormatMimeTypes)(gpointer loader);
41
42 typedef struct _ImageLoaderBackend ImageLoaderBackend;
43 struct _ImageLoaderBackend
44 {
45         ImageLoaderBackendFuncLoaderNew loader_new;
46         ImageLoaderBackendFuncSetSize set_size;
47         ImageLoaderBackendFuncLoad load;
48         ImageLoaderBackendFuncWrite write;
49         ImageLoaderBackendFuncGetPixbuf get_pixbuf;
50         ImageLoaderBackendFuncClose close;
51         ImageLoaderBackendFuncAbort abort;
52         ImageLoaderBackendFuncFree free;
53         ImageLoaderBackendFuncGetFormatName get_format_name;
54         ImageLoaderBackendFuncGetFormatMimeTypes get_format_mime_types;
55 };
56
57
58 //typedef struct _ImageLoader ImageLoader;
59 typedef struct _ImageLoaderClass ImageLoaderClass;
60
61 struct _ImageLoader
62 {
63         GObject parent;
64
65         /*< private >*/
66         GdkPixbuf *pixbuf;
67         FileData *fd;
68         gchar *path;
69
70         gsize bytes_read;
71         gsize bytes_total;
72
73         gboolean preview;
74
75         gint requested_width;
76         gint requested_height;
77
78         gint actual_width;
79         gint actual_height;
80
81         gboolean shrunk;
82
83         gboolean done;
84         guint idle_id; /* event source id */
85         gint idle_priority;
86
87         gpointer *loader;
88         GError *error;
89         ImageLoaderBackend backend;
90
91         guint idle_done_id; /* event source id */
92         GList *area_param_list;
93         GList *area_param_delayed_list;
94
95         gboolean delay_area_ready;
96
97         GMutex *data_mutex;
98         gboolean stopping;
99         gboolean can_destroy;
100         GCond *can_destroy_cond;
101         gboolean thread;
102
103         guchar *mapped_file;
104         gsize read_buffer_size;
105         guint idle_read_loop_count;
106 };
107
108 struct _ImageLoaderClass {
109         GObjectClass parent;
110
111         /* class members */
112         void (*area_ready)(ImageLoader *, guint x, guint y, guint w, guint h, gpointer);
113         void (*error)(ImageLoader *, gpointer);
114         void (*done)(ImageLoader *, gpointer);
115         void (*percent)(ImageLoader *, gdouble, gpointer);
116 };
117
118 GType image_loader_get_type(void);
119
120 ImageLoader *image_loader_new(FileData *fd);
121
122 void image_loader_free(ImageLoader *il);
123
124 /* delay area_ready signals */
125 void image_loader_delay_area_ready(ImageLoader *il, gboolean enable);
126
127 /* Speed up loading when you only need at most width x height size image,
128  * only the jpeg GdkPixbuf loader benefits from it - so there is no
129  * guarantee that the image will scale down to the requested size..
130  */
131 void image_loader_set_requested_size(ImageLoader *il, gint width, gint height);
132
133 void image_loader_set_buffer_size(ImageLoader *il, guint size);
134
135 /* this only has effect if used before image_loader_start()
136  * default is G_PRIORITY_DEFAULT_IDLE
137  */
138 void image_loader_set_priority(ImageLoader *il, gint priority);
139
140 gboolean image_loader_start(ImageLoader *il);
141
142
143 GdkPixbuf *image_loader_get_pixbuf(ImageLoader *il);
144 gchar *image_loader_get_format(ImageLoader *il);
145 gdouble image_loader_get_percent(ImageLoader *il);
146 gboolean image_loader_get_is_done(ImageLoader *il);
147 FileData *image_loader_get_fd(ImageLoader *il);
148 gboolean image_loader_get_shrunk(ImageLoader *il);
149 const gchar *image_loader_get_error(ImageLoader *il);
150
151 gboolean image_load_dimensions(FileData *fd, gint *width, gint *height);
152
153 #endif
154 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */