1/*
2 *
3 * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
4 *
5 */
6
7#ifndef __ARABICSHAPING_H
8#define __ARABICSHAPING_H
9
10/**
11 * \file
12 * \internal
13 */
14
15#include "LETypes.h"
16#include "OpenTypeTables.h"
17
18U_NAMESPACE_BEGIN
19
20class LEGlyphStorage;
21
22class ArabicShaping /* not : public UObject because all methods are static */ {
23public:
24    // Joining types
25    enum JoiningTypes
26    {
27        JT_NON_JOINING   = 0,
28        JT_JOIN_CAUSING  = 1,
29        JT_DUAL_JOINING  = 2,
30        JT_LEFT_JOINING  = 3,
31        JT_RIGHT_JOINING = 4,
32        JT_TRANSPARENT   = 5,
33        JT_COUNT         = 6
34    };
35
36    // shaping bit masks
37    enum ShapingBitMasks
38    {
39        MASK_SHAPE_RIGHT    = 1, // if this bit set, shapes to right
40        MASK_SHAPE_LEFT     = 2, // if this bit set, shapes to left
41        MASK_TRANSPARENT    = 4, // if this bit set, is transparent (ignore other bits)
42        MASK_NOSHAPE        = 8  // if this bit set, don't shape this char, i.e. tatweel
43    };
44
45    // shaping values
46    enum ShapeTypeValues
47    {
48        ST_NONE         = 0,
49        ST_RIGHT        = MASK_SHAPE_RIGHT,
50        ST_LEFT         = MASK_SHAPE_LEFT,
51        ST_DUAL         = MASK_SHAPE_RIGHT | MASK_SHAPE_LEFT,
52        ST_TRANSPARENT  = MASK_TRANSPARENT,
53        ST_NOSHAPE_DUAL = MASK_NOSHAPE | ST_DUAL,
54        ST_NOSHAPE_NONE = MASK_NOSHAPE
55    };
56
57    typedef le_int32 ShapeType;
58
59    static void shape(const LEUnicode *chars, le_int32 offset, le_int32 charCount, le_int32 charMax,
60                      le_bool rightToLeft, LEGlyphStorage &glyphStorage);
61
62    static const FeatureMap *getFeatureMap(le_int32 &count);
63
64private:
65    // forbid instantiation
66    ArabicShaping();
67
68    static ShapeType getShapeType(LEUnicode c);
69
70    static const le_uint8 shapingTypeTable[];
71    static const size_t   shapingTypeTableLen;
72
73    static const ShapeType shapeTypes[];
74
75    static void adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage);
76};
77
78U_NAMESPACE_END
79#endif
80