1*37da2899SCharles.Forsyth #include "freetype/freetype.h"
2*37da2899SCharles.Forsyth #include "freetype.h"
3*37da2899SCharles.Forsyth
4*37da2899SCharles.Forsyth static char* fterrstr(int);
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsyth char*
ftnewface(char * path,int index,FTface * f,FTfaceinfo * finfo)7*37da2899SCharles.Forsyth ftnewface(char *path, int index, FTface *f, FTfaceinfo *finfo)
8*37da2899SCharles.Forsyth {
9*37da2899SCharles.Forsyth FT_Library ft_lib;
10*37da2899SCharles.Forsyth FT_Face ft_face;
11*37da2899SCharles.Forsyth char *err;
12*37da2899SCharles.Forsyth
13*37da2899SCharles.Forsyth err = fterrstr(FT_Init_FreeType(&ft_lib));
14*37da2899SCharles.Forsyth if (err != nil)
15*37da2899SCharles.Forsyth return err;
16*37da2899SCharles.Forsyth
17*37da2899SCharles.Forsyth err = fterrstr(FT_New_Face(ft_lib, path, index, &ft_face));
18*37da2899SCharles.Forsyth if (err != nil) {
19*37da2899SCharles.Forsyth FT_Done_FreeType(ft_lib);
20*37da2899SCharles.Forsyth return err;
21*37da2899SCharles.Forsyth }
22*37da2899SCharles.Forsyth
23*37da2899SCharles.Forsyth f->ft_lib = ft_lib;
24*37da2899SCharles.Forsyth f->ft_face = ft_face;
25*37da2899SCharles.Forsyth finfo->nfaces = ft_face->num_faces;
26*37da2899SCharles.Forsyth finfo->index = ft_face->face_index;
27*37da2899SCharles.Forsyth finfo->style = ft_face->style_flags;
28*37da2899SCharles.Forsyth finfo->height = (FT_MulFix(ft_face->height, ft_face->size->metrics.y_scale)+32)/64;
29*37da2899SCharles.Forsyth finfo->ascent = (FT_MulFix(ft_face->ascender, ft_face->size->metrics.y_scale)+32)/64;
30*37da2899SCharles.Forsyth finfo->familyname = ft_face->family_name;
31*37da2899SCharles.Forsyth finfo->stylename = ft_face->style_name;
32*37da2899SCharles.Forsyth return nil;
33*37da2899SCharles.Forsyth }
34*37da2899SCharles.Forsyth
35*37da2899SCharles.Forsyth char*
ftloadmemface(void * buf,int nbytes,int index,FTface * f,FTfaceinfo * finfo)36*37da2899SCharles.Forsyth ftloadmemface(void *buf, int nbytes, int index, FTface *f, FTfaceinfo *finfo)
37*37da2899SCharles.Forsyth {
38*37da2899SCharles.Forsyth USED(buf);
39*37da2899SCharles.Forsyth USED(f);
40*37da2899SCharles.Forsyth USED(finfo);
41*37da2899SCharles.Forsyth return "not implemented";
42*37da2899SCharles.Forsyth }
43*37da2899SCharles.Forsyth
44*37da2899SCharles.Forsyth char*
ftsetcharsize(FTface f,int pt,int hdpi,int vdpi,FTfaceinfo * finfo)45*37da2899SCharles.Forsyth ftsetcharsize(FTface f, int pt, int hdpi, int vdpi, FTfaceinfo *finfo)
46*37da2899SCharles.Forsyth {
47*37da2899SCharles.Forsyth FT_Face ft_face = f.ft_face;
48*37da2899SCharles.Forsyth char *err;
49*37da2899SCharles.Forsyth
50*37da2899SCharles.Forsyth err = fterrstr(FT_Set_Char_Size(ft_face, 0, pt, hdpi, vdpi));
51*37da2899SCharles.Forsyth if (err != nil)
52*37da2899SCharles.Forsyth return err;
53*37da2899SCharles.Forsyth finfo->height = (FT_MulFix(ft_face->height, ft_face->size->metrics.y_scale)+32)/64;
54*37da2899SCharles.Forsyth finfo->ascent = (FT_MulFix(ft_face->ascender, ft_face->size->metrics.y_scale)+32)/64;
55*37da2899SCharles.Forsyth return nil;
56*37da2899SCharles.Forsyth }
57*37da2899SCharles.Forsyth
58*37da2899SCharles.Forsyth void
ftsettransform(FTface f,FTmatrix * m,FTvector * v)59*37da2899SCharles.Forsyth ftsettransform(FTface f, FTmatrix *m, FTvector *v)
60*37da2899SCharles.Forsyth {
61*37da2899SCharles.Forsyth /* FTMatrix and FTVector are compatible with FT_Matrix and FT_Vector */
62*37da2899SCharles.Forsyth FT_Set_Transform(f.ft_face, (FT_Matrix*)m, (FT_Vector*)v);
63*37da2899SCharles.Forsyth }
64*37da2899SCharles.Forsyth
65*37da2899SCharles.Forsyth int
fthaschar(FTface f,int c)66*37da2899SCharles.Forsyth fthaschar(FTface f, int c)
67*37da2899SCharles.Forsyth {
68*37da2899SCharles.Forsyth return FT_Get_Char_Index(f.ft_face, c) != 0;
69*37da2899SCharles.Forsyth }
70*37da2899SCharles.Forsyth
71*37da2899SCharles.Forsyth char*
ftloadglyph(FTface f,int ix,FTglyph * g)72*37da2899SCharles.Forsyth ftloadglyph(FTface f, int ix, FTglyph *g)
73*37da2899SCharles.Forsyth {
74*37da2899SCharles.Forsyth FT_Face ft_face = f.ft_face;
75*37da2899SCharles.Forsyth FT_GlyphSlot ft_glyph;
76*37da2899SCharles.Forsyth char *err;
77*37da2899SCharles.Forsyth
78*37da2899SCharles.Forsyth ix = FT_Get_Char_Index(ft_face, ix);
79*37da2899SCharles.Forsyth err = fterrstr(FT_Load_Glyph(ft_face, ix, FT_LOAD_NO_BITMAP|FT_LOAD_RENDER|FT_LOAD_CROP_BITMAP));
80*37da2899SCharles.Forsyth if (err != nil)
81*37da2899SCharles.Forsyth return err;
82*37da2899SCharles.Forsyth
83*37da2899SCharles.Forsyth ft_glyph = ft_face->glyph;
84*37da2899SCharles.Forsyth g->top = ft_glyph->bitmap_top;
85*37da2899SCharles.Forsyth g->left = ft_glyph->bitmap_left;
86*37da2899SCharles.Forsyth g->height = ft_glyph->bitmap.rows;
87*37da2899SCharles.Forsyth g->width = ft_glyph->bitmap.width;
88*37da2899SCharles.Forsyth g->advx = ft_glyph->advance.x;
89*37da2899SCharles.Forsyth g->advy = ft_glyph->advance.y;
90*37da2899SCharles.Forsyth g->bpr = ft_glyph->bitmap.pitch;
91*37da2899SCharles.Forsyth g->bitmap = ft_glyph->bitmap.buffer;
92*37da2899SCharles.Forsyth return nil;
93*37da2899SCharles.Forsyth }
94*37da2899SCharles.Forsyth
95*37da2899SCharles.Forsyth void
ftdoneface(FTface f)96*37da2899SCharles.Forsyth ftdoneface(FTface f)
97*37da2899SCharles.Forsyth {
98*37da2899SCharles.Forsyth if (f.ft_face != nil)
99*37da2899SCharles.Forsyth FT_Done_Face(f.ft_face);
100*37da2899SCharles.Forsyth if (f.ft_lib != nil)
101*37da2899SCharles.Forsyth FT_Done_FreeType(f.ft_lib);
102*37da2899SCharles.Forsyth }
103*37da2899SCharles.Forsyth
104*37da2899SCharles.Forsyth /*
105*37da2899SCharles.Forsyth * get the freetype error strings
106*37da2899SCharles.Forsyth */
107*37da2899SCharles.Forsyth
108*37da2899SCharles.Forsyth typedef struct FTerr FTerr;
109*37da2899SCharles.Forsyth struct FTerr {
110*37da2899SCharles.Forsyth int code;
111*37da2899SCharles.Forsyth char* text;
112*37da2899SCharles.Forsyth };
113*37da2899SCharles.Forsyth
114*37da2899SCharles.Forsyth #define FT_NOERRORDEF_(l,c,t)
115*37da2899SCharles.Forsyth #define FT_ERRORDEF_(l,c,t) c,t,
116*37da2899SCharles.Forsyth
117*37da2899SCharles.Forsyth static FTerr fterrs[] = {
118*37da2899SCharles.Forsyth #include "freetype/fterrdef.h"
119*37da2899SCharles.Forsyth -1, "",
120*37da2899SCharles.Forsyth };
121*37da2899SCharles.Forsyth
122*37da2899SCharles.Forsyth static char*
fterrstr(int code)123*37da2899SCharles.Forsyth fterrstr(int code)
124*37da2899SCharles.Forsyth {
125*37da2899SCharles.Forsyth int i;
126*37da2899SCharles.Forsyth if (code == 0)
127*37da2899SCharles.Forsyth return nil;
128*37da2899SCharles.Forsyth for (i = 0; fterrs[i].code > 0; i++) {
129*37da2899SCharles.Forsyth if (fterrs[i].code == code)
130*37da2899SCharles.Forsyth return fterrs[i].text;
131*37da2899SCharles.Forsyth }
132*37da2899SCharles.Forsyth return "unknown FreeType error";
133*37da2899SCharles.Forsyth }
134*37da2899SCharles.Forsyth
135