Upgrade to latest harfbuzz
[framework/uifw/harfbuzz.git] / contrib / python / lib / harfbuzz.pyx
1 cdef extern from "stdlib.h":
2     ctypedef int size_t
3     void *malloc(size_t size)
4     void free(void* ptr)
5
6 cdef extern from "ft2build.h" :
7     pass
8
9 cdef extern from "freetype/freetype.h" :
10     ctypedef void *FT_Library
11     ctypedef void *FT_Face
12     ctypedef int FT_Error
13
14     FT_Error FT_Init_FreeType (FT_Library *alib)
15     FT_Error FT_Done_FreeType (FT_Library alib)
16     FT_Error FT_Done_Face (FT_Face alib)
17     FT_Error FT_New_Face( FT_Library library, char *path, unsigned long index, FT_Face *aface)
18     FT_Error FT_Set_Char_Size (FT_Face aFace, unsigned int size_x, unsigned int size_y, unsigned int res_x, unsigned int res_y)
19
20 cdef extern from "hb-common.h" :
21     cdef enum hb_direction_t :
22         HB_DIRECTION_LTR
23         HB_DIRECTION_RTL
24         HB_DIRECTION_TTB
25         HB_DIRECTION_BTT
26     ctypedef unsigned long hb_codepoint_t
27     ctypedef long hb_position_t
28     ctypedef unsigned long hb_mask_t
29     ctypedef unsigned long hb_tag_t
30     hb_tag_t hb_tag_from_string (char *s)
31     ctypedef void (*hb_destroy_func_t) (void *user_data)
32
33 cdef extern from "hb-unicode.h" :
34 # there must be a better way of syncing this list with the true source
35     ctypedef enum hb_script_t :
36         HB_SCRIPT_COMMON = 0
37
38 cdef extern from "hb-language.h" :
39     ctypedef void *hb_language_t
40     hb_language_t hb_language_from_string(char *str)
41     char * hb_language_to_string(hb_language_t language)
42
43 cdef extern from "hb-ot-tag.h" :
44     hb_script_t hb_ot_tag_to_script (hb_tag_t tag)
45
46 cdef extern from "hb-buffer.h" :
47     ctypedef struct hb_buffer_t :
48         pass
49
50     ctypedef struct hb_glyph_info_t :
51         hb_codepoint_t codepoint
52         hb_mask_t mask
53         unsigned long cluster
54
55     ctypedef union hb_var_int_t:
56         unsigned long u32
57
58     ctypedef struct hb_glyph_position_t :
59         hb_position_t x_advance
60         hb_position_t y_advance
61         hb_position_t x_offset
62         hb_position_t y_offset
63         hb_var_int_t  var
64
65     hb_buffer_t *hb_buffer_create(unsigned int size)
66     hb_buffer_t *hb_buffer_reference(hb_buffer_t *buffer)
67     unsigned int hb_buffer_get_reference_count(hb_buffer_t *buffer)
68     void hb_buffer_destroy(hb_buffer_t *buffer)
69     void hb_buffer_set_direction(hb_buffer_t *buffer, hb_direction_t direction)
70     hb_direction_t hb_buffer_get_direction(hb_buffer_t *buffer)
71     void hb_buffer_set_script(hb_buffer_t *buffer, hb_script_t script)
72     hb_script_t hb_buffer_get_script(hb_buffer_t *buffer)
73     void hb_buffer_set_language(hb_buffer_t *buffer, hb_language_t language)
74     hb_language_t hb_buffer_get_language(hb_buffer_t *buffer)
75     void hb_buffer_clear(hb_buffer_t *)
76     void hb_buffer_clear_positions(hb_buffer_t *buffer)
77     void hb_buffer_ensure(hb_buffer_t *buffer, unsigned int size)
78     void hb_buffer_reverse(hb_buffer_t *buffer)
79     void hb_buffer_reverse_clusters(hb_buffer_t *buffer)
80     void hb_buffer_add_glyph(hb_buffer_t *buffer, hb_codepoint_t codepoint, hb_mask_t mask, unsigned int cluster)
81     void hb_buffer_add_utf8(hb_buffer_t *buffer, char *text, unsigned int text_length, unsigned int item_offset, unsigned int item_length)
82     unsigned int hb_buffer_get_length(hb_buffer_t *buffer)
83     hb_glyph_info_t *hb_buffer_get_glyph_infos(hb_buffer_t *buffer)
84     hb_glyph_position_t *hb_buffer_get_glyph_positions(hb_buffer_t *buffer)
85
86 cdef extern from "hb-blob.h" :
87     cdef struct hb_blob_t :
88         pass
89 # do I need blob functions here?
90
91 cdef extern from "hb-font.h" :
92     ctypedef struct hb_face_t :
93         pass
94     ctypedef struct hb_font_t :
95         pass
96
97     ctypedef hb_blob_t * (*hb_get_table_func_t) (hb_tag_t tag, void *user_data)
98     hb_face_t * hb_face_create_for_data(hb_blob_t *blob, unsigned int index)
99     hb_face_t * hb_face_create_for_tables(hb_get_table_func_t get_table, hb_destroy_func_t destroy, void *user_data)
100     hb_face_t * hb_face_reference(hb_face_t *face)
101     unsigned int hb_face_get_reference_count(hb_face_t *face)
102     void hb_face_destroy(hb_face_t *face)
103     void hb_font_destroy(hb_font_t *font)
104     hb_blob_t * hb_face_get_table(hb_face_t *face, hb_tag_t tag)
105
106
107 cdef extern from "hb-shape.h" :
108     ctypedef struct hb_feature_t :
109         int tag
110         unsigned int value
111         unsigned int start
112         unsigned int end
113
114     void hb_shape (hb_font_t *font, hb_face_t *face, hb_buffer_t *buffer, hb_feature_t *features, unsigned int num_features)
115
116 cdef extern from "hb-ft.h" :
117     hb_face_t *hb_ft_face_create (FT_Face ft_face, hb_destroy_func_t destroy)
118     hb_font_t *hb_ft_font_create (FT_Face ft_face, hb_destroy_func_t destroy)
119
120 class glyphinfo :
121  
122     def __init__(self, gid, cluster, advance, offset, internal = 0) :
123         self.gid = gid
124         self.cluster = cluster
125         self.advance = advance
126         self.offset = offset
127         self.internal = internal
128
129     def __repr__(self) :
130         res = "{0:d}>{1:d}@({2:.2f},{3:.2f})+({4:.2f},{5:.2f})".format(self.gid, self.cluster, self.offset[0], self.offset[1], self.advance[0], self.advance[1])
131         if self.internal : res += "/i=" + str(self.internal)
132         return res
133
134 cdef class buffer :
135     cdef hb_buffer_t *buffer
136
137     def __init__(self, char *text, unsigned int length) :
138         """Note text must be a utf-8 string and length is number of chars"""
139         self.buffer = hb_buffer_create(length)
140         hb_buffer_add_utf8(self.buffer, text, length, 0, len(text))
141
142     def set_scriptlang(self, char *script, char *lang) :
143         cdef hb_language_t language
144         cdef hb_script_t scriptnum
145
146         language = hb_language_from_string(lang)
147         scriptnum = hb_ot_tag_to_script(hb_tag_from_string(script))
148         hb_buffer_set_script(self.buffer, scriptnum)
149         hb_buffer_set_language(self.buffer, language)
150
151     def get_info(self, scale = 1) :
152         cdef hb_glyph_info_t *infos
153         cdef hb_glyph_position_t *positions
154         cdef unsigned int num
155         cdef unsigned int i
156         res = []
157
158         num = hb_buffer_get_length(self.buffer)
159         infos = hb_buffer_get_glyph_infos(self.buffer)
160         positions = hb_buffer_get_glyph_positions(self.buffer)
161         for 0 <= i < num :
162             temp = glyphinfo(infos[i].codepoint, infos[i].cluster, (positions[i].x_advance / scale, positions[i].y_advance / scale), (positions[i].x_offset / scale, positions[i].y_offset / scale), positions[i].var.u32)
163             res.append(temp)
164         return res
165
166     def get_settings(self) :
167         cdef hb_script_t script
168         cdef hb_language_t lang
169
170         script = hb_buffer_get_script(self.buffer)
171         lang = hb_buffer_get_language(self.buffer)
172         return {'script' : script, 'language' : hb_language_to_string(lang)}
173
174     def __del__(self) :
175         hb_buffer_destroy(self.buffer)
176
177 cdef class ft :
178     cdef FT_Library engine
179     cdef FT_Face face
180     cdef hb_face_t *hbface
181     cdef hb_font_t *hbfont
182
183     def __init__(self, char *fname, size) :
184         cdef FT_Library engine
185         FT_Init_FreeType(&engine)
186         self.engine = engine
187         cdef FT_Face face
188         FT_New_Face(engine, fname, 0, &face)
189         FT_Set_Char_Size(face, size << 6, size << 6, 72, 72)
190         self.face = face
191         self.hbface = hb_ft_face_create(face, <void (*)(void *)>hb_face_destroy)
192         self.hbfont = hb_ft_font_create(face, <void (*)(void *)>hb_font_destroy)
193
194     def __del__(self) :
195         cdef FT_Library engine
196         engine = self.engine
197         cdef FT_Face face
198         face = self.face
199         FT_Done_Face(face)
200         FT_Done_FreeType(engine)
201
202     def shape(self, buffer aBuffer, features = {}) :
203         cdef hb_feature_t *feats
204         cdef hb_feature_t *aFeat
205         feats = <hb_feature_t *>malloc(sizeof(hb_feature_t) * len(features))
206         aFeat = feats
207         for k,v in features.items() :
208             aFeat.tag = hb_tag_from_string (k)
209             aFeat.value = int(v)
210             aFeat.start = 0
211             aFeat.end = -1
212             aFeat += 1
213         hb_shape(self.hbfont, self.hbface, aBuffer.buffer, feats, len(features))
214
215