File Coverage

imext.c
Criterion Covered Total %
statement 2 74 2.7
branch 0 16 0.0
condition n/a
subroutine n/a
pod n/a
total 2 90 2.2


line stmt bran cond sub pod time code
1             #include "imexttypes.h"
2             #include "imager.h"
3             #include "imio.h"
4             #include "imexif.h"
5              
6             static im_context_t get_context(void);
7             static i_img *mathom_i_img_8_new(i_img_dim, i_img_dim, int);
8             static i_img *mathom_i_img_16_new(i_img_dim, i_img_dim, int);
9             static i_img *mathom_i_img_double_new(i_img_dim, i_img_dim, int);
10             static i_img *mathom_i_img_pal_new(i_img_dim, i_img_dim, int, int);
11             static void mathom_i_clear_error(void);
12             static void mathom_i_push_error(int, const char *);
13             static void mathom_i_push_errorvf(int, const char *, va_list);
14             static int mathom_i_set_image_file_limits(i_img_dim, i_img_dim, size_t);
15             static int mathom_i_get_image_file_limits(i_img_dim*, i_img_dim*, size_t*);
16             static int
17             mathom_i_int_check_image_file_limits(i_img_dim, i_img_dim, int, size_t);
18             static i_img *mathom_i_img_alloc(void);
19             static void mathom_i_img_init(i_img *);
20             static i_io_glue_t *mathom_io_new_fd(int);
21             static i_io_glue_t *mathom_io_new_bufchain(void);
22             static i_io_glue_t *
23             mathom_io_new_buffer(const char *data, size_t, i_io_closebufp_t, void *);
24             static i_io_glue_t *
25             mathom_io_new_cb(void *, i_io_readl_t, i_io_writel_t, i_io_seekl_t,
26             i_io_closel_t, i_io_destroyl_t);
27              
28             /*
29             DON'T ADD CASTS TO THESE
30             */
31             im_ext_funcs imager_function_table =
32             {
33             IMAGER_API_VERSION,
34             IMAGER_API_LEVEL,
35              
36             mymalloc,
37             myfree,
38             myrealloc,
39              
40             mymalloc_file_line,
41             myfree_file_line,
42             myrealloc_file_line,
43              
44             mathom_i_img_8_new,
45             mathom_i_img_16_new,
46             mathom_i_img_double_new,
47             mathom_i_img_pal_new,
48             i_img_destroy,
49             i_sametype,
50             i_sametype_chans,
51             i_img_info,
52              
53             i_ppix,
54             i_gpix,
55             i_ppixf,
56             i_gpixf,
57             i_plin,
58             i_glin,
59             i_plinf,
60             i_glinf,
61             i_gsamp,
62             i_gsampf,
63             i_gpal,
64             i_ppal,
65             i_addcolors,
66             i_getcolors,
67             i_colorcount,
68             i_maxcolors,
69             i_findcolor,
70             i_setcolors,
71              
72             i_new_fill_solid,
73             i_new_fill_solidf,
74             i_new_fill_hatch,
75             i_new_fill_hatchf,
76             i_new_fill_image,
77             i_new_fill_fount,
78             i_fill_destroy,
79              
80             i_quant_makemap,
81             i_quant_translate,
82             i_quant_transparent,
83              
84             mathom_i_clear_error,
85             mathom_i_push_error,
86             i_push_errorf,
87             mathom_i_push_errorvf,
88              
89             i_tags_new,
90             i_tags_set,
91             i_tags_setn,
92             i_tags_destroy,
93             i_tags_find,
94             i_tags_findn,
95             i_tags_delete,
96             i_tags_delbyname,
97             i_tags_delbycode,
98             i_tags_get_float,
99             i_tags_set_float,
100             i_tags_set_float2,
101             i_tags_get_int,
102             i_tags_get_string,
103             i_tags_get_color,
104             i_tags_set_color,
105              
106             i_box,
107             i_box_filled,
108             i_box_cfill,
109             i_line,
110             i_line_aa,
111             i_arc,
112             i_arc_aa,
113             i_arc_cfill,
114             i_arc_aa_cfill,
115             i_circle_aa,
116             i_flood_fill,
117             i_flood_cfill,
118              
119             i_copyto,
120             i_copyto_trans,
121             i_copy,
122             i_rubthru,
123              
124             /* IMAGER_API_LEVEL 2 functions */
125             mathom_i_set_image_file_limits,
126             mathom_i_get_image_file_limits,
127             mathom_i_int_check_image_file_limits,
128              
129             i_flood_fill_border,
130             i_flood_cfill_border,
131              
132             /* IMAGER_API_LEVEL 3 functions */
133             i_img_setmask,
134             i_img_getmask,
135             i_img_getchannels,
136             i_img_get_width,
137             i_img_get_height,
138             i_lhead,
139             i_loog,
140              
141             /* IMAGER_API_LEVEL 4 functions */
142             mathom_i_img_alloc,
143             mathom_i_img_init,
144              
145             /* IMAGER_API_LEVEL 5 functions */
146             i_img_is_monochrome,
147             i_gsamp_bg,
148             i_gsampf_bg,
149             i_get_file_background,
150             i_get_file_backgroundf,
151             i_utf8_advance,
152             i_render_new,
153             i_render_delete,
154             i_render_color,
155             i_render_fill,
156             i_render_line,
157             i_render_linef,
158              
159             /* level 6 */
160             i_io_getc_imp,
161             i_io_peekc_imp,
162             i_io_peekn,
163             i_io_putc_imp,
164             i_io_read,
165             i_io_write,
166             i_io_seek,
167             i_io_flush,
168             i_io_close,
169             i_io_set_buffered,
170             i_io_gets,
171             mathom_io_new_fd,
172             mathom_io_new_bufchain,
173             mathom_io_new_buffer,
174             mathom_io_new_cb,
175             io_slurp,
176             io_glue_destroy,
177              
178             /* level 8 */
179             im_img_8_new,
180             im_img_16_new,
181             im_img_double_new,
182             im_img_pal_new,
183             im_clear_error,
184             im_push_error,
185             im_push_errorvf,
186             im_push_errorf,
187             im_set_image_file_limits,
188             im_get_image_file_limits,
189             im_int_check_image_file_limits,
190             im_img_alloc,
191             im_img_init,
192             im_io_new_fd,
193             im_io_new_bufchain,
194             im_io_new_buffer,
195             im_io_new_cb,
196             get_context,
197             im_lhead,
198             im_loog,
199             im_context_refinc,
200             im_context_refdec,
201             im_errors,
202             i_mutex_new,
203             i_mutex_destroy,
204             i_mutex_lock,
205             i_mutex_unlock,
206             im_context_slot_new,
207             im_context_slot_set,
208             im_context_slot_get,
209              
210             /* level 9 */
211             i_poly_poly_aa,
212             i_poly_poly_aa_cfill,
213             i_poly_aa_m,
214             i_poly_aa_cfill_m,
215              
216             i_img_alpha_channel,
217             i_img_color_model,
218             i_img_color_channels,
219              
220             /* level 10 */
221             im_decode_exif
222              
223             /* level 11 */
224             };
225              
226             /* in general these functions aren't called by Imager internally, but
227             only via the pointers above, since faster macros that call the
228             image vtable pointers are used.
229              
230             () are used around the function names to prevent macro replacement
231             on the function names.
232             */
233              
234             /*
235             =item i_ppix(im, x, y, color)
236              
237             =category Drawing
238              
239             Sets the pixel at (x,y) to I.
240              
241             Returns 0 if the pixel was drawn, or -1 if not.
242              
243             Does no alpha blending, just copies the channels from the supplied
244             color to the image.
245              
246             =cut
247             */
248              
249             int
250 0           (i_ppix)(i_img *im, i_img_dim x, i_img_dim y, const i_color *val) {
251 0           return i_ppix(im, x, y, val);
252             }
253              
254             /*
255             =item i_gpix(im, C, C, C)
256              
257             =category Drawing
258              
259             Retrieves the C of the pixel (x,y).
260              
261             Returns 0 if the pixel was retrieved, or -1 if not.
262              
263             =cut
264             */
265              
266             int
267 0           (i_gpix)(i_img *im,i_img_dim x,i_img_dim y,i_color *val) {
268 0           return i_gpix(im, x, y, val);
269             }
270              
271             /*
272             =item i_ppixf(im, C, C, C)
273              
274             =category Drawing
275              
276             Sets the pixel at (C,C) to the floating point color C.
277              
278             Returns 0 if the pixel was drawn, or -1 if not.
279              
280             Does no alpha blending, just copies the channels from the supplied
281             color to the image.
282              
283             =cut
284             */
285             int
286 0           (i_ppixf)(i_img *im, i_img_dim x, i_img_dim y, const i_fcolor *val) {
287 0           return i_ppixf(im, x, y, val);
288             }
289              
290             /*
291             =item i_gpixf(im, C, C, C)
292              
293             =category Drawing
294              
295             Retrieves the color of the pixel (x,y) as a floating point color into
296             C.
297              
298             Returns 0 if the pixel was retrieved, or -1 if not.
299              
300             =cut
301             */
302              
303             int
304 0           (i_gpixf)(i_img *im,i_img_dim x,i_img_dim y,i_fcolor *val) {
305 0           return i_gpixf(im, x, y, val);
306             }
307              
308             /*
309             =item i_plin(im, l, r, y, colors)
310              
311             =category Drawing
312              
313             Sets (r-l) pixels starting from (l,y) using (r-l) values from
314             I.
315              
316             Returns the number of pixels set.
317              
318             =cut
319             */
320              
321             i_img_dim
322 0           (i_plin)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, const i_color *vals) {
323 0           return i_plin(im, l, r, y, vals);
324             }
325              
326             /*
327             =item i_glin(im, l, r, y, colors)
328              
329             =category Drawing
330              
331             Retrieves (r-l) pixels starting from (l,y) into I.
332              
333             Returns the number of pixels retrieved.
334              
335             =cut
336             */
337              
338             i_img_dim
339 0           (i_glin)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_color *vals) {
340 0           return i_glin(im, l, r, y, vals);
341             }
342              
343             /*
344             =item i_plinf(im, C, C, C)
345              
346             =category Drawing
347              
348             Sets (right-left) pixels starting from (left,y) using (right-left)
349             floating point colors from C.
350              
351             Returns the number of pixels set.
352              
353             =cut
354             */
355              
356             i_img_dim
357 0           (i_plinf)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, const i_fcolor *vals) {
358 0           return i_plinf(im, l, r, y, vals);
359             }
360              
361             /*
362             =item i_glinf(im, l, r, y, colors)
363              
364             =category Drawing
365              
366             Retrieves (r-l) pixels starting from (l,y) into I as floating
367             point colors.
368              
369             Returns the number of pixels retrieved.
370              
371             =cut
372             */
373              
374             i_img_dim
375 0           (i_glinf)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_fcolor *vals) {
376 0           return i_glinf(im, l, r, y, vals);
377             }
378              
379             /*
380             =item i_gsamp(im, left, right, y, samples, channels, channel_count)
381              
382             =category Drawing
383              
384             Reads sample values from C for the horizontal line (left, y) to
385             (right-1,y) for the channels specified by C, an array of int
386             with C elements.
387              
388             If channels is NULL then the first channels_count channels are retrieved for
389             each pixel.
390              
391             Returns the number of samples read (which should be (right-left) *
392             channel_count)
393              
394             =cut
395             */
396             i_img_dim
397 0           (i_gsamp)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_sample_t *samp,
398             const int *chans, int chan_count) {
399 0           return i_gsamp(im, l, r, y, samp, chans, chan_count);
400             }
401              
402             /*
403             =item i_gsampf(im, left, right, y, samples, channels, channel_count)
404              
405             =category Drawing
406              
407             Reads floating point sample values from C for the horizontal line
408             (left, y) to (right-1,y) for the channels specified by C, an
409             array of int with channel_count elements.
410              
411             If C is NULL then the first C channels are
412             retrieved for each pixel.
413              
414             Returns the number of samples read (which should be (C-C)
415             * C)
416              
417             =cut
418             */
419             i_img_dim
420 0           (i_gsampf)(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_fsample_t *samp,
421             const int *chans, int chan_count) {
422 0           return i_gsampf(im, l, r, y, samp, chans, chan_count);
423             }
424              
425             /*
426             =item i_gsamp_bits(im, left, right, y, samples, channels, channel_count, bits)
427             =category Drawing
428              
429             Reads integer samples scaled to C bits of precision into the
430             C array C.
431              
432             Expect this to be slow unless C<< bits == im->bits >>.
433              
434             Returns the number of samples copied, or -1 on error.
435              
436             Not all image types implement this method.
437              
438             Pushes errors, but does not call C.
439              
440             =cut
441             */
442              
443             /*
444             =item i_psamp_bits(im, left, right, y, samples, channels, channel_count, bits)
445             =category Drawing
446              
447             Writes integer samples scaled to C bits of precision from the
448             C array C.
449              
450             Expect this to be slow unless C<< bits == im->bits >>.
451              
452             Returns the number of samples copied, or -1 on error.
453              
454             Not all image types implement this method.
455              
456             Pushes errors, but does not call C.
457              
458             =cut
459             */
460              
461             /*
462             =item i_gpal(im, left, right, y, indexes)
463              
464             =category Drawing
465              
466             Reads palette indexes for the horizontal line (left, y) to (right-1,
467             y) into C.
468              
469             Returns the number of indexes read.
470              
471             Always returns 0 for direct color images.
472              
473             =cut
474             */
475             i_img_dim
476 0           (i_gpal)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, i_palidx *vals) {
477 0 0         return i_gpal(im, x, r, y, vals);
478             }
479              
480             /*
481             =item i_ppal(im, left, right, y, indexes)
482              
483             =category Drawing
484              
485             Writes palette indexes for the horizontal line (left, y) to (right-1,
486             y) from C.
487              
488             Returns the number of indexes written.
489              
490             Always returns 0 for direct color images.
491              
492             =cut
493             */
494             i_img_dim
495 0           (i_ppal)(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, const i_palidx *vals) {
496 0 0         return i_ppal(im, x, r, y, vals);
497             }
498              
499             /*
500             =item i_addcolors(im, colors, count)
501              
502             =category Paletted images
503              
504             Adds colors to the image's palette.
505              
506             On success returns the index of the lowest color added.
507              
508             On failure returns -1.
509              
510             Always fails for direct color images.
511              
512             =cut
513             */
514              
515             int
516 0           (i_addcolors)(i_img *im, const i_color *colors, int count) {
517 0 0         return i_addcolors(im, colors, count);
518             }
519              
520             /*
521             =item i_getcolors(im, index, colors, count)
522              
523             =category Paletted images
524              
525             Retrieves I colors starting from I in the image's
526             palette.
527              
528             On success stores the colors into I and returns true.
529              
530             On failure returns false.
531              
532             Always fails for direct color images.
533              
534             Fails if there are less than I+I colors in the image's
535             palette.
536              
537             =cut
538             */
539              
540             int
541 0           (i_getcolors)(i_img *im, int i, i_color *colors, int count) {
542 0 0         return i_getcolors(im, i, colors, count);
543             }
544              
545             /*
546             =item i_colorcount(im)
547              
548             =category Paletted images
549              
550             Returns the number of colors in the image's palette.
551              
552             Returns -1 for direct images.
553              
554             =cut
555             */
556              
557             int
558 0           (i_colorcount)(i_img *im) {
559 0 0         return i_colorcount(im);
560             }
561              
562             /*
563             =item i_maxcolors(im)
564              
565             =category Paletted images
566              
567             Returns the maximum number of colors the palette can hold for the
568             image.
569              
570             Returns -1 for direct color images.
571              
572             =cut
573             */
574              
575             int
576 0           (i_maxcolors)(i_img *im) {
577 0 0         return i_maxcolors(im);
578             }
579              
580             /*
581             =item i_findcolor(im, color, &entry)
582              
583             =category Paletted images
584              
585             Searches the images palette for the given color.
586              
587             On success sets *I to the index of the color, and returns true.
588              
589             On failure returns false.
590              
591             Always fails on direct color images.
592              
593             =cut
594             */
595             int
596 0           (i_findcolor)(i_img *im, const i_color *color, i_palidx *entry) {
597 0 0         return i_findcolor(im, color, entry);
598             }
599              
600             /*
601             =item i_setcolors(im, index, colors, count)
602              
603             =category Paletted images
604              
605             Sets I colors starting from I in the image's palette.
606              
607             On success returns true.
608              
609             On failure returns false.
610              
611             The image must have at least I+I colors in it's palette
612             for this to succeed.
613              
614             Always fails on direct color images.
615              
616             =cut
617             */
618             int
619 0           (i_setcolors)(i_img *im, int index, const i_color *colors, int count) {
620 0 0         return i_setcolors(im, index, colors, count);
621             }
622              
623             /*
624             =item im_get_context()
625              
626             Retrieve the context object for the current thread.
627              
628             Inside Imager itself this is just a function pointer, which the
629             F BOOT handler initializes for use within perl. If you're
630             taking the Imager code and embedding it elsewhere you need to
631             initialize the C pointer at some point.
632              
633             =cut
634             */
635              
636             static im_context_t
637 441           get_context(void) {
638 441           return im_get_context();
639             }
640              
641             static i_img *
642 0           mathom_i_img_8_new(i_img_dim xsize, i_img_dim ysize, int channels) {
643 0           return i_img_8_new(xsize, ysize, channels);
644             }
645              
646             static i_img *
647 0           mathom_i_img_16_new(i_img_dim xsize, i_img_dim ysize, int channels) {
648 0           return i_img_16_new(xsize, ysize, channels);
649             }
650              
651             static i_img *
652 0           mathom_i_img_double_new(i_img_dim xsize, i_img_dim ysize, int channels) {
653 0           return i_img_double_new(xsize, ysize, channels);
654             }
655              
656             static i_img *
657 0           mathom_i_img_pal_new(i_img_dim xsize, i_img_dim ysize, int channels,
658             int maxpal) {
659 0           return i_img_pal_new(xsize, ysize, channels, maxpal);
660             }
661              
662             static void
663 0           mathom_i_clear_error(void) {
664 0           i_clear_error();
665 0           }
666              
667             static void
668 0           mathom_i_push_error(int code, const char *msg) {
669 0           i_push_error(code, msg);
670 0           }
671              
672             static void
673 0           mathom_i_push_errorvf(int code, const char *fmt, va_list args) {
674 0           i_push_errorvf(code, fmt, args);
675 0           }
676              
677             static int
678 0           mathom_i_set_image_file_limits(i_img_dim max_width, i_img_dim max_height,
679             size_t max_bytes) {
680 0           return i_set_image_file_limits(max_width, max_height, max_bytes);
681             }
682              
683             static int
684 0           mathom_i_get_image_file_limits(i_img_dim *pmax_width, i_img_dim *pmax_height,
685             size_t *pmax_bytes) {
686 0           return i_get_image_file_limits(pmax_width, pmax_height, pmax_bytes);
687             }
688              
689             static int
690 0           mathom_i_int_check_image_file_limits(i_img_dim width, i_img_dim height,
691             int channels, size_t sample_size) {
692 0           return i_int_check_image_file_limits(width, height, channels, sample_size);
693             }
694              
695             static i_img *
696 0           mathom_i_img_alloc(void) {
697 0           return i_img_alloc();
698             }
699              
700             static void
701 0           mathom_i_img_init(i_img *im) {
702 0           i_img_init(im);
703 0           }
704              
705             static i_io_glue_t *
706 0           mathom_io_new_fd(int fd) {
707 0           return io_new_fd(fd);
708             }
709             static i_io_glue_t *
710 0           mathom_io_new_bufchain(void) {
711 0           return io_new_bufchain();
712             }
713              
714             static i_io_glue_t *
715 0           mathom_io_new_buffer(const char *data, size_t size, i_io_closebufp_t closefp,
716             void *close_data) {
717 0           return io_new_buffer(data, size, closefp, close_data);
718             }
719              
720             static i_io_glue_t *
721 0           mathom_io_new_cb(void *p, i_io_readl_t readcb, i_io_writel_t writecb,
722             i_io_seekl_t seekcb, i_io_closel_t closecb,
723             i_io_destroyl_t destroycb) {
724 0           return io_new_cb(p, readcb, writecb, seekcb, closecb, destroycb);
725             }