]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/tools/misc/src/com/ibm/icu/dev/tool/layout/ArabicShaping.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / tools / misc / src / com / ibm / icu / dev / tool / layout / ArabicShaping.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1998-2004, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  *\r
7  * Created on Dec 3, 2003\r
8  *\r
9  *******************************************************************************\r
10  */\r
11 package com.ibm.icu.dev.tool.layout;\r
12 \r
13 import com.ibm.icu.lang.UCharacter;\r
14 import com.ibm.icu.lang.UProperty;\r
15 \r
16 public class ArabicShaping {\r
17 \r
18     // arabic   shaping type code\r
19 \r
20     // shaping bit masks\r
21     static final int MASK_SHAPE_RIGHT   = 1; // if this bit set, shapes to right\r
22     static final int MASK_SHAPE_LEFT = 2;   // if this bit set, shapes to left\r
23     static final int MASK_TRANSPARENT   = 4; // if this bit set, is transparent (ignore other bits)\r
24     static final int MASK_NOSHAPE   = 8; // if this bit set, don't shape this char, i.e. tatweel\r
25 \r
26     // shaping values\r
27     public static final int VALUE_NONE = 0;\r
28     public static final int VALUE_RIGHT = MASK_SHAPE_RIGHT;\r
29     public static final int VALUE_LEFT = MASK_SHAPE_LEFT;\r
30     public static final int VALUE_DUAL = MASK_SHAPE_RIGHT | MASK_SHAPE_LEFT;\r
31     public static final int VALUE_TRANSPARENT = MASK_TRANSPARENT;\r
32     public static final int VALUE_NOSHAPE_DUAL = MASK_NOSHAPE | VALUE_DUAL;\r
33     public static final int VALUE_NOSHAPE_NONE = MASK_NOSHAPE;\r
34 \r
35     public static int getShapeType(char ch)\r
36     {\r
37         int tt = UCharacter.getIntPropertyValue(ch, UProperty.JOINING_TYPE);\r
38         \r
39         switch(tt) {\r
40             case UCharacter.JoiningType.JOIN_CAUSING:\r
41                 return VALUE_NOSHAPE_DUAL;\r
42                 \r
43             case UCharacter.JoiningType.LEFT_JOINING:\r
44                 return VALUE_LEFT;\r
45             \r
46             case UCharacter.JoiningType.RIGHT_JOINING:\r
47                 return VALUE_RIGHT;\r
48             \r
49             case UCharacter.JoiningType.DUAL_JOINING:\r
50                 return VALUE_DUAL;\r
51             \r
52             case UCharacter.JoiningType.TRANSPARENT:\r
53                 return VALUE_TRANSPARENT;\r
54                 \r
55             case UCharacter.JoiningType.NON_JOINING:\r
56             default:\r
57                 return VALUE_NOSHAPE_NONE;                \r
58         }\r
59     }\r
60 \r
61     /*\r
62      * Chars in logical order.\r
63      * leftType is shaping code of char to logical left of range\r
64      * rightType is shaping code of char to logical right of range\r
65      */\r
66 \r
67     public static void shape(char[] chars, int leftType, int rightType, ClassTable isolClassTable) {\r
68         // iterate in logical order from left to right\r
69         //\r
70         // the effective right char is the most recently encountered\r
71         // non-transparent char\r
72         //\r
73         // four boolean states:\r
74         //   the effective right char shapes\r
75         //   the effective right char causes right shaping\r
76         //   the current char shapes\r
77         //   the current char causes left shaping\r
78         //\r
79         // if both cause shaping, then\r
80         //   right += 2 (isolate to initial, or final to medial)\r
81         //   cur += 1 (isolate to final)\r
82 \r
83         // ern is effective right logical index\r
84         int ern = -1;\r
85 \r
86         boolean rightShapes = false;\r
87         boolean rightCauses = (rightType & MASK_SHAPE_LEFT) != 0;\r
88 \r
89         for (int n = 0; n < chars.length; n++) {\r
90             char c = chars[n];\r
91             int t = getShapeType(c);\r
92 \r
93             if ((t & MASK_TRANSPARENT) != 0) {\r
94                 continue;\r
95             }\r
96 \r
97             boolean curShapes = (t & MASK_NOSHAPE) == 0;\r
98             boolean curCauses = (t & MASK_SHAPE_RIGHT) != 0;\r
99 \r
100             if (rightCauses && curCauses) {\r
101                 if (rightShapes) {\r
102                     chars[ern] += 2;\r
103                 }\r
104 \r
105                 if (curShapes) {\r
106                     chars[n] = (char) (isolClassTable.getGlyphClassID(c) + 1);\r
107                 }\r
108             } else {\r
109                 if (curShapes) {\r
110                     chars[n] = (char) isolClassTable.getGlyphClassID(c);\r
111                 }\r
112             }\r
113 \r
114             rightShapes = curShapes;\r
115             rightCauses = (t & MASK_SHAPE_LEFT) != 0;\r
116             ern = n;\r
117         }\r
118 \r
119         if (rightShapes && rightCauses && (leftType & MASK_SHAPE_RIGHT) != 0) {\r
120             chars[ern] += 2;\r
121         }\r
122     }\r
123 }\r