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_PRIVATE_H
26#define HARFBUZZ_SHAPER_PRIVATE_H
27
28HB_BEGIN_HEADER
29
30enum {
31    C_DOTTED_CIRCLE = 0x25CC
32};
33
34typedef enum
35{
36    HB_Combining_BelowLeftAttached       = 200,
37    HB_Combining_BelowAttached           = 202,
38    HB_Combining_BelowRightAttached      = 204,
39    HB_Combining_LeftAttached            = 208,
40    HB_Combining_RightAttached           = 210,
41    HB_Combining_AboveLeftAttached       = 212,
42    HB_Combining_AboveAttached           = 214,
43    HB_Combining_AboveRightAttached      = 216,
44
45    HB_Combining_BelowLeft               = 218,
46    HB_Combining_Below                   = 220,
47    HB_Combining_BelowRight              = 222,
48    HB_Combining_Left                    = 224,
49    HB_Combining_Right                   = 226,
50    HB_Combining_AboveLeft               = 228,
51    HB_Combining_Above                   = 230,
52    HB_Combining_AboveRight              = 232,
53
54    HB_Combining_DoubleBelow             = 233,
55    HB_Combining_DoubleAbove             = 234,
56    HB_Combining_IotaSubscript           = 240
57} HB_CombiningClass;
58
59typedef enum {
60    LocaProperty = 0x1,
61    CcmpProperty = 0x2,
62    InitProperty = 0x4,
63    IsolProperty = 0x8,
64    FinaProperty = 0x10,
65    MediProperty = 0x20,
66    RligProperty = 0x40,
67    CaltProperty = 0x80,
68    LigaProperty = 0x100,
69    DligProperty = 0x200,
70    CswhProperty = 0x400,
71    MsetProperty = 0x800,
72
73    /* used by indic and myanmar shaper */
74    NuktaProperty = 0x8,
75    AkhantProperty = 0x10,
76    RephProperty = 0x20,
77    PreFormProperty = 0x40,
78    BelowFormProperty = 0x80,
79    AboveFormProperty = 0x100,
80    HalfFormProperty = 0x200,
81    PostFormProperty = 0x400,
82    ConjunctFormProperty = 0x800,
83    VattuProperty = 0x1000,
84    PreSubstProperty = 0x2000,
85    BelowSubstProperty = 0x4000,
86    AboveSubstProperty = 0x8000,
87    PostSubstProperty = 0x10000,
88    HalantProperty = 0x20000,
89    CligProperty = 0x40000,
90    IndicCaltProperty = 0x80000
91
92} HB_OpenTypeProperty;
93
94/* return true if ok. */
95typedef HB_Bool (*HB_ShapeFunction)(HB_ShaperItem *shaper_item);
96typedef void (*HB_AttributeFunction)(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
97
98typedef struct {
99    HB_ShapeFunction shape;
100    HB_AttributeFunction charAttributes;
101} HB_ScriptEngine;
102
103extern const HB_ScriptEngine hb_scriptEngines[];
104
105extern HB_Bool HB_BasicShape(HB_ShaperItem *shaper_item);
106extern HB_Bool HB_GreekShape(HB_ShaperItem *shaper_item);
107extern HB_Bool HB_TibetanShape(HB_ShaperItem *shaper_item);
108extern HB_Bool HB_HebrewShape(HB_ShaperItem *shaper_item);
109extern HB_Bool HB_ArabicShape(HB_ShaperItem *shaper_item);
110extern HB_Bool HB_HangulShape(HB_ShaperItem *shaper_item);
111extern HB_Bool HB_MyanmarShape(HB_ShaperItem *shaper_item);
112extern HB_Bool HB_KhmerShape(HB_ShaperItem *shaper_item);
113extern HB_Bool HB_IndicShape(HB_ShaperItem *shaper_item);
114
115extern void HB_TibetanAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
116
117extern void HB_MyanmarAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
118
119extern void HB_KhmerAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
120
121extern void HB_IndicAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
122
123extern void HB_ThaiAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
124
125typedef struct {
126    hb_uint32 tag;
127    hb_uint32 property;
128} HB_OpenTypeFeature;
129
130#define PositioningProperties 0x80000000
131
132HB_Bool HB_SelectScript(HB_ShaperItem *item, const HB_OpenTypeFeature *features);
133
134HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties);
135HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool doLogClusters);
136
137void HB_HeuristicPosition(HB_ShaperItem *item);
138void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item);
139
140#define HB_IsControlChar(uc) \
141    ((uc >= 0x200b && uc <= 0x200f /* ZW Space, ZWNJ, ZWJ, LRM and RLM */) \
142     || (uc >= 0x2028 && uc <= 0x202f /* LS, PS, LRE, RLE, PDF, LRO, RLO, NNBSP */) \
143     || (uc >= 0x206a && uc <= 0x206f /* ISS, ASS, IAFS, AFS, NADS, NODS */))
144
145HB_Bool HB_ConvertStringToGlyphIndices(HB_ShaperItem *shaper_item);
146
147#define HB_GetGlyphAdvances(shaper_item) \
148    shaper_item->font->klass->getGlyphAdvances(shaper_item->font, \
149                                               shaper_item->glyphs, shaper_item->num_glyphs, \
150                                               shaper_item->advances, \
151                                               shaper_item->face->current_flags);
152
153#define HB_DECLARE_STACKARRAY(Type, Name) \
154    Type stack##Name[512]; \
155    Type *Name = stack##Name;
156
157#define HB_INIT_STACKARRAY(Type, Name, Length) \
158    if ((Length) >= 512) \
159        Name = (Type *)malloc((Length) * sizeof(Type));
160
161#define HB_STACKARRAY(Type, Name, Length) \
162    HB_DECLARE_STACKARRAY(Type, Name) \
163    HB_INIT_STACKARRAY(Type, Name, Length)
164
165#define HB_FREE_STACKARRAY(Name) \
166    if (stack##Name != Name) \
167        free(Name);
168
169HB_END_HEADER
170
171#endif
172