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_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 typedef enum {
     38         HB_Script_Common,
     39         HB_Script_Greek,
     40         HB_Script_Cyrillic,
     41         HB_Script_Armenian,
     42         HB_Script_Hebrew,
     43         HB_Script_Arabic,
     44         HB_Script_Syriac,
     45         HB_Script_Thaana,
     46         HB_Script_Devanagari,
     47         HB_Script_Bengali,
     48         HB_Script_Gurmukhi,
     49         HB_Script_Gujarati,
     50         HB_Script_Oriya,
     51         HB_Script_Tamil,
     52         HB_Script_Telugu,
     53         HB_Script_Kannada,
     54         HB_Script_Malayalam,
     55         HB_Script_Sinhala,
     56         HB_Script_Thai,
     57         HB_Script_Lao,
     58         HB_Script_Tibetan,
     59         HB_Script_Myanmar,
     60         HB_Script_Georgian,
     61         HB_Script_Hangul,
     62         HB_Script_Ogham,
     63         HB_Script_Runic,
     64         HB_Script_Khmer,
     65         HB_Script_Nko,
     66         HB_Script_Inherited,
     67         HB_ScriptCount = HB_Script_Inherited
     68         /*
     69         HB_Script_Latin = Common,
     70         HB_Script_Ethiopic = Common,
     71         HB_Script_Cherokee = Common,
     72         HB_Script_CanadianAboriginal = Common,
     73         HB_Script_Mongolian = Common,
     74         HB_Script_Hiragana = Common,
     75         HB_Script_Katakana = Common,
     76         HB_Script_Bopomofo = Common,
     77         HB_Script_Han = Common,
     78         HB_Script_Yi = Common,
     79         HB_Script_OldItalic = Common,
     80         HB_Script_Gothic = Common,
     81         HB_Script_Deseret = Common,
     82         HB_Script_Tagalog = Common,
     83         HB_Script_Hanunoo = Common,
     84         HB_Script_Buhid = Common,
     85         HB_Script_Tagbanwa = Common,
     86         HB_Script_Limbu = Common,
     87         HB_Script_TaiLe = Common,
     88         HB_Script_LinearB = Common,
     89         HB_Script_Ugaritic = Common,
     90         HB_Script_Shavian = Common,
     91         HB_Script_Osmanya = Common,
     92         HB_Script_Cypriot = Common,
     93         HB_Script_Braille = Common,
     94         HB_Script_Buginese = Common,
     95         HB_Script_Coptic = Common,
     96         HB_Script_NewTaiLue = Common,
     97         HB_Script_Glagolitic = Common,
     98         HB_Script_Tifinagh = Common,
     99         HB_Script_SylotiNagri = Common,
    100         HB_Script_OldPersian = Common,
    101         HB_Script_Kharoshthi = Common,
    102         HB_Script_Balinese = Common,
    103         HB_Script_Cuneiform = Common,
    104         HB_Script_Phoenician = Common,
    105         HB_Script_PhagsPa = Common,
    106         */
    107 } HB_Script;
    108 
    109 typedef struct
    110 {
    111     hb_uint32 pos;
    112     hb_uint32 length;
    113     HB_Script script;
    114     hb_uint8 bidiLevel;
    115 } HB_ScriptItem;
    116 
    117 typedef enum {
    118     HB_NoBreak,
    119     HB_SoftHyphen,
    120     HB_Break,
    121     HB_ForcedBreak
    122 } HB_LineBreakType;
    123 
    124 
    125 typedef struct {
    126     /*HB_LineBreakType*/ unsigned lineBreakType  :2;
    127     /*HB_Bool*/ unsigned whiteSpace              :1;     /* A unicode whitespace character, except NBSP, ZWNBSP */
    128     /*HB_Bool*/ unsigned charStop                :1;     /* Valid cursor position (for left/right arrow) */
    129     /*HB_Bool*/ unsigned wordBoundary            :1;
    130     /*HB_Bool*/ unsigned sentenceBoundary        :1;
    131     unsigned unused                  :2;
    132 } HB_CharAttributes;
    133 
    134 void HB_GetCharAttributes(const HB_UChar16 *string, hb_uint32 stringLength,
    135                           const HB_ScriptItem *items, hb_uint32 numItems,
    136                           HB_CharAttributes *attributes);
    137 
    138 /* requires HB_GetCharAttributes to be called before */
    139 void HB_GetWordBoundaries(const HB_UChar16 *string, hb_uint32 stringLength,
    140                           const HB_ScriptItem *items, hb_uint32 numItems,
    141                           HB_CharAttributes *attributes);
    142 
    143 /* requires HB_GetCharAttributes to be called before */
    144 void HB_GetSentenceBoundaries(const HB_UChar16 *string, hb_uint32 stringLength,
    145                               const HB_ScriptItem *items, hb_uint32 numItems,
    146                               HB_CharAttributes *attributes);
    147 
    148 
    149 typedef enum {
    150     HB_LeftToRight = 0,
    151     HB_RightToLeft = 1
    152 } HB_StringToGlyphsFlags;
    153 
    154 typedef enum {
    155     HB_ShaperFlag_Default = 0,
    156     HB_ShaperFlag_NoKerning = 1,
    157     HB_ShaperFlag_UseDesignMetrics = 1 << 1,
    158     /* Arabic vowels in some fonts (Times New Roman, at least) have
    159        non-zero advances, when they should be zero.  Setting this shaper
    160        flag causes us to zero out the advances for mark glyphs. */
    161     HB_ShaperFlag_ForceMarksToZeroWidth = 1 << 2
    162 } HB_ShaperFlag;
    163 
    164 /*
    165    highest value means highest priority for justification. Justification is done by first inserting kashidas
    166    starting with the highest priority positions, then stretching spaces, afterwards extending inter char
    167    spacing, and last spacing between arabic words.
    168    NoJustification is for example set for arabic where no Kashida can be inserted or for diacritics.
    169 */
    170 typedef enum {
    171     HB_NoJustification= 0,   /* Justification can't be applied after this glyph */
    172     HB_Arabic_Space   = 1,   /* This glyph represents a space inside arabic text */
    173     HB_Character      = 2,   /* Inter-character justification point follows this glyph */
    174     HB_Space          = 4,   /* This glyph represents a blank outside an Arabic run */
    175     HB_Arabic_Normal  = 7,   /* Normal Middle-Of-Word glyph that connects to the right (begin) */
    176     HB_Arabic_Waw     = 8,   /* Next character is final form of Waw/Ain/Qaf/Fa */
    177     HB_Arabic_BaRa    = 9,   /* Next two chars are Ba + Ra/Ya/AlefMaksura */
    178     HB_Arabic_Alef    = 10,  /* Next character is final form of Alef/Tah/Lam/Kaf/Gaf */
    179     HB_Arabic_HaaDal  = 11,  /* Next character is final form of Haa/Dal/Taa Marbutah */
    180     HB_Arabic_Seen    = 12,  /* Initial or Medial form Of Seen/Sad */
    181     HB_Arabic_Kashida = 13   /* Kashida(U+640) in middle of word */
    182 } HB_JustificationClass;
    183 
    184 /* This structure is binary compatible with Uniscribe's SCRIPT_VISATTR. Would be nice to keep
    185  * it like that. If this is a problem please tell Trolltech :)
    186  */
    187 typedef struct {
    188     unsigned justification   :4;  /* Justification class */
    189     unsigned clusterStart    :1;  /* First glyph of representation of cluster */
    190     unsigned mark            :1;  /* needs to be positioned around base char */
    191     unsigned zeroWidth       :1;  /* ZWJ, ZWNJ etc, with no width */
    192     unsigned dontPrint       :1;
    193     unsigned combiningClass  :8;
    194 } HB_GlyphAttributes;
    195 
    196 typedef struct HB_FaceRec_ {
    197     HB_Bool isSymbolFont;
    198 
    199     HB_GDEF gdef;
    200     HB_GSUB gsub;
    201     HB_GPOS gpos;
    202     HB_Bool supported_scripts[HB_ScriptCount];
    203     HB_Buffer buffer;
    204     HB_Script current_script;
    205     int current_flags; /* HB_ShaperFlags */
    206     HB_Bool has_opentype_kerning;
    207     HB_Bool glyphs_substituted;
    208     HB_GlyphAttributes *tmpAttributes;
    209     unsigned int *tmpLogClusters;
    210     int length;
    211     int orig_nglyphs;
    212 } HB_FaceRec;
    213 
    214 typedef HB_Error (*HB_GetFontTableFunc)(void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length);
    215 
    216 HB_Face HB_NewFace(void *font, HB_GetFontTableFunc tableFunc);
    217 void HB_FreeFace(HB_Face face);
    218 
    219 typedef struct {
    220     HB_Fixed x, y;
    221     HB_Fixed width, height;
    222     HB_Fixed xOffset, yOffset;
    223 } HB_GlyphMetrics;
    224 
    225 typedef enum {
    226     HB_FontAscent
    227 } HB_FontMetric;
    228 
    229 typedef struct {
    230     HB_Bool  (*convertStringToGlyphIndices)(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool rightToLeft);
    231     void     (*getGlyphAdvances)(HB_Font font, const HB_Glyph *glyphs, hb_uint32 numGlyphs, HB_Fixed *advances, int flags /*HB_ShaperFlag*/);
    232     HB_Bool  (*canRender)(HB_Font font, const HB_UChar16 *string, hb_uint32 length);
    233     /* implementation needs to make sure to load a scaled glyph, so /no/ FT_LOAD_NO_SCALE */
    234     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);
    235     void     (*getGlyphMetrics)(HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *metrics);
    236     HB_Fixed (*getFontMetric)(HB_Font font, HB_FontMetric metric);
    237 } HB_FontClass;
    238 
    239 typedef struct HB_Font_ {
    240     const HB_FontClass *klass;
    241 
    242     /* Metrics */
    243     HB_UShort x_ppem, y_ppem;
    244     HB_16Dot16 x_scale, y_scale;
    245 
    246     void *userData;
    247 } HB_FontRec;
    248 
    249 typedef struct HB_ShaperItem_ HB_ShaperItem;
    250 
    251 struct HB_ShaperItem_ {
    252     const HB_UChar16 *string;               /* input: the Unicode UTF16 text to be shaped */
    253     hb_uint32 stringLength;                 /* input: the length of the input in 16-bit words */
    254     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> */
    255     HB_Font font;                           /* input: the font: scale, units and function pointers supplying glyph indices and metrics */
    256     HB_Face face;                           /* input: the shaper state; current script, access to the OpenType tables , etc. */
    257     int shaperFlags;                        /* input (unused) should be set to 0; intended to support flags defined in HB_ShaperFlag */
    258     HB_Bool glyphIndicesPresent;            /* input: true if the <glyphs> array contains glyph indices ready to be shaped */
    259     hb_uint32 initialGlyphCount;            /* input: if glyphIndicesPresent is true, the number of glyph indices in the <glyphs> array */
    260 
    261     hb_uint32 num_glyphs;                   /* input: capacity of output arrays <glyphs>, <attributes>, <advances>, <offsets>, and <log_clusters>; */
    262                                             /* output: required capacity (may be larger than actual capacity) */
    263 
    264     HB_Glyph *glyphs;                       /* output: <num_glyphs> indices of shaped glyphs */
    265     HB_GlyphAttributes *attributes;         /* output: <num_glyphs> glyph attributes */
    266     HB_Fixed *advances;                     /* output: <num_glyphs> advances */
    267     HB_FixedPoint *offsets;                 /* output: <num_glyphs> offsets */
    268     unsigned short *log_clusters;           /* output: for each output glyph, the index in the input of the start of its logical cluster */
    269 
    270     /* internal */
    271     HB_Bool kerning_applied;                /* output: true if kerning was applied by the shaper */
    272 };
    273 
    274 HB_Bool HB_ShapeItem(HB_ShaperItem *item);
    275 
    276 HB_END_HEADER
    277 
    278 #endif
    279