| 1 | # definitions we don't want to make visible to the world |
| 2 | # because they're intended for use specifically by Imager.xs |
| 3 | |
| 4 | # internal types used in Imager.xs |
| 5 | i_channel_list T_IM_CHANNEL_LIST |
| 6 | i_sample_list T_IM_SAMPLE_LIST |
| 7 | i_fsample_list T_IM_FSAMPLE_LIST |
| 8 | i_polygon_list T_IM_POLYGON_LIST |
| 9 | |
| 10 | off_t T_OFF_T |
| 11 | |
| 12 | Imager::Internal::Hlines T_PTROBJ |
| 13 | |
| 14 | Imager::Context T_PTROBJ |
| 15 | |
| 16 | i_palidx T_IV |
| 17 | double * T_AVARRAY |
| 18 | int * T_AVARRAY |
| 19 | i_img_dim * T_AVARRAY |
| 20 | i_color * T_AVARRAY |
| 21 | |
| 22 | i_poly_fill_mode_t T_I_POLY_FILL_MODE_T |
| 23 | |
| 24 | ############################################################################# |
| 25 | INPUT |
| 26 | |
| 27 | T_OFF_T |
| 28 | $var = i_sv_off_t(aTHX_ $arg); |
| 29 | |
| 30 | T_IM_CHANNEL_LIST |
| 31 | SvGETMAGIC($arg); |
| 32 | if (SvOK($arg)) { |
| 33 | AV *channels_av; |
| 34 | int i; |
| 35 | if (!SvROK($arg) || SvTYPE(SvRV($arg)) != SVt_PVAV) { |
| 36 | croak(\"$var is not an array ref\"); |
| 37 | } |
| 38 | channels_av = (AV *)SvRV($arg); |
| 39 | $var.count = av_len(channels_av) + 1; |
| 40 | if ($var.count < 1) { |
| 41 | croak(\"$pname: no channels provided\"); |
| 42 | } |
| 43 | $var.channels = malloc_temp(aTHX_ sizeof(int) * $var.count); |
| 44 | for (i = 0; i < $var.count; ++i) { |
| 45 | SV **entry = av_fetch(channels_av, i, 0); |
| 46 | $var.channels[i] = entry ? SvIV(*entry) : 0; |
| 47 | } |
| 48 | } |
| 49 | else { |
| 50 | /* assumes we have an image */ |
| 51 | $var.count = im->channels; |
| 52 | $var.channels = NULL; |
| 53 | } |
| 54 | |
| 55 | T_IM_SAMPLE_LIST |
| 56 | SvGETMAGIC($arg); |
| 57 | if (!SvOK($arg)) |
| 58 | croak(\"$var must be a scalar or an arrayref\"); |
| 59 | if (SvROK($arg)) { |
| 60 | i_img_dim i; |
| 61 | AV *av; |
| 62 | i_sample_t *s; |
| 63 | if (SvTYPE(SvRV($arg)) != SVt_PVAV) |
| 64 | croak(\"$var must be a scalar or an arrayref\"); |
| 65 | av = (AV *)SvRV($arg); |
| 66 | $var.count = av_len(av) + 1; |
| 67 | if ($var.count < 1) |
| 68 | croak(\"$pname: no samples provided in $var\"); |
| 69 | s = malloc_temp(aTHX_ sizeof(i_sample_t) * $var.count); |
| 70 | for (i = 0; i < $var.count; ++i) { |
| 71 | SV **entry = av_fetch(av, i, 0); |
| 72 | s[i] = entry ? SvIV(*entry) : 0; |
| 73 | } |
| 74 | $var.samples = s; |
| 75 | } |
| 76 | else { |
| 77 | /* non-magic would be preferable here */ |
| 78 | $var.samples = (const i_sample_t *)SvPVbyte($arg, $var.count); |
| 79 | if ($var.count == 0) |
| 80 | croak(\"$pname: no samples provided in $var\"); |
| 81 | } |
| 82 | |
| 83 | T_IM_FSAMPLE_LIST |
| 84 | SvGETMAGIC($arg); |
| 85 | if (!SvOK($arg)) |
| 86 | croak(\"$var must be a scalar or an arrayref\"); |
| 87 | if (SvROK($arg)) { |
| 88 | i_img_dim i; |
| 89 | AV *av; |
| 90 | i_fsample_t *s; |
| 91 | if (SvTYPE(SvRV($arg)) != SVt_PVAV) |
| 92 | croak(\"$var must be a scalar or an arrayref\"); |
| 93 | av = (AV *)SvRV($arg); |
| 94 | $var.count = av_len(av) + 1; |
| 95 | if ($var.count < 1) |
| 96 | croak(\"$pname: no samples provided in $var\"); |
| 97 | s = malloc_temp(aTHX_ sizeof(i_fsample_t) * $var.count); |
| 98 | for (i = 0; i < $var.count; ++i) { |
| 99 | SV **entry = av_fetch(av, i, 0); |
| 100 | s[i] = entry ? SvNV(*entry) : 0; |
| 101 | } |
| 102 | $var.samples = s; |
| 103 | } |
| 104 | else { |
| 105 | /* non-magic would be preferable here */ |
| 106 | $var.samples = (const i_fsample_t *)SvPVbyte($arg, $var.count); |
| 107 | if ($var.count % sizeof(double)) |
| 108 | croak(\"$pname: $var doesn't not contain a integer number of samples\"); |
| 109 | $var.count /= sizeof(double); |
| 110 | if ($var.count == 0) |
| 111 | croak(\"$pname: no samples provided in $var\"); |
| 112 | } |
| 113 | |
| 114 | T_IM_POLYGON_LIST |
| 115 | S_get_polygon_list(aTHX_ &$var, $arg); |
| 116 | |
| 117 | T_AVARRAY |
| 118 | STMT_START { |
| 119 | SV* const xsub_tmp_sv = $arg; |
| 120 | SvGETMAGIC(xsub_tmp_sv); |
| 121 | if (SvROK(xsub_tmp_sv) && SvTYPE(SvRV(xsub_tmp_sv)) == SVt_PVAV){ |
| 122 | AV *xsub_tmp_av = (AV*)SvRV(xsub_tmp_sv); |
| 123 | STRLEN xsub_index; |
| 124 | size_$var = av_len(xsub_tmp_av) + 1; |
| 125 | $var = $ntype(size_$var); |
| 126 | for (xsub_index = 0; xsub_index < size_$var; ++xsub_index) { |
| 127 | SV **sv = av_fetch(xsub_tmp_av, xsub_index, 0); |
| 128 | if (sv) { |
| 129 | ${var}[xsub_index] = Sv${(my $ntt = $ntype) =~ s/Ptr$//; \(ucfirst $ntt)}(*sv, \"$pname\"); |
| 130 | } |
| 131 | } |
| 132 | } |
| 133 | else{ |
| 134 | Perl_croak(aTHX_ \"%s: %s is not an ARRAY reference\", |
| 135 | ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, |
| 136 | \"$var\"); |
| 137 | } |
| 138 | } STMT_END |
| 139 | |
| 140 | T_I_POLY_FILL_MODE_T |
| 141 | $var = S_get_poly_fill_mode(aTHX_ $arg); |
| 142 | |
| 143 | |
| 144 | |
| 145 | ############################################################################# |
| 146 | OUTPUT |
| 147 | |
| 148 | T_OFF_T |
| 149 | $arg = i_new_sv_off_t(aTHX_ $var); |