Permalink
Fetching contributors…
Cannot retrieve contributors at this time
150 lines (131 sloc) 4 KB
# definitions we don't want to make visible to the world
# because they're intended for use specifically by Imager.xs
# internal types used in Imager.xs
i_channel_list T_IM_CHANNEL_LIST
i_sample_list T_IM_SAMPLE_LIST
i_fsample_list T_IM_FSAMPLE_LIST
i_polygon_list T_IM_POLYGON_LIST
off_t T_OFF_T
Imager::Internal::Hlines T_PTROBJ
Imager::Context T_PTROBJ
i_palidx T_IV
double * T_AVARRAY
int * T_AVARRAY
i_img_dim * T_AVARRAY
i_color * T_AVARRAY
i_poly_fill_mode_t T_I_POLY_FILL_MODE_T
#############################################################################
INPUT
T_OFF_T
$var = i_sv_off_t(aTHX_ $arg);
T_IM_CHANNEL_LIST
SvGETMAGIC($arg);
if (SvOK($arg)) {
AV *channels_av;
int i;
if (!SvROK($arg) || SvTYPE(SvRV($arg)) != SVt_PVAV) {
croak(\"$var is not an array ref\");
}
channels_av = (AV *)SvRV($arg);
$var.count = av_len(channels_av) + 1;
if ($var.count < 1) {
croak(\"$pname: no channels provided\");
}
$var.channels = malloc_temp(aTHX_ sizeof(int) * $var.count);
for (i = 0; i < $var.count; ++i) {
SV **entry = av_fetch(channels_av, i, 0);
$var.channels[i] = entry ? SvIV(*entry) : 0;
}
}
else {
/* assumes we have an image */
$var.count = im->channels;
$var.channels = NULL;
}
T_IM_SAMPLE_LIST
SvGETMAGIC($arg);
if (!SvOK($arg))
croak(\"$var must be a scalar or an arrayref\");
if (SvROK($arg)) {
i_img_dim i;
AV *av;
i_sample_t *s;
if (SvTYPE(SvRV($arg)) != SVt_PVAV)
croak(\"$var must be a scalar or an arrayref\");
av = (AV *)SvRV($arg);
$var.count = av_len(av) + 1;
if ($var.count < 1)
croak(\"$pname: no samples provided in $var\");
s = malloc_temp(aTHX_ sizeof(i_sample_t) * $var.count);
for (i = 0; i < $var.count; ++i) {
SV **entry = av_fetch(av, i, 0);
s[i] = entry ? SvIV(*entry) : 0;
}
$var.samples = s;
}
else {
/* non-magic would be preferable here */
$var.samples = (const i_sample_t *)SvPVbyte($arg, $var.count);
if ($var.count == 0)
croak(\"$pname: no samples provided in $var\");
}
T_IM_FSAMPLE_LIST
SvGETMAGIC($arg);
if (!SvOK($arg))
croak(\"$var must be a scalar or an arrayref\");
if (SvROK($arg)) {
i_img_dim i;
AV *av;
i_fsample_t *s;
if (SvTYPE(SvRV($arg)) != SVt_PVAV)
croak(\"$var must be a scalar or an arrayref\");
av = (AV *)SvRV($arg);
$var.count = av_len(av) + 1;
if ($var.count < 1)
croak(\"$pname: no samples provided in $var\");
s = malloc_temp(aTHX_ sizeof(i_fsample_t) * $var.count);
for (i = 0; i < $var.count; ++i) {
SV **entry = av_fetch(av, i, 0);
s[i] = entry ? SvNV(*entry) : 0;
}
$var.samples = s;
}
else {
/* non-magic would be preferable here */
$var.samples = (const i_fsample_t *)SvPVbyte($arg, $var.count);
if ($var.count % sizeof(double))
croak(\"$pname: $var doesn't not contain a integer number of samples\");
$var.count /= sizeof(double);
if ($var.count == 0)
croak(\"$pname: no samples provided in $var\");
}
T_IM_POLYGON_LIST
S_get_polygon_list(aTHX_ &$var, $arg);
T_AVARRAY
STMT_START {
SV* const xsub_tmp_sv = $arg;
SvGETMAGIC(xsub_tmp_sv);
if (SvROK(xsub_tmp_sv) && SvTYPE(SvRV(xsub_tmp_sv)) == SVt_PVAV){
AV *xsub_tmp_av = (AV*)SvRV(xsub_tmp_sv);
STRLEN xsub_index;
size_$var = av_len(xsub_tmp_av) + 1;
$var = $ntype(size_$var);
for (xsub_index = 0; xsub_index < size_$var; ++xsub_index) {
SV **sv = av_fetch(xsub_tmp_av, xsub_index, 0);
if (sv) {
${var}[xsub_index] = Sv${(my $ntt = $ntype) =~ s/Ptr$//; \(ucfirst $ntt)}(*sv, \"$pname\");
}
}
}
else{
Perl_croak(aTHX_ \"%s: %s is not an ARRAY reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
}
} STMT_END
T_I_POLY_FILL_MODE_T
$var = S_get_poly_fill_mode(aTHX_ $arg);
#############################################################################
OUTPUT
T_OFF_T
$arg = i_new_sv_off_t(aTHX_ $var);