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