]> git.imager.perl.org - imager.git/blob - ICO/ICO.xs
allow Imager to be loaded on Windows 98
[imager.git] / ICO / ICO.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4 #include "imext.h"
5 #include "imperl.h"
6 #include "imicon.h"
7 #include "ppport.h"
8
9 DEFINE_IMAGER_CALLBACKS;
10
11 MODULE = Imager::File::ICO  PACKAGE = Imager::File::ICO
12
13 PROTOTYPES: DISABLE
14
15 Imager::ImgRaw
16 i_readico_single(ig, index)
17         Imager::IO ig
18         int index
19
20 void
21 i_readico_multi(ig)
22         Imager::IO ig
23       PREINIT:
24         i_img **imgs;
25         int count;
26         int i;
27       PPCODE:
28         imgs = i_readico_multi(ig, &count);
29         if (imgs) {
30           EXTEND(SP, count);
31           for (i = 0; i < count; ++i) {
32             SV *sv = sv_newmortal();
33             sv_setref_pv(sv, "Imager::ImgRaw", (void *)imgs[i]);
34             PUSHs(sv);
35           }
36           myfree(imgs);
37         }
38
39 int
40 i_writeico_wiol(ig, im)
41         Imager::IO ig
42         Imager::ImgRaw im
43
44 undef_int
45 i_writeico_multi_wiol(ig, ...)
46         Imager::IO     ig
47       PREINIT:
48         int i;
49         int img_count;
50         i_img **imgs;
51       CODE:
52         if (items < 2)
53           croak("Usage: i_writeico_multi_wiol(ig, images...)");
54         img_count = items - 1;
55         RETVAL = 1;
56         if (img_count < 1) {
57           RETVAL = 0;
58           i_clear_error();
59           i_push_error(0, "You need to specify images to save");
60         }
61         else {
62           imgs = mymalloc(sizeof(i_img *) * img_count);
63           for (i = 0; i < img_count; ++i) {
64             SV *sv = ST(1+i);
65             imgs[i] = NULL;
66             if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
67               imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
68             }
69             else {
70               i_clear_error();
71               i_push_error(0, "Only images can be saved");
72               myfree(imgs);
73               RETVAL = 0;
74               break;
75             }
76           }
77           if (RETVAL) {
78             RETVAL = i_writeico_multi_wiol(ig, imgs, img_count);
79           }
80           myfree(imgs);
81         }
82       OUTPUT:
83         RETVAL
84
85 int
86 i_writecur_wiol(ig, im)
87         Imager::IO ig
88         Imager::ImgRaw im
89
90 undef_int
91 i_writecur_multi_wiol(ig, ...)
92         Imager::IO     ig
93       PREINIT:
94         int i;
95         int img_count;
96         i_img **imgs;
97       CODE:
98         if (items < 2)
99           croak("Usage: i_writecur_multi_wiol(ig, images...)");
100         img_count = items - 1;
101         RETVAL = 1;
102         if (img_count < 1) {
103           RETVAL = 0;
104           i_clear_error();
105           i_push_error(0, "You need to specify images to save");
106         }
107         else {
108           imgs = mymalloc(sizeof(i_img *) * img_count);
109           for (i = 0; i < img_count; ++i) {
110             SV *sv = ST(1+i);
111             imgs[i] = NULL;
112             if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
113               imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
114             }
115             else {
116               i_clear_error();
117               i_push_error(0, "Only images can be saved");
118               myfree(imgs);
119               RETVAL = 0;
120               break;
121             }
122           }
123           if (RETVAL) {
124             RETVAL = i_writecur_multi_wiol(ig, imgs, img_count);
125           }
126           myfree(imgs);
127         }
128       OUTPUT:
129         RETVAL
130
131 BOOT:
132         PERL_INITIALIZE_IMAGER_CALLBACKS;