rev |
line source |
nuclear@26
|
1 /*
|
nuclear@26
|
2 libimago - a multi-format image file input/output library.
|
nuclear@26
|
3 Copyright (C) 2010 John Tsiombikas <nuclear@member.fsf.org>
|
nuclear@26
|
4
|
nuclear@26
|
5 This program is free software: you can redistribute it and/or modify
|
nuclear@26
|
6 it under the terms of the GNU Lesser General Public License as published
|
nuclear@26
|
7 by the Free Software Foundation, either version 3 of the License, or
|
nuclear@26
|
8 (at your option) any later version.
|
nuclear@26
|
9
|
nuclear@26
|
10 This program is distributed in the hope that it will be useful,
|
nuclear@26
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
nuclear@26
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
nuclear@26
|
13 GNU Lesser General Public License for more details.
|
nuclear@26
|
14
|
nuclear@26
|
15 You should have received a copy of the GNU Lesser General Public License
|
nuclear@26
|
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
|
nuclear@26
|
17 */
|
nuclear@26
|
18
|
nuclear@26
|
19 #ifndef IMAGO2_H_
|
nuclear@26
|
20 #define IMAGO2_H_
|
nuclear@26
|
21
|
nuclear@26
|
22 #include <stdio.h>
|
nuclear@26
|
23
|
nuclear@26
|
24 #ifdef __cplusplus
|
nuclear@26
|
25 #define IMG_OPTARG(arg, val) arg = val
|
nuclear@26
|
26 #else
|
nuclear@26
|
27 #define IMG_OPTARG(arg, val) arg
|
nuclear@26
|
28 #endif
|
nuclear@26
|
29
|
nuclear@26
|
30 /* XXX if you change this make sure to also change pack/unpack arrays in conv.c */
|
nuclear@26
|
31 enum img_fmt {
|
nuclear@26
|
32 IMG_FMT_GREY8,
|
nuclear@26
|
33 IMG_FMT_RGB24,
|
nuclear@26
|
34 IMG_FMT_RGBA32,
|
nuclear@26
|
35 IMG_FMT_GREYF,
|
nuclear@26
|
36 IMG_FMT_RGBF,
|
nuclear@26
|
37 IMG_FMT_RGBAF,
|
nuclear@26
|
38
|
nuclear@26
|
39 NUM_IMG_FMT
|
nuclear@26
|
40 };
|
nuclear@26
|
41
|
nuclear@26
|
42 struct img_pixmap {
|
nuclear@26
|
43 void *pixels;
|
nuclear@26
|
44 int width, height;
|
nuclear@26
|
45 enum img_fmt fmt;
|
nuclear@26
|
46 int pixelsz;
|
nuclear@26
|
47 char *name;
|
nuclear@26
|
48 };
|
nuclear@26
|
49
|
nuclear@26
|
50 struct img_io {
|
nuclear@26
|
51 void *uptr; /* user-data */
|
nuclear@26
|
52
|
nuclear@26
|
53 size_t (*read)(void *buf, size_t bytes, void *uptr);
|
nuclear@26
|
54 size_t (*write)(void *buf, size_t bytes, void *uptr);
|
nuclear@26
|
55 long (*seek)(long offs, int whence, void *uptr);
|
nuclear@26
|
56 };
|
nuclear@26
|
57
|
nuclear@26
|
58 #ifdef __cplusplus
|
nuclear@26
|
59 extern "C" {
|
nuclear@26
|
60 #endif
|
nuclear@26
|
61
|
nuclear@26
|
62 /* initialize the img_pixmap structure */
|
nuclear@26
|
63 void img_init(struct img_pixmap *img);
|
nuclear@26
|
64 /* destroys the img_pixmap structure, freeing the pixel buffer (if available)
|
nuclear@26
|
65 * and any other memory held by the pixmap.
|
nuclear@26
|
66 */
|
nuclear@26
|
67 void img_destroy(struct img_pixmap *img);
|
nuclear@26
|
68
|
nuclear@26
|
69 /* convenience function that allocates an img_pixmap struct and then initializes it.
|
nuclear@26
|
70 * returns null if the malloc fails.
|
nuclear@26
|
71 */
|
nuclear@26
|
72 struct img_pixmap *img_create(void);
|
nuclear@26
|
73 /* frees a pixmap previously allocated with img_create (free followed by img_destroy) */
|
nuclear@26
|
74 void img_free(struct img_pixmap *img);
|
nuclear@26
|
75
|
nuclear@26
|
76 int img_set_name(struct img_pixmap *img, const char *name);
|
nuclear@26
|
77
|
nuclear@26
|
78 /* set the image pixel format */
|
nuclear@26
|
79 int img_set_format(struct img_pixmap *img, enum img_fmt fmt);
|
nuclear@26
|
80
|
nuclear@26
|
81 /* copies one pixmap to another.
|
nuclear@26
|
82 * equivalent to: img_set_pixels(dest, src->width, src->height, src->fmt, src->pixels)
|
nuclear@26
|
83 */
|
nuclear@26
|
84 int img_copy(struct img_pixmap *dest, struct img_pixmap *src);
|
nuclear@26
|
85
|
nuclear@26
|
86 /* allocates a pixel buffer of the specified dimensions and format, and copies the
|
nuclear@26
|
87 * pixels given through the pix pointer into it.
|
nuclear@26
|
88 * the pix pointer can be null, in which case there's no copy, just allocation.
|
nuclear@26
|
89 *
|
nuclear@26
|
90 * C++: fmt and pix have default parameters IMG_FMT_RGBA32 and null respectively.
|
nuclear@26
|
91 */
|
nuclear@26
|
92 int img_set_pixels(struct img_pixmap *img, int w, int h, IMG_OPTARG(enum img_fmt fmt, IMG_FMT_RGBA32), IMG_OPTARG(void *pix, 0));
|
nuclear@26
|
93
|
nuclear@26
|
94 /* Simplified image loading
|
nuclear@26
|
95 * Loads the specified file, and returns a pointer to an array of pixels of the
|
nuclear@26
|
96 * requested pixel format. The width and height of the image are returned through
|
nuclear@26
|
97 * the xsz and ysz pointers.
|
nuclear@26
|
98 * If the image cannot be loaded, the function returns null.
|
nuclear@26
|
99 *
|
nuclear@26
|
100 * C++: the format argument is optional and defaults to IMG_FMT_RGBA32
|
nuclear@26
|
101 */
|
nuclear@26
|
102 void *img_load_pixels(const char *fname, int *xsz, int *ysz, IMG_OPTARG(enum img_fmt fmt, IMG_FMT_RGBA32));
|
nuclear@26
|
103
|
nuclear@26
|
104 /* Simplified image saving
|
nuclear@26
|
105 * Reads an array of pixels supplied through the pix pointer, of dimensions xsz
|
nuclear@26
|
106 * and ysz, and pixel-format fmt, and saves it to a file.
|
nuclear@26
|
107 * The output filetype is guessed by the filename suffix.
|
nuclear@26
|
108 *
|
nuclear@26
|
109 * C++: the format argument is optional and defaults to IMG_FMT_RGBA32
|
nuclear@26
|
110 */
|
nuclear@26
|
111 int img_save_pixels(const char *fname, void *pix, int xsz, int ysz, IMG_OPTARG(enum img_fmt fmt, IMG_FMT_RGBA32));
|
nuclear@26
|
112
|
nuclear@26
|
113 /* Frees the memory allocated by img_load_pixels */
|
nuclear@26
|
114 void img_free_pixels(void *pix);
|
nuclear@26
|
115
|
nuclear@26
|
116 /* Loads an image file into the supplied pixmap */
|
nuclear@26
|
117 int img_load(struct img_pixmap *img, const char *fname);
|
nuclear@26
|
118 /* Saves the supplied pixmap to a file. The output filetype is guessed by the filename suffix */
|
nuclear@26
|
119 int img_save(struct img_pixmap *img, const char *fname);
|
nuclear@26
|
120
|
nuclear@26
|
121 /* Reads an image from an open FILE* into the supplied pixmap */
|
nuclear@26
|
122 int img_read_file(struct img_pixmap *img, FILE *fp);
|
nuclear@26
|
123 /* Writes the supplied pixmap to an open FILE* */
|
nuclear@26
|
124 int img_write_file(struct img_pixmap *img, FILE *fp);
|
nuclear@26
|
125
|
nuclear@26
|
126 /* Reads an image using user-defined file-i/o functions (see img_io_set_*) */
|
nuclear@26
|
127 int img_read(struct img_pixmap *img, struct img_io *io);
|
nuclear@26
|
128 /* Writes an image using user-defined file-i/o functions (see img_io_set_*) */
|
nuclear@26
|
129 int img_write(struct img_pixmap *img, struct img_io *io);
|
nuclear@26
|
130
|
nuclear@26
|
131 /* Converts an image to the specified pixel format */
|
nuclear@26
|
132 int img_convert(struct img_pixmap *img, enum img_fmt tofmt);
|
nuclear@26
|
133
|
nuclear@26
|
134 /* Converts an image from an integer pixel format to the corresponding floating point one */
|
nuclear@26
|
135 int img_to_float(struct img_pixmap *img);
|
nuclear@26
|
136 /* Converts an image from a floating point pixel format to the corresponding integer one */
|
nuclear@26
|
137 int img_to_integer(struct img_pixmap *img);
|
nuclear@26
|
138
|
nuclear@26
|
139 /* Returns non-zero (true) if the supplied image is in a floating point pixel format */
|
nuclear@26
|
140 int img_is_float(struct img_pixmap *img);
|
nuclear@26
|
141 /* Returns non-zero (true) if the supplied image has an alpha channel */
|
nuclear@26
|
142 int img_has_alpha(struct img_pixmap *img);
|
nuclear@26
|
143
|
nuclear@26
|
144
|
nuclear@26
|
145 /* These functions can be used to fill an img_io struct before it's passed to
|
nuclear@26
|
146 * one of the user-defined i/o image reading/writing functions (img_read/img_write).
|
nuclear@26
|
147 *
|
nuclear@26
|
148 * User-defined i/o functions:
|
nuclear@26
|
149 *
|
nuclear@26
|
150 * - size_t read_func(void *buffer, size_t bytes, void *user_ptr)
|
nuclear@26
|
151 * Must try to fill the buffer with the specified number of bytes, and return
|
nuclear@26
|
152 * the number of bytes actually read.
|
nuclear@26
|
153 *
|
nuclear@26
|
154 * - size_t write_func(void *buffer, size_t bytes, void *user_ptr)
|
nuclear@26
|
155 * Must write the specified number of bytes from the supplied buffer and return
|
nuclear@26
|
156 * the number of bytes actually written.
|
nuclear@26
|
157 *
|
nuclear@26
|
158 * - long seek_func(long offset, int whence, void *user_ptr)
|
nuclear@26
|
159 * Must seek offset bytes from: the beginning of the file if whence is SEEK_SET,
|
nuclear@26
|
160 * the current position if whence is SEEK_CUR, or the end of the file if whence is
|
nuclear@26
|
161 * SEEK_END, and return the resulting file offset from the beginning of the file.
|
nuclear@26
|
162 * (i.e. seek_func(0, SEEK_CUR, user_ptr); must be equivalent to an ftell).
|
nuclear@26
|
163 *
|
nuclear@26
|
164 * All three functions get the user-data pointer set through img_io_set_user_data
|
nuclear@26
|
165 * as their last argument.
|
nuclear@26
|
166 *
|
nuclear@26
|
167 * Note: obviously you don't need to set a write function if you're only going
|
nuclear@26
|
168 * to call img_read, or the read and seek function if you're only going to call
|
nuclear@26
|
169 * img_write.
|
nuclear@26
|
170 *
|
nuclear@26
|
171 * Note: if the user-supplied write function is buffered, make sure to flush
|
nuclear@26
|
172 * (or close the file) after img_write returns.
|
nuclear@26
|
173 */
|
nuclear@26
|
174 void img_io_set_user_data(struct img_io *io, void *uptr);
|
nuclear@26
|
175 void img_io_set_read_func(struct img_io *io, size_t (*read)(void*, size_t, void*));
|
nuclear@26
|
176 void img_io_set_write_func(struct img_io *io, size_t (*write)(void*, size_t, void*));
|
nuclear@26
|
177 void img_io_set_seek_func(struct img_io *io, long (*seek)(long, int, void*));
|
nuclear@26
|
178
|
nuclear@26
|
179
|
nuclear@26
|
180 #ifdef __cplusplus
|
nuclear@26
|
181 }
|
nuclear@26
|
182 #endif
|
nuclear@26
|
183
|
nuclear@26
|
184
|
nuclear@26
|
185 #endif /* IMAGO_H_ */
|