Imager-File-WEBP

 view release on metacpan or  search on metacpan

WEBP.xs  view on Meta::CPAN

#define PERL_NO_GET_CONTEXT
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "imext.h"
#include "imperl.h"
#include "imwebp.h"

typedef i_webp_config_t *Imager__File__WEBP__Config;
typedef i_webp_config_t *opt_Imager__File__WEBP__Config;

#define i_webp_config_DESTROY i_webp_config_destroy
#define i_webp_config_new(cls, im) i_webp_config_create(im)

DEFINE_IMAGER_CALLBACKS;

MODULE = Imager::File::WEBP  PACKAGE = Imager::File::WEBP

Imager::ImgRaw
i_readwebp(ig, page=0)
        Imager::IO     ig
               int     page

void
i_readwebp_multi(ig)
        Imager::IO     ig
      PREINIT:
        i_img **imgs;
        int count;
        int i;
      PPCODE:
        imgs = i_readwebp_multi(ig, &count);
        if (imgs) {
          EXTEND(SP, count);
          for (i = 0; i < count; ++i) {
            SV *sv = sv_newmortal();
            sv_setref_pv(sv, "Imager::ImgRaw", (void *)imgs[i]);
            PUSHs(sv);
          }
          myfree(imgs);
        }


undef_int
i_writewebp(im, ig, cfg = NULL)
    Imager::ImgRaw     im
        Imager::IO     ig
	opt_Imager::File::WEBP::Config cfg

undef_int
i_writewebp_multi(ig, cfg, ...)
        Imager::IO     ig
	opt_Imager::File::WEBP::Config cfg
      PREINIT:
        int i;
        int img_count;
        i_img **imgs;
      CODE:
        if (items < 3)
          croak("Usage: i_writewebp_multi(ig, images...)");
        img_count = items - 2;
        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(2+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_writewebp_multi(ig, imgs, img_count, cfg);
          }
	  myfree(imgs);
	}
      OUTPUT:
        RETVAL



( run in 0.665 second using v1.01-cache-2.11-cpan-5511b514fd6 )