]> git.imager.perl.org - imager.git/blobdiff - ICO/ICO.xs
PNG re-work: read 16-bit PNG as 16-bit
[imager.git] / ICO / ICO.xs
index d33bd2b55bddbe69273960701edf1bfea13bce0b..333c6fbb9bbcf7ded10311ae055eed1fe4e3b8a1 100644 (file)
@@ -1,9 +1,11 @@
+#define PERL_NO_GET_CONTEXT
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
 #include "imext.h"
 #include "imperl.h"
 #include "imicon.h"
+#include "ppport.h"
 
 DEFINE_IMAGER_CALLBACKS;
 
@@ -12,19 +14,21 @@ MODULE = Imager::File::ICO  PACKAGE = Imager::File::ICO
 PROTOTYPES: DISABLE
 
 Imager::ImgRaw
-i_readico_single(ig, index)
+i_readico_single(ig, index, masked = 0)
        Imager::IO ig
        int index
+       bool masked
 
 void
-i_readico_multi(ig)
+i_readico_multi(ig, masked = 0)
        Imager::IO ig
+       bool masked
       PREINIT:
         i_img **imgs;
         int count;
         int i;
       PPCODE:
-        imgs = i_readico_multi(ig, &count);
+        imgs = i_readico_multi(ig, &count, masked);
         if (imgs) {
           EXTEND(SP, count);
           for (i = 0; i < count; ++i) {
@@ -35,6 +39,97 @@ i_readico_multi(ig)
           myfree(imgs);
         }
 
+int
+i_writeico_wiol(ig, im)
+       Imager::IO ig
+       Imager::ImgRaw im
+
+undef_int
+i_writeico_multi_wiol(ig, ...)
+        Imager::IO     ig
+      PREINIT:
+        int i;
+        int img_count;
+        i_img **imgs;
+      CODE:
+        if (items < 2)
+          croak("Usage: i_writeico_multi_wiol(ig, images...)");
+        img_count = items - 1;
+        RETVAL = 1;
+       if (img_count < 1) {
+         RETVAL = 0;
+         i_clear_error();
+         i_push_error(0, "You need to specify images to save");
+       }
+       else {
+          imgs = mymalloc(sizeof(i_img *) * img_count);
+          for (i = 0; i < img_count; ++i) {
+           SV *sv = ST(1+i);
+           imgs[i] = NULL;
+           if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
+             imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
+           }
+           else {
+             i_clear_error();
+             i_push_error(0, "Only images can be saved");
+              myfree(imgs);
+             RETVAL = 0;
+             break;
+            }
+         }
+          if (RETVAL) {
+           RETVAL = i_writeico_multi_wiol(ig, imgs, img_count);
+          }
+         myfree(imgs);
+       }
+      OUTPUT:
+        RETVAL
+
+int
+i_writecur_wiol(ig, im)
+       Imager::IO ig
+       Imager::ImgRaw im
+
+undef_int
+i_writecur_multi_wiol(ig, ...)
+        Imager::IO     ig
+      PREINIT:
+        int i;
+        int img_count;
+        i_img **imgs;
+      CODE:
+        if (items < 2)
+          croak("Usage: i_writecur_multi_wiol(ig, images...)");
+        img_count = items - 1;
+        RETVAL = 1;
+       if (img_count < 1) {
+         RETVAL = 0;
+         i_clear_error();
+         i_push_error(0, "You need to specify images to save");
+       }
+       else {
+          imgs = mymalloc(sizeof(i_img *) * img_count);
+          for (i = 0; i < img_count; ++i) {
+           SV *sv = ST(1+i);
+           imgs[i] = NULL;
+           if (SvROK(sv) && sv_derived_from(sv, "Imager::ImgRaw")) {
+             imgs[i] = INT2PTR(i_img *, SvIV((SV*)SvRV(sv)));
+           }
+           else {
+             i_clear_error();
+             i_push_error(0, "Only images can be saved");
+              myfree(imgs);
+             RETVAL = 0;
+             break;
+            }
+         }
+          if (RETVAL) {
+           RETVAL = i_writecur_multi_wiol(ig, imgs, img_count);
+          }
+         myfree(imgs);
+       }
+      OUTPUT:
+        RETVAL
 
 BOOT:
        PERL_INITIALIZE_IMAGER_CALLBACKS;