1 /* 2 * Copyright (C) 2015 The Qt Company Ltd 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 28 HB_BEGIN_HEADER 29 30 enum { 31 C_DOTTED_CIRCLE = 0x25CC 32 }; 33 34 typedef 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 59 typedef 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. */ 95 typedef HB_Bool (*HB_ShapeFunction)(HB_ShaperItem *shaper_item); 96 typedef void (*HB_AttributeFunction)(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); 97 98 typedef struct { 99 HB_ShapeFunction shape; 100 HB_AttributeFunction charAttributes; 101 } HB_ScriptEngine; 102 103 extern const HB_ScriptEngine hb_scriptEngines[]; 104 105 extern HB_Bool HB_BasicShape(HB_ShaperItem *shaper_item); 106 extern HB_Bool HB_GreekShape(HB_ShaperItem *shaper_item); 107 extern HB_Bool HB_TibetanShape(HB_ShaperItem *shaper_item); 108 extern HB_Bool HB_HebrewShape(HB_ShaperItem *shaper_item); 109 extern HB_Bool HB_ArabicShape(HB_ShaperItem *shaper_item); 110 extern HB_Bool HB_HangulShape(HB_ShaperItem *shaper_item); 111 extern HB_Bool HB_MyanmarShape(HB_ShaperItem *shaper_item); 112 extern HB_Bool HB_KhmerShape(HB_ShaperItem *shaper_item); 113 extern HB_Bool HB_IndicShape(HB_ShaperItem *shaper_item); 114 extern HB_Bool HB_ThaiShape(HB_ShaperItem *shaper_item); 115 116 extern void HB_TibetanAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); 117 118 extern void HB_MyanmarAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); 119 120 extern void HB_KhmerAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); 121 122 extern void HB_IndicAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); 123 124 extern void HB_ThaiAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); 125 126 #ifndef NO_OPENTYPE 127 typedef struct { 128 hb_uint32 tag; 129 hb_uint32 property; 130 } HB_OpenTypeFeature; 131 132 #define PositioningProperties 0x80000000 133 134 HB_Bool HB_SelectScript(HB_ShaperItem *item, const HB_OpenTypeFeature *features); 135 136 HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties); 137 HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool doLogClusters); 138 #endif // NO_OPENTYPE 139 140 void HB_HeuristicPosition(HB_ShaperItem *item); 141 void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item); 142 143 #define HB_IsControlChar(uc) \ 144 ((uc >= 0x200b && uc <= 0x200f /* ZW Space, ZWNJ, ZWJ, LRM and RLM */) \ 145 || (uc >= 0x2028 && uc <= 0x202e /* LS, PS, LRE, RLE, PDF, LRO, RLO */) \ 146 || (uc >= 0x206a && uc <= 0x206f /* ISS, ASS, IAFS, AFS, NADS, NODS */)) 147 148 HB_Bool HB_ConvertStringToGlyphIndices(HB_ShaperItem *shaper_item); 149 150 #define HB_GetGlyphAdvances(shaper_item) \ 151 shaper_item->font->klass->getGlyphAdvances(shaper_item->font, \ 152 shaper_item->glyphs, shaper_item->num_glyphs, \ 153 shaper_item->advances, \ 154 shaper_item->face->current_flags); 155 156 #define HB_DECLARE_STACKARRAY(Type, Name) \ 157 Type stack##Name[512]; \ 158 Type *Name = stack##Name; 159 160 #define HB_INIT_STACKARRAY(Type, Name, Length) \ 161 if ((Length) >= 512) \ 162 Name = (Type *)malloc((Length) * sizeof(Type)); 163 164 #define HB_STACKARRAY(Type, Name, Length) \ 165 HB_DECLARE_STACKARRAY(Type, Name) \ 166 HB_INIT_STACKARRAY(Type, Name, Length) 167 168 #define HB_FREE_STACKARRAY(Name) \ 169 if (stack##Name != Name) \ 170 free(Name); 171 172 HB_END_HEADER 173 174 #endif 175