dungeon_crawler

annotate prototype/imago2/imago2.h @ 67:2560a7ab0243

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