Home | History | Annotate | Download | only in src
      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 
     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 
    115 extern void HB_TibetanAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
    116 
    117 extern void HB_MyanmarAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
    118 
    119 extern void HB_KhmerAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
    120 
    121 extern void HB_IndicAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
    122 
    123 extern void HB_ThaiAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes);
    124 
    125 typedef struct {
    126     hb_uint32 tag;
    127     hb_uint32 property;
    128 } HB_OpenTypeFeature;
    129 
    130 #define PositioningProperties 0x80000000
    131 
    132 HB_Bool HB_SelectScript(HB_ShaperItem *item, const HB_OpenTypeFeature *features);
    133 
    134 HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties);
    135 HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool doLogClusters);
    136 
    137 void HB_HeuristicPosition(HB_ShaperItem *item);
    138 void 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 
    145 HB_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 
    169 HB_END_HEADER
    170 
    171 #endif
    172