]> git.imager.perl.org - imager.git/blame - T1/T1.xs
tests and fixes for correct handling of get magic in FT2
[imager.git] / T1 / T1.xs
CommitLineData
a556912d
TC
1#define PERL_NO_GET_CONTEXT
2#ifdef __cplusplus
3extern "C" {
4#endif
5#include "EXTERN.h"
6#include "perl.h"
7#include "XSUB.h"
8#include "imext.h"
9#include "imperl.h"
10#include "imt1.h"
11
12DEFINE_IMAGER_CALLBACKS;
13
1aaae40f
TC
14typedef i_t1_font_t Imager__Font__T1xs;
15
16#define i_t1_DESTROY(font) i_t1_destroy(font)
17
a556912d
TC
18MODULE = Imager::Font::T1 PACKAGE = Imager::Font::T1
19
20undef_int
21i_init_t1(t1log)
22 int t1log
23
1aaae40f 24MODULE = Imager::Font::T1 PACKAGE = Imager::Font::T1xs PREFIX = i_t1_
a556912d 25
1aaae40f
TC
26Imager::Font::T1xs
27i_t1_new(class,pfb,afm)
a556912d
TC
28 char* pfb
29 char* afm
1aaae40f
TC
30 C_ARGS:
31 pfb, afm
a556912d 32
1aaae40f
TC
33void
34i_t1_DESTROY(font)
35 Imager::Font::T1xs font
a556912d
TC
36
37
38undef_int
1aaae40f
TC
39i_t1_cp(font,im,xb,yb,channel,points,str_sv, length(str),align,utf8=0,flags="",aa=1)
40 Imager::Font::T1xs font
a556912d 41 Imager::ImgRaw im
8d14daab
TC
42 i_img_dim xb
43 i_img_dim yb
a556912d 44 int channel
8d14daab 45 double points
a556912d
TC
46 SV* str_sv
47 int align
48 int utf8
49 char* flags
1aaae40f 50 int aa
a556912d
TC
51 PREINIT:
52 char *str;
53 STRLEN len;
54 CODE:
55#ifdef SvUTF8
56 if (SvUTF8(str_sv))
57 utf8 = 1;
58#endif
59 str = SvPV(str_sv, len);
1aaae40f
TC
60 RETVAL = i_t1_cp(font, im, xb,yb,channel,points,str,len,align,
61 utf8,flags,aa);
a556912d
TC
62 OUTPUT:
63 RETVAL
64
65
66void
67i_t1_bbox(fontnum,point,str_sv,len_ignored,utf8=0,flags="")
1aaae40f 68 Imager::Font::T1xs fontnum
8d14daab 69 double point
a556912d
TC
70 SV* str_sv
71 int utf8
72 char* flags
73 PREINIT:
74 char *str;
75 STRLEN len;
8d14daab 76 i_img_dim cords[BOUNDING_BOX_COUNT];
a556912d
TC
77 int i;
78 int rc;
79 PPCODE:
80#ifdef SvUTF8
81 if (SvUTF8(str_sv))
82 utf8 = 1;
83#endif
84 str = SvPV(str_sv, len);
85 rc = i_t1_bbox(fontnum,point,str,len,cords,utf8,flags);
86 if (rc > 0) {
87 EXTEND(SP, rc);
88 for (i = 0; i < rc; ++i)
89 PUSHs(sv_2mortal(newSViv(cords[i])));
90 }
91
92
93
94undef_int
1aaae40f
TC
95i_t1_text(font,im,xb,yb,cl,points,str_sv,length(str),align,utf8=0,flags="",aa=1)
96 Imager::Font::T1xs font
a556912d 97 Imager::ImgRaw im
8d14daab
TC
98 i_img_dim xb
99 i_img_dim yb
a556912d 100 Imager::Color cl
8d14daab 101 double points
a556912d
TC
102 SV* str_sv
103 int align
104 int utf8
1aaae40f
TC
105 const char* flags
106 int aa
a556912d
TC
107 PREINIT:
108 char *str;
109 STRLEN len;
110 CODE:
111#ifdef SvUTF8
112 if (SvUTF8(str_sv))
113 utf8 = 1;
114#endif
115 str = SvPV(str_sv, len);
1aaae40f
TC
116 RETVAL = i_t1_text(font,im, xb,yb,cl,points,str,len,align,
117 utf8,flags,aa);
a556912d
TC
118 OUTPUT:
119 RETVAL
120
121void
1aaae40f
TC
122i_t1_has_chars(font, text_sv, utf8 = 0)
123 Imager::Font::T1xs font
a556912d
TC
124 SV *text_sv
125 int utf8
126 PREINIT:
127 char const *text;
128 STRLEN len;
129 char *work;
130 int count;
131 int i;
132 PPCODE:
133#ifdef SvUTF8
134 if (SvUTF8(text_sv))
135 utf8 = 1;
136#endif
137 text = SvPV(text_sv, len);
138 work = mymalloc(len);
1aaae40f 139 count = i_t1_has_chars(font, text, len, utf8, work);
a556912d
TC
140 if (GIMME_V == G_ARRAY) {
141 EXTEND(SP, count);
1aaae40f 142
a556912d 143 for (i = 0; i < count; ++i) {
6e938c74 144 PUSHs(boolSV(work[i]));
a556912d
TC
145 }
146 }
147 else {
148 EXTEND(SP, 1);
149 PUSHs(sv_2mortal(newSVpv(work, count)));
150 }
151 myfree(work);
152
153void
1aaae40f
TC
154i_t1_face_name(font)
155 Imager::Font::T1xs font
a556912d
TC
156 PREINIT:
157 char name[255];
158 int len;
159 PPCODE:
1aaae40f 160 len = i_t1_face_name(font, name, sizeof(name));
a556912d
TC
161 if (len) {
162 EXTEND(SP, 1);
163 PUSHs(sv_2mortal(newSVpv(name, strlen(name))));
164 }
165
166void
1aaae40f
TC
167i_t1_glyph_name(font, text_sv, utf8 = 0)
168 Imager::Font::T1xs font
a556912d
TC
169 SV *text_sv
170 int utf8
171 PREINIT:
172 char const *text;
173 STRLEN work_len;
174 size_t len;
175 char name[255];
176 PPCODE:
177#ifdef SvUTF8
178 if (SvUTF8(text_sv))
179 utf8 = 1;
180#endif
181 text = SvPV(text_sv, work_len);
182 len = work_len;
183 while (len) {
184 unsigned long ch;
185 if (utf8) {
186 ch = i_utf8_advance(&text, &len);
187 if (ch == ~0UL) {
188 i_push_error(0, "invalid UTF8 character");
189 break;
190 }
191 }
192 else {
193 ch = *text++;
194 --len;
195 }
196 EXTEND(SP, 1);
1aaae40f 197 if (i_t1_glyph_name(font, ch, name, sizeof(name))) {
a556912d
TC
198 PUSHs(sv_2mortal(newSVpv(name, 0)));
199 }
200 else {
201 PUSHs(&PL_sv_undef);
202 }
203 }
204
1aaae40f
TC
205int
206i_t1_CLONE_SKIP(...)
207 CODE:
208 (void)items; /* avoid unused warning */
209 RETVAL = 1;
210 OUTPUT:
211 RETVAL
212
a556912d
TC
213BOOT:
214 PERL_INITIALIZE_IMAGER_CALLBACKS;
1aaae40f 215 i_t1_start();