]> git.imager.perl.org - imager.git/blob - typemap
WIP, more coverage and fixes
[imager.git] / typemap
1 #i_img *                        T_PTR_NULL
2 Imager::Color           T_PTROBJ
3 Imager::Color::Float    T_PTROBJ
4 Imager::ImgRaw          T_IMAGER_IMAGE
5 Imager::Font::TT        T_PTROBJ
6 Imager::IO              T_PTROBJ
7 Imager::FillHandle      T_PTROBJ
8 Imager::Internal::Hlines T_PTROBJ
9 const char *            T_PV
10 float                   T_FLOAT
11 float*                  T_ARRAY
12 undef_int               T_IV_U
13 undef_neg_int           T_IV_NEGU
14 HASH                    T_HVREF
15 utf8_str                T_UTF8_STR
16 i_img_dim               T_IV
17
18 # these types are for use by Inline, which can't handle types containing ::
19 Imager__Color           T_PTROBJ_INV
20 Imager__Color__Float    T_PTROBJ_INV
21 Imager__ImgRaw          T_IMAGER_IMAGE
22 Imager__FillHandle      T_PTROBJ_INV
23 Imager__IO              T_PTROBJ_INV
24
25 # mostly intended for non-Imager-core use
26 Imager                  T_IMAGER_FULL_IMAGE
27
28 off_t                   T_OFF_T
29
30 #############################################################################
31 INPUT
32 T_PTR_NULL
33         if (SvOK($arg)) $var = INT2PTR($type,SvIV($arg));
34         else $var = NULL
35
36 # the pre-5.8.0 T_AVREF input map was fixed in 5.8.0
37 T_AVREF
38         if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV)
39             $var = (AV*)SvRV($arg);
40         else
41             Perl_croak(aTHX_ \"$var is not an array reference\")
42
43 # handles Imager objects rather than just raw objects
44 T_IMAGER_IMAGE
45         if (sv_derived_from($arg, \"Imager::ImgRaw\")) {
46             IV tmp = SvIV((SV*)SvRV($arg));
47             $var = INT2PTR($type,tmp);
48         }
49         else if (sv_derived_from($arg, \"Imager\") && 
50                  SvTYPE(SvRV($arg)) == SVt_PVHV) {
51             HV *hv = (HV *)SvRV($arg);
52             SV **sv = hv_fetch(hv, \"IMG\", 3, 0);
53             if (sv && *sv && sv_derived_from(*sv, \"Imager::ImgRaw\")) {
54                 IV tmp = SvIV((SV*)SvRV(*sv));
55                 $var = INT2PTR($type,tmp);
56             }
57             else
58                 Perl_croak(aTHX_ \"$var is not of type Imager::ImgRaw\");
59         }
60         else
61             Perl_croak(aTHX_ \"$var is not of type Imager::ImgRaw\");
62
63 T_IMAGER_FULL_IMAGE
64         if (sv_derived_from($arg, \"Imager\") && 
65                  SvTYPE(SvRV($arg)) == SVt_PVHV) {
66             HV *hv = (HV *)SvRV($arg);
67             SV **sv = hv_fetch(hv, \"IMG\", 3, 0);
68             if (sv && *sv && sv_derived_from(*sv, \"Imager::ImgRaw\")) {
69                 IV tmp = SvIV((SV*)SvRV(*sv));
70                 $var = INT2PTR($type,tmp);
71             }
72             else
73                 Perl_croak(aTHX_ \"$var is not of type Imager::ImgRaw\");
74         }
75         else
76             Perl_croak(aTHX_ \"$var is not of type Imager\");
77
78 # same as T_PTROBJ, but replace __ with ::, the opposite of the way
79 # xsubpp's processing works
80 # this is to compensate for Inline's problem with type names containing ::
81 T_PTROBJ_INV
82         if (sv_derived_from($arg, \"${(my $ntt=$ntype)=~s/__/::/g;\$ntt}\")) {
83             IV tmp = SvIV((SV*)SvRV($arg));
84             $var = INT2PTR($type,tmp);
85         }
86         else
87             croak(\"$var is not of type ${(my $ntt=$ntype)=~s/__/::/g;\$ntt}\");
88
89 T_OFF_T
90   $var = i_sv_off_t(aTHX_ $arg);
91
92 #############################################################################
93 OUTPUT
94 T_IV_U
95         if ($var == 0) $arg=&PL_sv_undef;
96         else sv_setiv($arg, (IV)$var);
97 T_IV_NEGU
98         if ($var < 0) $arg=&PL_sv_undef;
99         else sv_setiv($arg, (IV)$var);
100 T_PTR_NULL
101         sv_setiv($arg, (IV)$var);
102
103 # same as T_PTROBJ
104 T_IMAGER_IMAGE
105         sv_setref_pv($arg, \"Imager::ImgRaw\", (void*)$var);
106
107 T_PTROBJ_INV
108         sv_setref_pv($arg, \"${(my $ntt=$ntype)=~s/__/::/g;\$ntt}\", (void*)$var);
109
110 # ugh, the things we do for ease of use
111 # this isn't suitable in some cases
112 T_IMAGER_FULL_IMAGE
113         if ($var) {
114           SV *imobj = NEWSV(0, 0);
115           HV *hv = newHV();
116           sv_setref_pv(imobj, \"Imager::ImgRaw\", $var);
117           hv_store(hv, "IMG", 3, imobj, 0);
118           $arg = sv_2mortal(sv_bless(newRV_noinc((SV*)hv), gv_stashpv("Imager", 1)));
119         }
120         else {
121           $arg = &PL_sv_undef;
122         }
123 T_OFF_T
124         $arg = i_new_sv_off_t(aTHX_ $var);