Imported Upstream version 0.9.12
[platform/upstream/harfbuzz.git] / src / hb-old / harfbuzz-shaper.h
1 /*
2  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
3  *
4  * This is part of HarfBuzz, an OpenType Layout engine library.
5  *
6  * Permission is hereby granted, without written agreement and without
7  * license or royalty fees, to use, copy, modify, and distribute this
8  * software and its documentation for any purpose, provided that the
9  * above copyright notice and the following two paragraphs appear in
10  * all copies of this software.
11  *
12  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16  * DAMAGE.
17  *
18  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23  */
24
25 #ifndef HARFBUZZ_SHAPER_H
26 #define HARFBUZZ_SHAPER_H
27
28 #include "harfbuzz-global.h"
29 #include "harfbuzz-gdef.h"
30 #include "harfbuzz-gpos.h"
31 #include "harfbuzz-gsub.h"
32 #include "harfbuzz-external.h"
33 #include "harfbuzz-stream-private.h"
34
35 HB_BEGIN_HEADER
36
37 #ifdef HB_USE_PACKED_STRUCTS
38 #pragma pack(push, 1)
39 #endif
40
41 /*
42    using anything else than signed or unsigned for bitfields in C is non standard,
43    but accepted by almost all compilers. And it gives a significant reduction in
44    memory consumption as HB_CharAttributes and HB_GlyphAttributes will not have
45    a 4 byte alignment
46 */
47 #ifdef  __xlC__
48 typedef unsigned hb_bitfield;
49 #else
50 typedef hb_uint8 hb_bitfield;
51 #endif
52
53 typedef enum {
54         HB_Script_Common,
55         HB_Script_Greek,
56         HB_Script_Cyrillic,
57         HB_Script_Armenian,
58         HB_Script_Hebrew,
59         HB_Script_Arabic,
60         HB_Script_Syriac,
61         HB_Script_Thaana,
62         HB_Script_Devanagari,
63         HB_Script_Bengali,
64         HB_Script_Gurmukhi,
65         HB_Script_Gujarati,
66         HB_Script_Oriya,
67         HB_Script_Tamil,
68         HB_Script_Telugu,
69         HB_Script_Kannada,
70         HB_Script_Malayalam,
71         HB_Script_Sinhala,
72         HB_Script_Thai,
73         HB_Script_Lao,
74         HB_Script_Tibetan,
75         HB_Script_Myanmar,
76         HB_Script_Georgian,
77         HB_Script_Hangul,
78         HB_Script_Ogham,
79         HB_Script_Runic,
80         HB_Script_Khmer,
81         HB_Script_Nko,
82         HB_Script_Inherited,
83         HB_ScriptCount = HB_Script_Inherited
84         /*
85         HB_Script_Latin = Common,
86         HB_Script_Ethiopic = Common,
87         HB_Script_Cherokee = Common,
88         HB_Script_CanadianAboriginal = Common,
89         HB_Script_Mongolian = Common,
90         HB_Script_Hiragana = Common,
91         HB_Script_Katakana = Common,
92         HB_Script_Bopomofo = Common,
93         HB_Script_Han = Common,
94         HB_Script_Yi = Common,
95         HB_Script_OldItalic = Common,
96         HB_Script_Gothic = Common,
97         HB_Script_Deseret = Common,
98         HB_Script_Tagalog = Common,
99         HB_Script_Hanunoo = Common,
100         HB_Script_Buhid = Common,
101         HB_Script_Tagbanwa = Common,
102         HB_Script_Limbu = Common,
103         HB_Script_TaiLe = Common,
104         HB_Script_LinearB = Common,
105         HB_Script_Ugaritic = Common,
106         HB_Script_Shavian = Common,
107         HB_Script_Osmanya = Common,
108         HB_Script_Cypriot = Common,
109         HB_Script_Braille = Common,
110         HB_Script_Buginese = Common,
111         HB_Script_Coptic = Common,
112         HB_Script_NewTaiLue = Common,
113         HB_Script_Glagolitic = Common,
114         HB_Script_Tifinagh = Common,
115         HB_Script_SylotiNagri = Common,
116         HB_Script_OldPersian = Common,
117         HB_Script_Kharoshthi = Common,
118         HB_Script_Balinese = Common,
119         HB_Script_Cuneiform = Common,
120         HB_Script_Phoenician = Common,
121         HB_Script_PhagsPa = Common,
122         */
123 } HB_Script;
124
125 typedef struct
126 {
127     hb_uint32 pos;
128     hb_uint32 length;
129     HB_Script script;
130     hb_uint8 bidiLevel;
131 } HB_ScriptItem;
132
133
134 typedef enum {
135     HB_LeftToRight = 0,
136     HB_RightToLeft = 1
137 } HB_StringToGlyphsFlags;
138
139 typedef enum {
140     HB_ShaperFlag_Default = 0,
141     HB_ShaperFlag_NoKerning = 1,
142     HB_ShaperFlag_UseDesignMetrics = 2
143 } HB_ShaperFlag;
144
145 /* 
146    highest value means highest priority for justification. Justification is done by first inserting kashidas
147    starting with the highest priority positions, then stretching spaces, afterwards extending inter char
148    spacing, and last spacing between arabic words.
149    NoJustification is for example set for arabic where no Kashida can be inserted or for diacritics.
150 */
151 typedef enum {
152     HB_NoJustification= 0,   /* Justification can't be applied after this glyph */
153     HB_Arabic_Space   = 1,   /* This glyph represents a space inside arabic text */
154     HB_Character      = 2,   /* Inter-character justification point follows this glyph */
155     HB_Space          = 4,   /* This glyph represents a blank outside an Arabic run */
156     HB_Arabic_Normal  = 7,   /* Normal Middle-Of-Word glyph that connects to the right (begin) */
157     HB_Arabic_Waw     = 8,   /* Next character is final form of Waw/Ain/Qaf/Fa */
158     HB_Arabic_BaRa    = 9,   /* Next two chars are Ba + Ra/Ya/AlefMaksura */
159     HB_Arabic_Alef    = 10,  /* Next character is final form of Alef/Tah/Lam/Kaf/Gaf */
160     HB_Arabic_HaaDal  = 11,  /* Next character is final form of Haa/Dal/Taa Marbutah */
161     HB_Arabic_Seen    = 12,  /* Initial or Medial form Of Seen/Sad */
162     HB_Arabic_Kashida = 13   /* Kashida(U+640) in middle of word */
163 } HB_JustificationClass;
164
165 /* This structure is binary compatible with Uniscribe's SCRIPT_VISATTR. Would be nice to keep
166  * it like that. If this is a problem please tell Trolltech :)
167  */
168 typedef struct {
169     hb_bitfield justification   :4;  /* Justification class */
170     hb_bitfield clusterStart    :1;  /* First glyph of representation of cluster */
171     hb_bitfield mark            :1;  /* needs to be positioned around base char */
172     hb_bitfield zeroWidth       :1;  /* ZWJ, ZWNJ etc, with no width */
173     hb_bitfield dontPrint       :1;
174     hb_bitfield combiningClass  :8;
175 } HB_GlyphAttributes;
176
177 typedef struct HB_FaceRec_ {
178     HB_Bool isSymbolFont;
179
180     HB_GDEF gdef;
181     HB_GSUB gsub;
182     HB_GPOS gpos;
183     HB_Bool supported_scripts[HB_ScriptCount];
184     HB_Buffer buffer;
185     HB_Script current_script;
186     int current_flags; /* HB_ShaperFlags */
187     HB_Bool has_opentype_kerning;
188     HB_Bool glyphs_substituted;
189     HB_GlyphAttributes *tmpAttributes;
190     unsigned int *tmpLogClusters;
191     int length;
192     int orig_nglyphs;
193 } HB_FaceRec;
194
195 typedef HB_Error (*HB_GetFontTableFunc)(void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length);
196
197 HB_Face HB_NewFace(void *font, HB_GetFontTableFunc tableFunc);
198 void HB_FreeFace(HB_Face face);
199
200 typedef struct {
201     HB_Fixed x, y;
202     HB_Fixed width, height;
203     HB_Fixed xOffset, yOffset;
204 } HB_GlyphMetrics;
205
206 typedef enum {
207     HB_FontAscent
208 } HB_FontMetric;
209
210 typedef struct {
211     HB_Bool  (*convertStringToGlyphIndices)(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool rightToLeft);
212     void     (*getGlyphAdvances)(HB_Font font, const HB_Glyph *glyphs, hb_uint32 numGlyphs, HB_Fixed *advances, int flags /*HB_ShaperFlag*/);
213     HB_Bool  (*canRender)(HB_Font font, const HB_UChar16 *string, hb_uint32 length);
214     /* implementation needs to make sure to load a scaled glyph, so /no/ FT_LOAD_NO_SCALE */
215     HB_Error (*getPointInOutline)(HB_Font font, HB_Glyph glyph, int flags /*HB_ShaperFlag*/, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints);
216     void     (*getGlyphMetrics)(HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *metrics);
217     HB_Fixed (*getFontMetric)(HB_Font font, HB_FontMetric metric);
218 } HB_FontClass;
219
220 typedef struct HB_Font_ {
221     const HB_FontClass *klass;
222
223     /* Metrics */
224     HB_UShort x_ppem, y_ppem;
225     HB_16Dot16 x_scale, y_scale;
226
227     void *userData;
228 } HB_FontRec;
229
230 #ifdef HB_USE_PACKED_STRUCTS
231 #pragma pack(pop)
232 #endif
233
234 typedef struct HB_ShaperItem_ HB_ShaperItem;
235
236 struct HB_ShaperItem_ {
237     const HB_UChar16 *string;               /* input: the Unicode UTF16 text to be shaped */
238     hb_uint32 stringLength;                 /* input: the length of the input in 16-bit words */
239     HB_ScriptItem item;                     /* input: the current run to be shaped: a run of text all in the same script that is a substring of <string> */
240     HB_Font font;                           /* input: the font: scale, units and function pointers supplying glyph indices and metrics */
241     HB_Face face;                           /* input: the shaper state; current script, access to the OpenType tables , etc. */
242     int shaperFlags;                        /* input (unused) should be set to 0; intended to support flags defined in HB_ShaperFlag */
243     HB_Bool glyphIndicesPresent;            /* input: true if the <glyphs> array contains glyph indices ready to be shaped */
244     hb_uint32 initialGlyphCount;            /* input: if glyphIndicesPresent is true, the number of glyph indices in the <glyphs> array */
245
246     hb_uint32 num_glyphs;                   /* input: capacity of output arrays <glyphs>, <attributes>, <advances>, <offsets>, and <log_clusters>; */
247                                             /* output: required capacity (may be larger than actual capacity) */
248
249     HB_Glyph *glyphs;                       /* output: <num_glyphs> indices of shaped glyphs */
250     HB_GlyphAttributes *attributes;         /* output: <num_glyphs> glyph attributes */
251     HB_Fixed *advances;                     /* output: <num_glyphs> advances */
252     HB_FixedPoint *offsets;                 /* output: <num_glyphs> offsets */
253     unsigned short *log_clusters;           /* output: for each output glyph, the index in the input of the start of its logical cluster */
254     /* XXX the discription for log_clusters is wrong.  It maps each input position to output glyph position! */
255
256     /* internal */
257     HB_Bool kerning_applied;                /* output: true if kerning was applied by the shaper */
258 };
259
260 HB_Bool HB_ShapeItem(HB_ShaperItem *item);
261
262 HB_END_HEADER
263
264 #endif