#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();