File: T1.xs

package info (click to toggle)
libimager-perl 1.005%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 6,308 kB
  • ctags: 4,067
  • sloc: perl: 30,915; ansic: 27,680; makefile: 55; cpp: 4
file content (219 lines) | stat: -rw-r--r-- 5,011 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#define PERL_NO_GET_CONTEXT
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "imext.h"
#include "imperl.h"
#include "imt1.h"

DEFINE_IMAGER_CALLBACKS;

typedef i_t1_font_t Imager__Font__T1xs;

#define i_t1_DESTROY(font) i_t1_destroy(font)

MODULE = Imager::Font::T1  PACKAGE = Imager::Font::T1

undef_int
i_init_t1(t1log)
	int t1log

MODULE = Imager::Font::T1  PACKAGE = Imager::Font::T1xs PREFIX = i_t1_

Imager::Font::T1xs
i_t1_new(class,pfb,afm)
       	      char*    pfb
       	      char*    afm
  C_ARGS:
    pfb, afm

void
i_t1_DESTROY(font)
 Imager::Font::T1xs font	


undef_int
i_t1_cp(font,im,xb,yb,channel,points,str_sv,align,utf8=0,flags="",aa=1)
 Imager::Font::T1xs     font
    Imager::ImgRaw     im
	 i_img_dim     xb
	 i_img_dim     yb
	       int     channel
            double     points
	        SV*    str_sv
	       int     align
               int     utf8
              char*    flags
	       int     aa
             PREINIT:
               char *str;
               STRLEN len;
             CODE:
               str = SvPV(str_sv, len);
#ifdef SvUTF8
               if (SvUTF8(str_sv))
                 utf8 = 1;
#endif
               RETVAL = i_t1_cp(font, im, xb,yb,channel,points,str,len,align,
                                  utf8,flags,aa);
           OUTPUT:
             RETVAL


void
i_t1_bbox(fontnum,point,str_sv,utf8=0,flags="")
 Imager::Font::T1xs     fontnum
	    double     point
	        SV*    str_sv
               int     utf8
              char*    flags
	     PREINIT:
               const char *str;
               STRLEN len;
	       i_img_dim     cords[BOUNDING_BOX_COUNT];
               int i;
               int rc;
	     PPCODE:
               str = SvPV(str_sv, len);
#ifdef SvUTF8
               if (SvUTF8(str_sv))
                 utf8 = 1;
#endif
               rc = i_t1_bbox(fontnum,point,str,len,cords,utf8,flags);
               if (rc > 0) {
                 EXTEND(SP, rc);
                 for (i = 0; i < rc; ++i)
                   PUSHs(sv_2mortal(newSViv(cords[i])));
               }



undef_int
i_t1_text(font,im,xb,yb,cl,points,str_sv,align,utf8=0,flags="",aa=1)
 Imager::Font::T1xs font
    Imager::ImgRaw     im
	 i_img_dim     xb
	 i_img_dim     yb
     Imager::Color    cl
            double     points
	        SV*    str_sv
	       int     align
               int     utf8
        const char*    flags
	       int     aa
             PREINIT:
               char *str;
               STRLEN len;
             CODE:
               str = SvPV(str_sv, len);
#ifdef SvUTF8
               if (SvUTF8(str_sv))
                 utf8 = 1;
#endif
               RETVAL = i_t1_text(font,im, xb,yb,cl,points,str,len,align,
                                  utf8,flags,aa);
           OUTPUT:
             RETVAL

void
i_t1_has_chars(font, text_sv, utf8 = 0)
 Imager::Font::T1xs font
        SV  *text_sv
        int utf8
      PREINIT:
        char const *text;
        STRLEN len;
        char *work;
        int count;
        int i;
      PPCODE:
        text = SvPV(text_sv, len);
#ifdef SvUTF8
        if (SvUTF8(text_sv))
          utf8 = 1;
#endif
        work = mymalloc(len);
        count = i_t1_has_chars(font, text, len, utf8, work);
        if (GIMME_V == G_ARRAY) {
          EXTEND(SP, count);

          for (i = 0; i < count; ++i) {
            PUSHs(boolSV(work[i]));
          }
        }
        else {
          EXTEND(SP, 1);
          PUSHs(sv_2mortal(newSVpv(work, count)));
        }
        myfree(work);

void
i_t1_face_name(font)
 Imager::Font::T1xs font
      PREINIT:
        char name[255];
        int len;
      PPCODE:
        len = i_t1_face_name(font, name, sizeof(name));
        if (len) {
          EXTEND(SP, 1);
          PUSHs(sv_2mortal(newSVpv(name, strlen(name))));
        }

void
i_t1_glyph_names(font, text_sv, utf8 = 0)
 Imager::Font::T1xs font
        SV *text_sv
        int utf8
      PREINIT:
        char const *text;
        STRLEN work_len;
        size_t len;
        char name[255];
	SSize_t count = 0;
      PPCODE:
        text = SvPV(text_sv, work_len);
#ifdef SvUTF8
        if (SvUTF8(text_sv))
          utf8 = 1;
#endif
	i_clear_error();
        len = work_len;
        while (len) {
          unsigned long ch;
          if (utf8) {
            ch = i_utf8_advance(&text, &len);
            if (ch == ~0UL) {
              i_push_error(0, "invalid UTF8 character");
	      XSRETURN(0);
            }
          }
          else {
            ch = *text++;
            --len;
          }
          EXTEND(SP, count+1);
          if (i_t1_glyph_name(font, ch, name, sizeof(name))) {
            ST(count) = sv_2mortal(newSVpv(name, 0));
          }
          else {
            ST(count) = &PL_sv_undef;
          }
	  ++count;
        }
	XSRETURN(count);

int
i_t1_CLONE_SKIP(...)
    CODE:
	(void)items; /* avoid unused warning */
	RETVAL = 1;
    OUTPUT:
	RETVAL

BOOT:
	PERL_INITIALIZE_IMAGER_CALLBACKS;
	i_t1_start();