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,
211 i_poly_poly_aa_cfill,
221 /* in general these functions aren't called by Imager internally, but
222 only via the pointers above, since faster macros that call the
223 image vtable pointers are used.
225 () are used around the function names to prevent macro replacement
226 on the function names.
230 =item i_ppix(im, x, y, color)
234 Sets the pixel at (x,y) to I<color>.
236 Returns 0 if the pixel was drawn, or -1 if not.
238 Does no alpha blending, just copies the channels from the supplied
245 (i_ppix)(i_img *im, i_img_dim x, i_img_dim y, const i_color *val) {
246 return i_ppix(im, x, y, val);
250 =item i_gpix(im, C<x>, C<y>, C<color>)
254 Retrieves the C<color> of the pixel (x,y).
256 Returns 0 if the pixel was retrieved, or -1 if not.
262 (i_gpix)(i_img *im,i_img_dim x,i_img_dim y,i_color *val) {
263 return i_gpix(im, x, y, val);
267 =item i_ppixf(im, C<x>, C<y>, C<fcolor>)
271 Sets the pixel at (C<x>,C<y>) to the floating point color C<fcolor>.
273 Returns 0 if the pixel was drawn, or -1 if not.
275 Does no alpha blending, just copies the channels from the supplied
281 (i_ppixf)(i_img *im, i_img_dim x, i_img_dim y, const i_fcolor *val) {
282 return i_ppixf(im, x, y, val);
286 =item i_gpixf(im, C<x>, C<y>, C<fcolor>)
290 Retrieves the color of the pixel (x,y) as a floating point color into
293 Returns 0 if the pixel was retrieved, or -1 if not.
299 (i_gpixf)(i_img *im,i_img_dim x,i_img_dim y,i_fcolor *val) {
300 return i_gpixf(im, x, y, val);
304 =item i_plin(im, l, r, y, colors)
308 Sets (r-l) pixels starting from (l,y) using (r-l) values from
311 Returns the number of pixels set.
317 (i_plin)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, const i_color *vals) {
318 return i_plin(im, l, r, y, vals);
322 =item i_glin(im, l, r, y, colors)
326 Retrieves (r-l) pixels starting from (l,y) into I<colors>.
328 Returns the number of pixels retrieved.
334 (i_glin)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_color *vals) {
335 return i_glin(im, l, r, y, vals);
339 =item i_plinf(im, C<left>, C<right>, C<fcolors>)
343 Sets (right-left) pixels starting from (left,y) using (right-left)
344 floating point colors from C<fcolors>.
346 Returns the number of pixels set.
352 (i_plinf)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, const i_fcolor *vals) {
353 return i_plinf(im, l, r, y, vals);
357 =item i_glinf(im, l, r, y, colors)
361 Retrieves (r-l) pixels starting from (l,y) into I<colors> as floating
364 Returns the number of pixels retrieved.
370 (i_glinf)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_fcolor *vals) {
371 return i_glinf(im, l, r, y, vals);
375 =item i_gsamp(im, left, right, y, samples, channels, channel_count)
379 Reads sample values from C<im> for the horizontal line (left, y) to
380 (right-1,y) for the channels specified by C<channels>, an array of int
381 with C<channel_count> elements.
383 If channels is NULL then the first channels_count channels are retrieved for
386 Returns the number of samples read (which should be (right-left) *
392 (i_gsamp)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_sample_t *samp,
393 const int *chans, int chan_count) {
394 return i_gsamp(im, l, r, y, samp, chans, chan_count);
398 =item i_gsampf(im, left, right, y, samples, channels, channel_count)
402 Reads floating point sample values from C<im> for the horizontal line
403 (left, y) to (right-1,y) for the channels specified by C<channels>, an
404 array of int with channel_count elements.
406 If C<channels> is NULL then the first C<channel_count> channels are
407 retrieved for each pixel.
409 Returns the number of samples read (which should be (C<right>-C<left>)
415 (i_gsampf)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_fsample_t *samp,
416 const int *chans, int chan_count) {
417 return i_gsampf(im, l, r, y, samp, chans, chan_count);
421 =item i_gsamp_bits(im, left, right, y, samples, channels, channel_count, bits)
424 Reads integer samples scaled to C<bits> bits of precision into the
425 C<unsigned int> array C<samples>.
427 Expect this to be slow unless C<< bits == im->bits >>.
429 Returns the number of samples copied, or -1 on error.
431 Not all image types implement this method.
433 Pushes errors, but does not call C<i_clear_error()>.
439 =item i_psamp_bits(im, left, right, y, samples, channels, channel_count, bits)
442 Writes integer samples scaled to C<bits> bits of precision from the
443 C<unsigned int> array C<samples>.
445 Expect this to be slow unless C<< bits == im->bits >>.
447 Returns the number of samples copied, or -1 on error.
449 Not all image types implement this method.
451 Pushes errors, but does not call C<i_clear_error()>.
457 =item i_gpal(im, left, right, y, indexes)
461 Reads palette indexes for the horizontal line (left, y) to (right-1,
464 Returns the number of indexes read.
466 Always returns 0 for direct color images.
471 (i_gpal)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, i_palidx *vals) {
472 return i_gpal(im, x, r, y, vals);
476 =item i_ppal(im, left, right, y, indexes)
480 Writes palette indexes for the horizontal line (left, y) to (right-1,
483 Returns the number of indexes written.
485 Always returns 0 for direct color images.
490 (i_ppal)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, const i_palidx *vals) {
491 return i_ppal(im, x, r, y, vals);
495 =item i_addcolors(im, colors, count)
497 =category Paletted images
499 Adds colors to the image's palette.
501 On success returns the index of the lowest color added.
503 On failure returns -1.
505 Always fails for direct color images.
511 (i_addcolors)(i_img *im, const i_color *colors, int count) {
512 return i_addcolors(im, colors, count);
516 =item i_getcolors(im, index, colors, count)
518 =category Paletted images
520 Retrieves I<count> colors starting from I<index> in the image's
523 On success stores the colors into I<colors> and returns true.
525 On failure returns false.
527 Always fails for direct color images.
529 Fails if there are less than I<index>+I<count> colors in the image's
536 (i_getcolors)(i_img *im, int i, i_color *colors, int count) {
537 return i_getcolors(im, i, colors, count);
541 =item i_colorcount(im)
543 =category Paletted images
545 Returns the number of colors in the image's palette.
547 Returns -1 for direct images.
553 (i_colorcount)(i_img *im) {
554 return i_colorcount(im);
558 =item i_maxcolors(im)
560 =category Paletted images
562 Returns the maximum number of colors the palette can hold for the
565 Returns -1 for direct color images.
571 (i_maxcolors)(i_img *im) {
572 return i_maxcolors(im);
576 =item i_findcolor(im, color, &entry)
578 =category Paletted images
580 Searches the images palette for the given color.
582 On success sets *I<entry> to the index of the color, and returns true.
584 On failure returns false.
586 Always fails on direct color images.
591 (i_findcolor)(i_img *im, const i_color *color, i_palidx *entry) {
592 return i_findcolor(im, color, entry);
596 =item i_setcolors(im, index, colors, count)
598 =category Paletted images
600 Sets I<count> colors starting from I<index> in the image's palette.
602 On success returns true.
604 On failure returns false.
606 The image must have at least I<index>+I<count> colors in it's palette
609 Always fails on direct color images.
614 (i_setcolors)(i_img *im, int index, const i_color *colors, int count) {
615 return i_setcolors(im, index, colors, count);
619 =item im_get_context()
621 Retrieve the context object for the current thread.
623 Inside Imager itself this is just a function pointer, which the
624 F<Imager.xs> BOOT handler initializes for use within perl. If you're
625 taking the Imager code and embedding it elsewhere you need to
626 initialize the C<im_get_context> pointer at some point.
633 return im_get_context();
637 mathom_i_img_8_new(i_img_dim xsize, i_img_dim ysize, int channels) {
638 return i_img_8_new(xsize, ysize, channels);
642 mathom_i_img_16_new(i_img_dim xsize, i_img_dim ysize, int channels) {
643 return i_img_16_new(xsize, ysize, channels);
647 mathom_i_img_double_new(i_img_dim xsize, i_img_dim ysize, int channels) {
648 return i_img_double_new(xsize, ysize, channels);
652 mathom_i_img_pal_new(i_img_dim xsize, i_img_dim ysize, int channels,
654 return i_img_pal_new(xsize, ysize, channels, maxpal);
658 mathom_i_clear_error(void) {
663 mathom_i_push_error(int code, const char *msg) {
664 i_push_error(code, msg);
668 mathom_i_push_errorvf(int code, const char *fmt, va_list args) {
669 i_push_errorvf(code, fmt, args);
673 mathom_i_set_image_file_limits(i_img_dim max_width, i_img_dim max_height,
675 return i_set_image_file_limits(max_width, max_height, max_bytes);
679 mathom_i_get_image_file_limits(i_img_dim *pmax_width, i_img_dim *pmax_height,
680 size_t *pmax_bytes) {
681 return i_get_image_file_limits(pmax_width, pmax_height, pmax_bytes);
685 mathom_i_int_check_image_file_limits(i_img_dim width, i_img_dim height,
686 int channels, size_t sample_size) {
687 return i_int_check_image_file_limits(width, height, channels, sample_size);
691 mathom_i_img_alloc(void) {
692 return i_img_alloc();
696 mathom_i_img_init(i_img *im) {
701 mathom_io_new_fd(int fd) {
702 return io_new_fd(fd);
705 mathom_io_new_bufchain(void) {
706 return io_new_bufchain();
710 mathom_io_new_buffer(const char *data, size_t size, i_io_closebufp_t closefp,
712 return io_new_buffer(data, size, closefp, close_data);
716 mathom_io_new_cb(void *p, i_io_readl_t readcb, i_io_writel_t writecb,
717 i_io_seekl_t seekcb, i_io_closel_t closecb,
718 i_io_destroyl_t destroycb) {
719 return io_new_cb(p, readcb, writecb, seekcb, closecb, destroycb);