File Coverage

xs/reader.xs
Criterion Covered Total %
statement 66 82 80.4
branch 23 42 54.7
condition n/a
subroutine n/a
pod n/a
total 89 124 71.7


line stmt bran cond sub pod time code
1             MODULE = PDF::Make PACKAGE = PDF::Make::Reader
2             PROTOTYPES: ENABLE
3              
4             pdfmake_reader_xs_t *
5             new(class, parser_sv)
6             char *class
7             SV *parser_sv
8             PREINIT:
9             pdfmake_parser_xs_t *parser_xs;
10             IV tmp;
11             CODE:
12             /* Validate parser argument */
13 97 100         if (!sv_isobject(parser_sv) || !sv_derived_from(parser_sv, "PDF::Make::Parser")) {
    50          
14 1           croak("PDF::Make::Reader: argument must be a PDF::Make::Parser");
15             }
16 96           tmp = SvIV((SV*)SvRV(parser_sv));
17 96           parser_xs = INT2PTR(pdfmake_parser_xs_t *, tmp);
18              
19             /* Ensure parser has been run */
20 96 100         if (!parser_xs->parsed) {
21 1           pdfmake_err_t err = pdfmake_parser_run(parser_xs->parser, &parser_xs->doc);
22 1 50         if (err != PDFMAKE_OK) {
23 0           croak("PDF::Make::Reader: parse failed at offset %zu: %s",
24             pdfmake_parser_erroffset(parser_xs->parser),
25             pdfmake_parser_errmsg(parser_xs->parser));
26             }
27 1           parser_xs->parsed = 1;
28             }
29              
30 96           Newxz(RETVAL, 1, pdfmake_reader_xs_t);
31 96           RETVAL->reader = pdfmake_reader_new(parser_xs->parser);
32 96 50         if (!RETVAL->reader) {
33 0           Safefree(RETVAL);
34 0           croak("PDF::Make::Reader: failed to create reader");
35             }
36 96           RETVAL->parser_sv = SvREFCNT_inc(parser_sv);
37              
38             /* Initialize reader (flatten page tree) */
39 96           pdfmake_err_t err = pdfmake_reader_init(RETVAL->reader);
40 96 50         if (err != PDFMAKE_OK) {
41 0           const char *msg = pdfmake_reader_errmsg(RETVAL->reader);
42 0           SvREFCNT_dec(RETVAL->parser_sv);
43 0           pdfmake_reader_free(RETVAL->reader);
44 0           Safefree(RETVAL);
45 0 0         croak("PDF::Make::Reader: init failed: %s", msg ? msg : "unknown error");
46             }
47             OUTPUT:
48             RETVAL
49              
50             size_t
51             page_count(self)
52             pdfmake_reader_xs_t *self
53             CODE:
54 30           RETVAL = pdfmake_reader_page_count(self->reader);
55             OUTPUT:
56             RETVAL
57              
58             pdfmake_reader_page_xs_t *
59             page(self, index)
60             pdfmake_reader_xs_t *self
61             size_t index
62             PREINIT:
63             pdfmake_reader_page_t *page;
64             CODE:
65 9           page = pdfmake_reader_page_at(self->reader, index);
66 9 100         if (!page) {
67 1           croak("PDF::Make::Reader: page index %zu out of range", index);
68             }
69 8           Newxz(RETVAL, 1, pdfmake_reader_page_xs_t);
70 8           RETVAL->page = page;
71 8           RETVAL->reader_sv = SvREFCNT_inc(ST(0)); /* Keep reader alive */
72             OUTPUT:
73             RETVAL
74              
75             const char *
76             errmsg(self)
77             pdfmake_reader_xs_t *self
78             CODE:
79 1           RETVAL = pdfmake_reader_errmsg(self->reader);
80 1 50         if (!RETVAL) RETVAL = "";
81             OUTPUT:
82             RETVAL
83              
84             int
85             is_encrypted(self)
86             pdfmake_reader_xs_t *self
87             CODE:
88 83           RETVAL = pdfmake_reader_is_encrypted(self->reader);
89             OUTPUT:
90             RETVAL
91              
92             int
93             is_authenticated(self)
94             pdfmake_reader_xs_t *self
95             CODE:
96 24           RETVAL = pdfmake_reader_is_authenticated(self->reader);
97             OUTPUT:
98             RETVAL
99              
100             int
101             set_password(self, password)
102             pdfmake_reader_xs_t *self
103             const char *password
104             CODE:
105 8           RETVAL = pdfmake_reader_set_password(self->reader, password);
106             OUTPUT:
107             RETVAL
108              
109             void
110             DESTROY(self)
111             pdfmake_reader_xs_t *self
112             CODE:
113 96 50         if (self->reader)
114 96           pdfmake_reader_free(self->reader);
115 96 50         if (self->parser_sv)
116 96           SvREFCNT_dec(self->parser_sv);
117 96           Safefree(self);
118              
119              
120             MODULE = PDF::Make PACKAGE = PDF::Make::Reader::Page
121             PROTOTYPES: ENABLE
122              
123             void
124             media_box(self)
125             pdfmake_reader_page_xs_t *self
126             PREINIT:
127             double box[4];
128             pdfmake_err_t err;
129             pdfmake_parser_xs_t *parser_xs;
130             IV tmp;
131             PPCODE:
132             /* Get reader from wrapper */
133 7 50         if (!self->reader_sv) {
134 0           croak("PDF::Make::Reader::Page: reader reference invalid");
135             }
136 7           tmp = SvIV((SV*)SvRV(self->reader_sv));
137 7           pdfmake_reader_xs_t *reader_xs = INT2PTR(pdfmake_reader_xs_t *, tmp);
138              
139 7           err = pdfmake_reader_page_media_box(reader_xs->reader, self->page, box);
140 7 50         if (err != PDFMAKE_OK) {
141 0           croak("PDF::Make::Reader::Page: failed to get media_box: %s",
142             pdfmake_reader_errmsg(reader_xs->reader));
143             }
144 7 50         EXTEND(SP, 4);
145 7           PUSHs(sv_2mortal(newSVnv(box[0])));
146 7           PUSHs(sv_2mortal(newSVnv(box[1])));
147 7           PUSHs(sv_2mortal(newSVnv(box[2])));
148 7           PUSHs(sv_2mortal(newSVnv(box[3])));
149              
150             void
151             crop_box(self)
152             pdfmake_reader_page_xs_t *self
153             PREINIT:
154             double box[4];
155             pdfmake_err_t err;
156             IV tmp;
157             PPCODE:
158 3 50         if (!self->reader_sv) {
159 0           croak("PDF::Make::Reader::Page: reader reference invalid");
160             }
161 3           tmp = SvIV((SV*)SvRV(self->reader_sv));
162 3           pdfmake_reader_xs_t *reader_xs = INT2PTR(pdfmake_reader_xs_t *, tmp);
163              
164 3           err = pdfmake_reader_page_crop_box(reader_xs->reader, self->page, box);
165 3 50         if (err != PDFMAKE_OK) {
166 0           croak("PDF::Make::Reader::Page: failed to get crop_box: %s",
167             pdfmake_reader_errmsg(reader_xs->reader));
168             }
169 3 50         EXTEND(SP, 4);
170 3           PUSHs(sv_2mortal(newSVnv(box[0])));
171 3           PUSHs(sv_2mortal(newSVnv(box[1])));
172 3           PUSHs(sv_2mortal(newSVnv(box[2])));
173 3           PUSHs(sv_2mortal(newSVnv(box[3])));
174              
175             int
176             rotation(self)
177             pdfmake_reader_page_xs_t *self
178             PREINIT:
179             IV tmp;
180             CODE:
181 6 50         if (!self->reader_sv) {
182 0           croak("PDF::Make::Reader::Page: reader reference invalid");
183             }
184 6           tmp = SvIV((SV*)SvRV(self->reader_sv));
185 6           pdfmake_reader_xs_t *reader_xs = INT2PTR(pdfmake_reader_xs_t *, tmp);
186              
187 6           RETVAL = pdfmake_reader_page_rotation(reader_xs->reader, self->page);
188             OUTPUT:
189             RETVAL
190              
191             SV *
192             content_bytes(self)
193             pdfmake_reader_page_xs_t *self
194             PREINIT:
195             pdfmake_buf_t buf;
196             pdfmake_err_t err;
197             IV tmp;
198             CODE:
199 3 50         if (!self->reader_sv) {
200 0           croak("PDF::Make::Reader::Page: reader reference invalid");
201             }
202 3           tmp = SvIV((SV*)SvRV(self->reader_sv));
203 3           pdfmake_reader_xs_t *reader_xs = INT2PTR(pdfmake_reader_xs_t *, tmp);
204              
205 3           pdfmake_buf_init(&buf);
206 3           err = pdfmake_reader_page_content_bytes(reader_xs->reader, self->page, &buf);
207 3 50         if (err != PDFMAKE_OK) {
208 0           pdfmake_buf_free(&buf);
209 0           croak("PDF::Make::Reader::Page: failed to get content_bytes: %s",
210             pdfmake_reader_errmsg(reader_xs->reader));
211             }
212              
213 3           RETVAL = newSVpvn((const char *)pdfmake_buf_data(&buf), pdfmake_buf_len(&buf));
214 3           pdfmake_buf_free(&buf);
215             OUTPUT:
216             RETVAL
217              
218             void
219             DESTROY(self)
220             pdfmake_reader_page_xs_t *self
221             CODE:
222             /* page is owned by reader, don't free it */
223 8 50         if (self->reader_sv)
224 8           SvREFCNT_dec(self->reader_sv);
225 8           Safefree(self);