1 #include "imexttypes.h"
5 static im_context_t get_context(void);
6 static i_img *mathom_i_img_8_new(i_img_dim, i_img_dim, int);
7 static i_img *mathom_i_img_16_new(i_img_dim, i_img_dim, int);
8 static i_img *mathom_i_img_double_new(i_img_dim, i_img_dim, int);
9 static i_img *mathom_i_img_pal_new(i_img_dim, i_img_dim, int, int);
10 static void mathom_i_clear_error(void);
11 static void mathom_i_push_error(int, const char *);
12 static void mathom_i_push_errorvf(int, const char *, va_list);
13 static int mathom_i_set_image_file_limits(i_img_dim, i_img_dim, size_t);
14 static int mathom_i_get_image_file_limits(i_img_dim*, i_img_dim*, size_t*);
16 mathom_i_int_check_image_file_limits(i_img_dim, i_img_dim, int, size_t);
17 static i_img *mathom_i_img_alloc(void);
18 static void mathom_i_img_init(i_img *);
19 static i_io_glue_t *mathom_io_new_fd(int);
20 static i_io_glue_t *mathom_io_new_bufchain(void);
22 mathom_io_new_buffer(const char *data, size_t, i_io_closebufp_t, void *);
24 mathom_io_new_cb(void *, i_io_readl_t, i_io_writel_t, i_io_seekl_t,
25 i_io_closel_t, i_io_destroyl_t);
28 DON'T ADD CASTS TO THESE
30 im_ext_funcs imager_function_table =
45 mathom_i_img_double_new,
86 mathom_i_push_errorvf,
123 /* IMAGER_API_LEVEL 2 functions */
124 mathom_i_set_image_file_limits,
125 mathom_i_get_image_file_limits,
126 mathom_i_int_check_image_file_limits,
129 i_flood_cfill_border,
131 /* IMAGER_API_LEVEL 3 functions */
140 /* IMAGER_API_LEVEL 4 functions */
144 /* IMAGER_API_LEVEL 5 functions */
148 i_get_file_background,
149 i_get_file_backgroundf,
171 mathom_io_new_bufchain,
172 mathom_io_new_buffer,
186 im_set_image_file_limits,
187 im_get_image_file_limits,
188 im_int_check_image_file_limits,
210 /* in general these functions aren't called by Imager internally, but
211 only via the pointers above, since faster macros that call the
212 image vtable pointers are used.
214 () are used around the function names to prevent macro replacement
215 on the function names.
219 =item i_ppix(im, x, y, color)
223 Sets the pixel at (x,y) to I<color>.
225 Returns 0 if the pixel was drawn, or -1 if not.
227 Does no alpha blending, just copies the channels from the supplied
234 (i_ppix)(i_img *im, i_img_dim x, i_img_dim y, const i_color *val) {
235 return i_ppix(im, x, y, val);
239 =item i_gpix(im, C<x>, C<y>, C<color>)
243 Retrieves the C<color> of the pixel (x,y).
245 Returns 0 if the pixel was retrieved, or -1 if not.
251 (i_gpix)(i_img *im,i_img_dim x,i_img_dim y,i_color *val) {
252 return i_gpix(im, x, y, val);
256 =item i_ppixf(im, C<x>, C<y>, C<fcolor>)
260 Sets the pixel at (C<x>,C<y>) to the floating point color C<fcolor>.
262 Returns 0 if the pixel was drawn, or -1 if not.
264 Does no alpha blending, just copies the channels from the supplied
270 (i_ppixf)(i_img *im, i_img_dim x, i_img_dim y, const i_fcolor *val) {
271 return i_ppixf(im, x, y, val);
275 =item i_gpixf(im, C<x>, C<y>, C<fcolor>)
279 Retrieves the color of the pixel (x,y) as a floating point color into
282 Returns 0 if the pixel was retrieved, or -1 if not.
288 (i_gpixf)(i_img *im,i_img_dim x,i_img_dim y,i_fcolor *val) {
289 return i_gpixf(im, x, y, val);
293 =item i_plin(im, l, r, y, colors)
297 Sets (r-l) pixels starting from (l,y) using (r-l) values from
300 Returns the number of pixels set.
306 (i_plin)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, const i_color *vals) {
307 return i_plin(im, l, r, y, vals);
311 =item i_glin(im, l, r, y, colors)
315 Retrieves (r-l) pixels starting from (l,y) into I<colors>.
317 Returns the number of pixels retrieved.
323 (i_glin)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_color *vals) {
324 return i_glin(im, l, r, y, vals);
328 =item i_plinf(im, C<left>, C<right>, C<fcolors>)
332 Sets (right-left) pixels starting from (left,y) using (right-left)
333 floating point colors from C<fcolors>.
335 Returns the number of pixels set.
341 (i_plinf)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, const i_fcolor *vals) {
342 return i_plinf(im, l, r, y, vals);
346 =item i_glinf(im, l, r, y, colors)
350 Retrieves (r-l) pixels starting from (l,y) into I<colors> as floating
353 Returns the number of pixels retrieved.
359 (i_glinf)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_fcolor *vals) {
360 return i_glinf(im, l, r, y, vals);
364 =item i_gsamp(im, left, right, y, samples, channels, channel_count)
368 Reads sample values from C<im> for the horizontal line (left, y) to
369 (right-1,y) for the channels specified by C<channels>, an array of int
370 with C<channel_count> elements.
372 If channels is NULL then the first channels_count channels are retrieved for
375 Returns the number of samples read (which should be (right-left) *
381 (i_gsamp)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_sample_t *samp,
382 const int *chans, int chan_count) {
383 return i_gsamp(im, l, r, y, samp, chans, chan_count);
387 =item i_gsampf(im, left, right, y, samples, channels, channel_count)
391 Reads floating point sample values from C<im> for the horizontal line
392 (left, y) to (right-1,y) for the channels specified by C<channels>, an
393 array of int with channel_count elements.
395 If C<channels> is NULL then the first C<channel_count> channels are
396 retrieved for each pixel.
398 Returns the number of samples read (which should be (C<right>-C<left>)
404 (i_gsampf)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_fsample_t *samp,
405 const int *chans, int chan_count) {
406 return i_gsampf(im, l, r, y, samp, chans, chan_count);
410 =item i_gsamp_bits(im, left, right, y, samples, channels, channel_count, bits)
413 Reads integer samples scaled to C<bits> bits of precision into the
414 C<unsigned int> array C<samples>.
416 Expect this to be slow unless C<< bits == im->bits >>.
418 Returns the number of samples copied, or -1 on error.
420 Not all image types implement this method.
422 Pushes errors, but does not call C<i_clear_error()>.
428 =item i_psamp_bits(im, left, right, y, samples, channels, channel_count, bits)
431 Writes integer samples scaled to C<bits> bits of precision from the
432 C<unsigned int> array C<samples>.
434 Expect this to be slow unless C<< bits == im->bits >>.
436 Returns the number of samples copied, or -1 on error.
438 Not all image types implement this method.
440 Pushes errors, but does not call C<i_clear_error()>.
446 =item i_gpal(im, left, right, y, indexes)
450 Reads palette indexes for the horizontal line (left, y) to (right-1,
453 Returns the number of indexes read.
455 Always returns 0 for direct color images.
460 (i_gpal)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, i_palidx *vals) {
461 return i_gpal(im, x, r, y, vals);
465 =item i_ppal(im, left, right, y, indexes)
469 Writes palette indexes for the horizontal line (left, y) to (right-1,
472 Returns the number of indexes written.
474 Always returns 0 for direct color images.
479 (i_ppal)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, const i_palidx *vals) {
480 return i_ppal(im, x, r, y, vals);
484 =item i_addcolors(im, colors, count)
486 =category Paletted images
488 Adds colors to the image's palette.
490 On success returns the index of the lowest color added.
492 On failure returns -1.
494 Always fails for direct color images.
500 (i_addcolors)(i_img *im, const i_color *colors, int count) {
501 return i_addcolors(im, colors, count);
505 =item i_getcolors(im, index, colors, count)
507 =category Paletted images
509 Retrieves I<count> colors starting from I<index> in the image's
512 On success stores the colors into I<colors> and returns true.
514 On failure returns false.
516 Always fails for direct color images.
518 Fails if there are less than I<index>+I<count> colors in the image's
525 (i_getcolors)(i_img *im, int i, i_color *colors, int count) {
526 return i_getcolors(im, i, colors, count);
530 =item i_colorcount(im)
532 =category Paletted images
534 Returns the number of colors in the image's palette.
536 Returns -1 for direct images.
542 (i_colorcount)(i_img *im) {
543 return i_colorcount(im);
547 =item i_maxcolors(im)
549 =category Paletted images
551 Returns the maximum number of colors the palette can hold for the
554 Returns -1 for direct color images.
560 (i_maxcolors)(i_img *im) {
561 return i_maxcolors(im);
565 =item i_findcolor(im, color, &entry)
567 =category Paletted images
569 Searches the images palette for the given color.
571 On success sets *I<entry> to the index of the color, and returns true.
573 On failure returns false.
575 Always fails on direct color images.
580 (i_findcolor)(i_img *im, const i_color *color, i_palidx *entry) {
581 return i_findcolor(im, color, entry);
585 =item i_setcolors(im, index, colors, count)
587 =category Paletted images
589 Sets I<count> colors starting from I<index> in the image's palette.
591 On success returns true.
593 On failure returns false.
595 The image must have at least I<index>+I<count> colors in it's palette
598 Always fails on direct color images.
603 (i_setcolors)(i_img *im, int index, const i_color *colors, int count) {
604 return i_setcolors(im, index, colors, count);
608 =item im_get_context()
610 Retrieve the context object for the current thread.
612 Inside Imager itself this is just a function pointer, which the
613 F<Imager.xs> BOOT handler initializes for use within perl. If you're
614 taking the Imager code and embedding it elsewhere you need to
615 initialize the C<im_get_context> pointer at some point.
622 return im_get_context();
626 mathom_i_img_8_new(i_img_dim xsize, i_img_dim ysize, int channels) {
627 return i_img_8_new(xsize, ysize, channels);
631 mathom_i_img_16_new(i_img_dim xsize, i_img_dim ysize, int channels) {
632 return i_img_16_new(xsize, ysize, channels);
636 mathom_i_img_double_new(i_img_dim xsize, i_img_dim ysize, int channels) {
637 return i_img_double_new(xsize, ysize, channels);
641 mathom_i_img_pal_new(i_img_dim xsize, i_img_dim ysize, int channels,
643 return i_img_pal_new(xsize, ysize, channels, maxpal);
647 mathom_i_clear_error(void) {
652 mathom_i_push_error(int code, const char *msg) {
653 i_push_error(code, msg);
657 mathom_i_push_errorvf(int code, const char *fmt, va_list args) {
658 i_push_errorvf(code, fmt, args);
662 mathom_i_set_image_file_limits(i_img_dim max_width, i_img_dim max_height,
664 return i_set_image_file_limits(max_width, max_height, max_bytes);
668 mathom_i_get_image_file_limits(i_img_dim *pmax_width, i_img_dim *pmax_height,
669 size_t *pmax_bytes) {
670 return i_get_image_file_limits(pmax_width, pmax_height, pmax_bytes);
674 mathom_i_int_check_image_file_limits(i_img_dim width, i_img_dim height,
675 int channels, size_t sample_size) {
676 return i_int_check_image_file_limits(width, height, channels, sample_size);
680 mathom_i_img_alloc(void) {
681 return i_img_alloc();
685 mathom_i_img_init(i_img *im) {
690 mathom_io_new_fd(int fd) {
691 return io_new_fd(fd);
694 mathom_io_new_bufchain(void) {
695 return io_new_bufchain();
699 mathom_io_new_buffer(const char *data, size_t size, i_io_closebufp_t closefp,
701 return io_new_buffer(data, size, closefp, close_data);
705 mathom_io_new_cb(void *p, i_io_readl_t readcb, i_io_writel_t writecb,
706 i_io_seekl_t seekcb, i_io_closel_t closecb,
707 i_io_destroyl_t destroycb) {
708 return io_new_cb(p, readcb, writecb, seekcb, closecb, destroycb);