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