File Coverage

xs/image.xs
Criterion Covered Total %
statement 30 41 73.1
branch 23 46 50.0
condition n/a
subroutine n/a
pod n/a
total 53 87 60.9


line stmt bran cond sub pod time code
1             MODULE = PDF::Make PACKAGE = PDF::Make::Image
2             PROTOTYPES: ENABLE
3              
4             SV *
5             from_file(class, path)
6             char *class
7             const char *path
8             PREINIT:
9             FILE *fp;
10             long file_len;
11             uint8_t *buf;
12             size_t nread;
13             pdfmake_image_t *img;
14             CODE:
15             PERL_UNUSED_VAR(class);
16 19           fp = fopen(path, "rb");
17 19 50         if (!fp)
18 0           croak("PDF::Make::Image: cannot open '%s'", path);
19 19 50         if (fseek(fp, 0, SEEK_END) != 0) { fclose(fp); croak("PDF::Make::Image: seek failed"); }
20 19           file_len = ftell(fp);
21 19 50         if (file_len < 0) { fclose(fp); croak("PDF::Make::Image: tell failed"); }
22 19           rewind(fp);
23 19           buf = malloc((size_t)file_len);
24 19 50         if (!buf) { fclose(fp); croak("PDF::Make::Image: malloc failed"); }
25 19           nread = fread(buf, 1, (size_t)file_len, fp);
26 19           fclose(fp);
27 19 50         if ((long)nread != file_len) { free(buf); croak("PDF::Make::Image: short read"); }
28              
29             /* Auto-detect and parse — pass NULL for doc since we don't need arena yet */
30 19           img = pdfmake_image_from_bytes(NULL, buf, (size_t)file_len);
31 19           free(buf);
32 19 50         if (!img)
33 0           croak("PDF::Make::Image: failed to parse image '%s'", path);
34              
35 19           RETVAL = sv_newmortal();
36 19           sv_setref_pv(RETVAL, "PDF::Make::Image", (void *)img);
37 19           SvREFCNT_inc(RETVAL);
38             OUTPUT:
39             RETVAL
40              
41             SV *
42             from_bytes(class, bytes_sv)
43             char *class
44             SV *bytes_sv
45             PREINIT:
46             STRLEN len;
47             const uint8_t *buf;
48             pdfmake_image_t *img;
49             CODE:
50             PERL_UNUSED_VAR(class);
51 0           buf = (const uint8_t *)SvPV(bytes_sv, len);
52 0           img = pdfmake_image_from_bytes(NULL, buf, len);
53 0 0         if (!img)
54 0           croak("PDF::Make::Image: failed to parse image bytes");
55 0           RETVAL = sv_newmortal();
56 0           sv_setref_pv(RETVAL, "PDF::Make::Image", (void *)img);
57 0           SvREFCNT_inc(RETVAL);
58             OUTPUT:
59             RETVAL
60              
61             UV
62             width(self)
63             pdfmake_image_t *self
64             CODE:
65 18 100         RETVAL = self->width;
66             OUTPUT:
67             RETVAL
68              
69             UV
70             height(self)
71             pdfmake_image_t *self
72             CODE:
73 18 100         RETVAL = self->height;
74             OUTPUT:
75             RETVAL
76              
77             IV
78             format(self)
79             pdfmake_image_t *self
80             CODE:
81 2 50         RETVAL = self->format;
82             OUTPUT:
83             RETVAL
84              
85             IV
86             components(self)
87             pdfmake_image_t *self
88             CODE:
89 1 50         RETVAL = self->components;
90             OUTPUT:
91             RETVAL
92              
93             int
94             has_alpha(self)
95             pdfmake_image_t *self
96             CODE:
97 0 0         RETVAL = self->has_alpha;
98             OUTPUT:
99             RETVAL
100              
101             UV
102             write_to_doc(self, doc)
103             pdfmake_image_t *self
104             pdfmake_doc_t *doc
105             CODE:
106 17           RETVAL = pdfmake_image_write(self, doc);
107 17 50         if (RETVAL == 0)
108 0           croak("PDF::Make::Image: failed to write image to document");
109             OUTPUT:
110             RETVAL
111              
112             void
113             DESTROY(self)
114             pdfmake_image_t *self
115             CODE:
116 19           pdfmake_image_free(self);
117              
118             BOOT:
119             {
120 90           HV *stash = gv_stashpv("PDF::Make::Image", GV_ADD);
121 90 50         PDFMAKE_REGISTER_GETTER(stash, "width", pdfmake_image_t, width, PDFMAKE_FIELD_INT);
    50          
122 90 50         PDFMAKE_REGISTER_GETTER(stash, "height", pdfmake_image_t, height, PDFMAKE_FIELD_INT);
    50          
123 90 50         PDFMAKE_REGISTER_GETTER(stash, "format", pdfmake_image_t, format, PDFMAKE_FIELD_INT);
    50          
124 90 50         PDFMAKE_REGISTER_GETTER(stash, "components", pdfmake_image_t, components, PDFMAKE_FIELD_INT);
    50          
125 90 50         PDFMAKE_REGISTER_GETTER(stash, "has_alpha", pdfmake_image_t, has_alpha, PDFMAKE_FIELD_INT);
    50          
126             }