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