#define DEFINE_IMAGER_CALLBACKS im_ext_funcs *imager_function_ext_table
+#ifndef IMAGER_MIN_API_LEVEL
+#define IMAGER_MIN_API_LEVEL IMAGER_API_LEVEL
+#endif
+
#define PERL_INITIALIZE_IMAGER_CALLBACKS \
- imager_function_ext_table = INT2PTR(im_ext_funcs *, SvIV(get_sv(PERL_FUNCTION_TABLE_NAME, 1)))
+ do { \
+ imager_function_ext_table = INT2PTR(im_ext_funcs *, SvIV(get_sv(PERL_FUNCTION_TABLE_NAME, 1))); \
+ if (!imager_function_ext_table) \
+ croak("Imager API function table not found!"); \
+ if (imager_function_ext_table->version != IMAGER_API_VERSION) \
+ croak("Imager API version incorrect"); \
+ if (imager_function_ext_table->level < IMAGER_MIN_API_LEVEL) \
+ croak("API level %d below minimum of %d", imager_function_ext_table->level, IMAGER_MIN_API_LEVEL); \
+ } while (0)
/* just for use here */
#define im_extt imager_function_ext_table
#include "imdatatypes.h"
+/*
+ IMAGER_API_VERSION is similar to the version number in the third and
+ fourth bytes of TIFF files - if it ever changes then the API has changed
+ too much for any application to remain compatible.
+*/
+#define IMAGER_API_VERSION 1
+
+/*
+ IMAGER_API_LEVEL is the level of the structure. New function pointers
+ will always remain at the end (unless IMAGER_API_VERSION changes), and
+ will result in an increment of IMAGER_API_LEVEL.
+*/
+
+#define IMAGER_API_LEVEL 1
+
typedef struct {
+ int version;
+ int level;
+
+ /* IMAGER_API_LEVEL 1 functions */
void * (*f_mymalloc)(int size);
void (*f_myfree)(void *block);
void * (*f_myrealloc)(void *block, size_t newsize);
void (*f_i_copyto_trans)(i_img *im, i_img *src, int x1, int y1, int x2, int y2, int tx, int ty, const i_color *trans);
i_img *(*f_i_copy)(i_img *im);
int (*f_i_rubthru)(i_img *im, i_img *src, int tx, int ty, int src_minx, int src_miny, int src_maxx, int src_maxy);
+
+ /* IMAGER_API_LEVEL 2 functions will be added here */
} im_ext_funcs;
#define PERL_FUNCTION_TABLE_NAME "Imager::__ext_func_table"
=for comment
-From: Line 199 in imext.c
+From: Line 202 in imext.c
=item i_glinf(im, l, r, y, colors)
=for comment
-From: Line 234 in imext.c
+From: Line 237 in imext.c
=item i_gpal(im, x, r, y, indexes)
=for comment
-From: Line 298 in imext.c
+From: Line 301 in imext.c
=item i_gpix(im, x, y, color)
=for comment
-From: Line 127 in imext.c
+From: Line 130 in imext.c
=item i_gpixf(im, x, y, fcolor)
=for comment
-From: Line 163 in imext.c
+From: Line 166 in imext.c
=item i_gsamp(im, l, r, y, samp, chans, chan_count)
=for comment
-From: Line 252 in imext.c
+From: Line 255 in imext.c
=item i_gsampf(im, l, r, y, samp, chans, chan_count)
=for comment
-From: Line 275 in imext.c
+From: Line 278 in imext.c
=item i_line(im, x1, y1, x2, y2, val, endp)
=for comment
-From: Line 181 in imext.c
+From: Line 184 in imext.c
=item i_plinf(im, l, r, fcolors)
=for comment
-From: Line 216 in imext.c
+From: Line 219 in imext.c
=item i_ppal(im, x, r, y, indexes)
=for comment
-From: Line 317 in imext.c
+From: Line 320 in imext.c
=item i_ppix(im, x, y, color)
=for comment
-From: Line 107 in imext.c
+From: Line 110 in imext.c
=item i_ppixf(im, x, y, fcolor)
=for comment
-From: Line 144 in imext.c
+From: Line 147 in imext.c
=back
=for comment
-From: Line 336 in imext.c
+From: Line 339 in imext.c
=item i_colorcount(im)
=for comment
-From: Line 382 in imext.c
+From: Line 385 in imext.c
=item i_findcolor(im, color, &entry)
=for comment
-From: Line 417 in imext.c
+From: Line 420 in imext.c
=item i_getcolors(im, index, colors, count)
=for comment
-From: Line 357 in imext.c
+From: Line 360 in imext.c
=item i_maxcolors(im)
=for comment
-From: Line 399 in imext.c
+From: Line 402 in imext.c
=item i_setcolors(im, index, colors, count)
=for comment
-From: Line 437 in imext.c
+From: Line 440 in imext.c
=back