/* * This file was generated automatically by ExtUtils::ParseXS version 3.18 from the * contents of GIF.xs. Do not edit this file, edit GIF.xs instead. * * ANY CHANGES MADE HERE WILL BE LOST! * */ #line 1 "GIF.xs" #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 "imgif.h" #include "imextpl.h" DEFINE_IMAGER_CALLBACKS; DEFINE_IMAGER_PERL_CALLBACKS; #line 26 "GIF.c" #ifndef PERL_UNUSED_VAR # define PERL_UNUSED_VAR(var) if (0) var = var #endif #ifndef dVAR # define dVAR dNOOP #endif /* This stuff is not part of the API! You have been warned. */ #ifndef PERL_VERSION_DECIMAL # define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s) #endif #ifndef PERL_DECIMAL_VERSION # define PERL_DECIMAL_VERSION \ PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION) #endif #ifndef PERL_VERSION_GE # define PERL_VERSION_GE(r,v,s) \ (PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s)) #endif #ifndef PERL_VERSION_LE # define PERL_VERSION_LE(r,v,s) \ (PERL_DECIMAL_VERSION <= PERL_VERSION_DECIMAL(r,v,s)) #endif /* XS_INTERNAL is the explicit static-linkage variant of the default * XS macro. * * XS_EXTERNAL is the same as XS_INTERNAL except it does not include * "STATIC", ie. it exports XSUB symbols. You probably don't want that * for anything but the BOOT XSUB. * * See XSUB.h in core! */ /* TODO: This might be compatible further back than 5.10.0. */ #if PERL_VERSION_GE(5, 10, 0) && PERL_VERSION_LE(5, 15, 1) # undef XS_EXTERNAL # undef XS_INTERNAL # if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING) # define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name) # define XS_INTERNAL(name) STATIC XSPROTO(name) # endif # if defined(__SYMBIAN32__) # define XS_EXTERNAL(name) EXPORT_C XSPROTO(name) # define XS_INTERNAL(name) EXPORT_C STATIC XSPROTO(name) # endif # ifndef XS_EXTERNAL # if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus) # define XS_EXTERNAL(name) void name(pTHX_ CV* cv __attribute__unused__) # define XS_INTERNAL(name) STATIC void name(pTHX_ CV* cv __attribute__unused__) # else # ifdef __cplusplus # define XS_EXTERNAL(name) extern "C" XSPROTO(name) # define XS_INTERNAL(name) static XSPROTO(name) # else # define XS_EXTERNAL(name) XSPROTO(name) # define XS_INTERNAL(name) STATIC XSPROTO(name) # endif # endif # endif #endif /* perl >= 5.10.0 && perl <= 5.15.1 */ /* The XS_EXTERNAL macro is used for functions that must not be static * like the boot XSUB of a module. If perl didn't have an XS_EXTERNAL * macro defined, the best we can do is assume XS is the same. * Dito for XS_INTERNAL. */ #ifndef XS_EXTERNAL # define XS_EXTERNAL(name) XS(name) #endif #ifndef XS_INTERNAL # define XS_INTERNAL(name) XS(name) #endif /* Now, finally, after all this mess, we want an ExtUtils::ParseXS * internal macro that we're free to redefine for varying linkage due * to the EXPORT_XSUB_SYMBOLS XS keyword. This is internal, use * XS_EXTERNAL(name) or XS_INTERNAL(name) in your code if you need to! */ #undef XS_EUPXS #if defined(PERL_EUPXS_ALWAYS_EXPORT) # define XS_EUPXS(name) XS_EXTERNAL(name) #else /* default to internal */ # define XS_EUPXS(name) XS_INTERNAL(name) #endif #ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE #define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params) /* prototype to pass -Wmissing-prototypes */ STATIC void S_croak_xs_usage(pTHX_ const CV *const cv, const char *const params); STATIC void S_croak_xs_usage(pTHX_ const CV *const cv, const char *const params) { const GV *const gv = CvGV(cv); PERL_ARGS_ASSERT_CROAK_XS_USAGE; if (gv) { const char *const gvname = GvNAME(gv); const HV *const stash = GvSTASH(gv); const char *const hvname = stash ? HvNAME(stash) : NULL; if (hvname) Perl_croak(aTHX_ "Usage: %s::%s(%s)", hvname, gvname, params); else Perl_croak(aTHX_ "Usage: %s(%s)", gvname, params); } else { /* Pants. I don't think that it should be possible to get here. */ Perl_croak(aTHX_ "Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params); } } #undef PERL_ARGS_ASSERT_CROAK_XS_USAGE #ifdef PERL_IMPLICIT_CONTEXT #define croak_xs_usage(a,b) S_croak_xs_usage(aTHX_ a,b) #else #define croak_xs_usage S_croak_xs_usage #endif #endif /* NOTE: the prototype of newXSproto() is different in versions of perls, * so we define a portable version of newXSproto() */ #ifdef newXS_flags #define newXSproto_portable(name, c_impl, file, proto) newXS_flags(name, c_impl, file, proto, 0) #else #define newXSproto_portable(name, c_impl, file, proto) (PL_Sv=(SV*)newXS(name, c_impl, file), sv_setpv(PL_Sv, proto), (CV*)PL_Sv) #endif /* !defined(newXS_flags) */ #line 168 "GIF.c" XS_EUPXS(XS_Imager__File__GIF_i_giflib_version); /* prototype to pass -Wmissing-prototypes */ XS_EUPXS(XS_Imager__File__GIF_i_giflib_version) { dVAR; dXSARGS; if (items != 0) croak_xs_usage(cv, ""); { double RETVAL; dXSTARG; RETVAL = i_giflib_version(); XSprePUSH; PUSHn((double)RETVAL); } XSRETURN(1); } XS_EUPXS(XS_Imager__File__GIF_i_writegif_wiol); /* prototype to pass -Wmissing-prototypes */ XS_EUPXS(XS_Imager__File__GIF_i_writegif_wiol) { dVAR; dXSARGS; if (items < 2) croak_xs_usage(cv, "ig, opts, ..."); { Imager__IO ig; #line 25 "GIF.xs" i_quantize quant; i_img **imgs = NULL; int img_count; int i; HV *hv; #line 201 "GIF.c" undef_int RETVAL; if (SvROK(ST(0)) && sv_derived_from(ST(0), "Imager::IO")) { IV tmp = SvIV((SV*)SvRV(ST(0))); ig = INT2PTR(Imager__IO,tmp); } else Perl_croak(aTHX_ "%s: %s is not of type %s", "Imager::File::GIF::i_writegif_wiol", "ig", "Imager::IO") ; #line 31 "GIF.xs" if (items < 3) croak("Usage: i_writegif_wiol(IO,hashref, images...)"); if (!SvROK(ST(1)) || ! SvTYPE(SvRV(ST(1)))) croak("i_writegif_callback: Second argument must be a hash ref"); hv = (HV *)SvRV(ST(1)); memset(&quant, 0, sizeof(quant)); quant.version = 1; quant.mc_size = 256; quant.transp = tr_threshold; quant.tr_threshold = 127; ip_handle_quant_opts(aTHX_ &quant, hv); img_count = items - 2; RETVAL = 1; if (img_count < 1) { RETVAL = 0; } 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 { RETVAL = 0; break; } } if (RETVAL) { RETVAL = i_writegif_wiol(ig, &quant, imgs, img_count); } myfree(imgs); if (RETVAL) { ip_copy_colors_back(aTHX_ hv, &quant); } } ST(0) = sv_newmortal(); if (RETVAL == 0) ST(0)=&PL_sv_undef; else sv_setiv(ST(0), (IV)RETVAL); ip_cleanup_quant_opts(aTHX_ &quant); #line 255 "GIF.c" } XSRETURN(1); } XS_EUPXS(XS_Imager__File__GIF_i_readgif_wiol); /* prototype to pass -Wmissing-prototypes */ XS_EUPXS(XS_Imager__File__GIF_i_readgif_wiol) { dVAR; dXSARGS; if (items != 1) croak_xs_usage(cv, "ig"); PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { Imager__IO ig; #line 78 "GIF.xs" int* colour_table; int colours, q, w; i_img* rimg; SV* temp[3]; AV* ct; SV* r; #line 278 "GIF.c" if (SvROK(ST(0)) && sv_derived_from(ST(0), "Imager::IO")) { IV tmp = SvIV((SV*)SvRV(ST(0))); ig = INT2PTR(Imager__IO,tmp); } else Perl_croak(aTHX_ "%s: %s is not of type %s", "Imager::File::GIF::i_readgif_wiol", "ig", "Imager::IO") ; #line 85 "GIF.xs" colour_table = NULL; colours = 0; if(GIMME_V == G_ARRAY) { rimg = i_readgif_wiol(ig,&colour_table,&colours); } else { /* don't waste time with colours if they aren't wanted */ rimg = i_readgif_wiol(ig,NULL,NULL); } if (colour_table == NULL) { EXTEND(SP,1); r=sv_newmortal(); sv_setref_pv(r, "Imager::ImgRaw", (void*)rimg); PUSHs(r); } else { /* the following creates an [[r,g,b], [r, g, b], [r, g, b]...] */ /* I don't know if I have the reference counts right or not :( */ /* Neither do I :-) */ /* No Idea here either */ ct=newAV(); av_extend(ct, colours); for(q=0; q<colours; q++) { for(w=0; w<3; w++) temp[w]=sv_2mortal(newSViv(colour_table[q*3 + w])); av_store(ct, q, (SV*)newRV_noinc((SV*)av_make(3, temp))); } myfree(colour_table); EXTEND(SP,2); r = sv_newmortal(); sv_setref_pv(r, "Imager::ImgRaw", (void*)rimg); PUSHs(r); PUSHs(newRV_noinc((SV*)ct)); } #line 326 "GIF.c" PUTBACK; return; } } XS_EUPXS(XS_Imager__File__GIF_i_readgif_single_wiol); /* prototype to pass -Wmissing-prototypes */ XS_EUPXS(XS_Imager__File__GIF_i_readgif_single_wiol) { dVAR; dXSARGS; if (items < 1 || items > 2) croak_xs_usage(cv, "ig, page=0"); { Imager__IO ig; int page; Imager__ImgRaw RETVAL; if (SvROK(ST(0)) && sv_derived_from(ST(0), "Imager::IO")) { IV tmp = SvIV((SV*)SvRV(ST(0))); ig = INT2PTR(Imager__IO,tmp); } else Perl_croak(aTHX_ "%s: %s is not of type %s", "Imager::File::GIF::i_readgif_single_wiol", "ig", "Imager::IO") ; if (items < 2) page = 0; else { page = (int)SvIV(ST(1)) ; } RETVAL = i_readgif_single_wiol(ig, page); ST(0) = sv_newmortal(); sv_setref_pv(ST(0), "Imager::ImgRaw", (void*)RETVAL); } XSRETURN(1); } XS_EUPXS(XS_Imager__File__GIF_i_readgif_multi_wiol); /* prototype to pass -Wmissing-prototypes */ XS_EUPXS(XS_Imager__File__GIF_i_readgif_multi_wiol) { dVAR; dXSARGS; if (items != 1) croak_xs_usage(cv, "ig"); PERL_UNUSED_VAR(ax); /* -Wall */ SP -= items; { Imager__IO ig; #line 131 "GIF.xs" i_img **imgs; int count; int i; #line 383 "GIF.c" if (SvROK(ST(0)) && sv_derived_from(ST(0), "Imager::IO")) { IV tmp = SvIV((SV*)SvRV(ST(0))); ig = INT2PTR(Imager__IO,tmp); } else Perl_croak(aTHX_ "%s: %s is not of type %s", "Imager::File::GIF::i_readgif_multi_wiol", "ig", "Imager::IO") ; #line 135 "GIF.xs" imgs = i_readgif_multi_wiol(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); } #line 405 "GIF.c" PUTBACK; return; } } #ifdef __cplusplus extern "C" #endif XS_EXTERNAL(boot_Imager__File__GIF); /* prototype to pass -Wmissing-prototypes */ XS_EXTERNAL(boot_Imager__File__GIF) { dVAR; dXSARGS; #if (PERL_REVISION == 5 && PERL_VERSION < 9) char* file = __FILE__; #else const char* file = __FILE__; #endif PERL_UNUSED_VAR(cv); /* -W */ PERL_UNUSED_VAR(items); /* -W */ #ifdef XS_APIVERSION_BOOTCHECK XS_APIVERSION_BOOTCHECK; #endif XS_VERSION_BOOTCHECK; newXS("Imager::File::GIF::i_giflib_version", XS_Imager__File__GIF_i_giflib_version, file); newXS("Imager::File::GIF::i_writegif_wiol", XS_Imager__File__GIF_i_writegif_wiol, file); newXS("Imager::File::GIF::i_readgif_wiol", XS_Imager__File__GIF_i_readgif_wiol, file); newXS("Imager::File::GIF::i_readgif_single_wiol", XS_Imager__File__GIF_i_readgif_single_wiol, file); newXS("Imager::File::GIF::i_readgif_multi_wiol", XS_Imager__File__GIF_i_readgif_multi_wiol, file); /* Initialisation Section */ #line 148 "GIF.xs" PERL_INITIALIZE_IMAGER_CALLBACKS; PERL_INITIALIZE_IMAGER_PERL_CALLBACKS; i_init_gif(); #line 444 "GIF.c" /* End of Initialisation Section */ #if (PERL_REVISION == 5 && PERL_VERSION >= 9) if (PL_unitcheckav) call_list(PL_scopestack_ix, PL_unitcheckav); #endif XSRETURN_YES; }