1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Ilya S. Okomin
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @version $Revision$
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.awt.font;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The Class NumericShaper provides methods to convert latin character codes
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to unicode character codes.
29f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * For tables of the character codes used,
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * see <a href="http://www.unicode.org/Public/UNIDATA/">unicode.org</a>.
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic final class NumericShaper implements Serializable {
33f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant serialVersionUID. */
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = -8022764705923730308L;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /**
38f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * The Constant EUROPEAN indicates the latin and extended range,
39f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * and latin decimal base.
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int EUROPEAN = 1;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant ARABIC indicates the ARABIC range and decimal base. */
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int ARABIC = 2;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
46f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /**
47f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * The Constant EASTERN_ARABIC indicates the ARABIC range and
48f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * ARABIC_EXTENDED decimal base.
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int EASTERN_ARABIC = 4;
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
52f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /**
53f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * The Constant DEVANAGARI indicates the DEVANAGARI range and
54f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * decimal base.
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int DEVANAGARI = 8;
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant BENGALI indicates the BENGALI range and decimal base. */
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int BENGALI = 16;
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant GURMUKHI indicates the GURMUKHI range and decimal base. */
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int GURMUKHI = 32;
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant GUJARATI indicates the GUJARATI range and decimal base. */
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int GUJARATI = 64;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant ORIYA indicates the ORIYA range and decimal base. */
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int ORIYA = 128;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant TAMIL indicates the TAMIL range and decimal base. */
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int TAMIL = 256;
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant TELUGU indicates the TELUGU range and decimal base. */
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int TELUGU = 512;
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant KANNADA indicates the KANNADA range and decimal base. */
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int KANNADA = 1024;
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
79f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /**
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The Constant MALAYALAM indicates the MALAYALAM range and decimal base.
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int MALAYALAM = 2048;
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant THAI indicates the THAI range and decimal base. */
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int THAI = 4096;
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant LAO indicates the LAO range and decimal base. */
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int LAO = 8192;
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant TIBETAN indicates the TIBETAN range and decimal base. */
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int TIBETAN = 16384;
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant MYANMAR indicates the MYANMAR range and decimal base. */
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int MYANMAR = 32768;
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
96f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /**
97f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * The Constant ETHIOPIC indicates the ETHIOPIC range and decimal base.
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int ETHIOPIC = 65536;
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant KHMER indicates the KHMER range and decimal base. */
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int KHMER = 131072;
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
104f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /**
105f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * The Constant MONGOLIAN indicates the MONGOLIAN range and
106f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * decimal base.
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int MONGOLIAN = 262144;
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant ALL_RANGES indicates all ranges. */
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int ALL_RANGES = 524287;
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /* Further one can find the set of script indices.
114f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Index is the power you need the 2 to raise to to get corresponding
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * range constant value. Also script ranges, context names and digits low
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ranges are indexed with these indices.
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
119f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the EUROPEAN range
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_EUROPEAN. */
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_EUROPEAN = 0;
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the ARABIC range
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_ARABIC. */
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_ARABIC = 1;
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the EASTERN_ARABIC range
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_EASTERN_ARABIC. */
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_EASTERN_ARABIC = 2;
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
131f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the DEVANAGARI range
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_DEVANAGARI. */
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_DEVANAGARI = 3;
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
135f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the BENGALI range
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_BENGALI. */
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_BENGALI = 4;
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the GURMUKHI range
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_GURMUKHI. */
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_GURMUKHI = 5;
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the GUJARTI range
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_GUJARATI. */
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_GUJARATI = 6;
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
147f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the ORIYA range
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_ORIYA. */
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_ORIYA = 7;
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
151f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the TAMIL range
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_TAMIL. */
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_TAMIL = 8;
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
155f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the TELUGU range
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_TELUGU. */
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_TELUGU = 9;
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
159f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the KANNADA range
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_KANNADA. */
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_KANNADA = 10;
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
163f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the MALAYALAM range
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_MALAYALAM. */
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_MALAYALAM = 11;
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
167f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the THAI range
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_THAI. */
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_THAI = 12;
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
171f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the LAO range
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_LAO. */
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_LAO = 13;
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
175f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the TIBETAN range
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_TIBETAN. */
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_TIBETAN = 14;
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
179f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the MYANMAR range
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_MYANMAR. */
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_MYANMAR = 15;
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
183f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the ETHIOPIC range
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_ETHIOPIC. */
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_ETHIOPIC = 16;
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
187f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the KHMER range
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_KHMER. */
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_KHMER = 17;
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
191f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    // Index of the MONGOLIAN range
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant INDEX_MONGOLIAN. */
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_MONGOLIAN = 18;
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Maximum index that range can't exceed
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant MAX_INDEX. */
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int MAX_INDEX = 19;
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Scripts ranges array. Array represents ranges as pairs of
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * lowest and highest range bounds.
202f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Data is taken from the UnicodeData.txt file from
203f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * http://www.unicode.org/Public/UNIDATA/
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The scripts ranges. */
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final int[] scriptsRanges = {
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0000, 0x024F,     // EUROPEAN (basic latin + latin-1 + extended)
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0600, 0x06FF,     // ARABIC
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0600, 0x06FF,     // EASTERN_ARABIC (XXX: diff with ARABIC ? )
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0900, 0x097F,     // DEVANAGARI
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0980, 0x09FF,     // BENGALI
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0A00, 0x0A7F,     // GURMUKHI
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0A80, 0x0AFF,     // GUJARATI
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0B00, 0x0B7F,     // ORIYA
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0B80, 0x0BFF,     // TAMIL
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0C00, 0x0C7F,     // TELUGU
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0C80, 0x0CFF,     // KANNADA
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0D00, 0x0D7F,     // MALAYALAM
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0E00, 0x0E7F,     // THAI
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0E80, 0x0EFF,     // LAO
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0F00, 0x0FFF,     // TIBETAN
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x1000, 0x109F,     // MYANMAR
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x1200, 0x137F,     // ETHIOPIC
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x1780, 0x17FF,     // KHMER
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x1800, 0x18AF      // MONGOLIAN
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
229f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Digit low ranges values decreased by 0x0030. Each low range
230f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * value decreased by 0x0030 for easy obtaing unicode value of the
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * context dependent digit. European digits starts from 0x0030 hence
232f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * context dependent unicode digit value equals to
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *      digitsLowRanges[script index] + european digit char unicode value.
234f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * !! the only exception is ETHIOPIC script where there is no '0' digit
235f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Data is taken from the UnicodeData.txt file from
236f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * http://www.unicode.org/Public/UNIDATA/
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The digits low ranges. */
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final int[] digitsLowRanges = {
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0000,             // EUROPEAN
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0630,             // ARABIC
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0630,             // EASTERN_ARABIC
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0936,             // DEVANAGARI
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x09B6,             // BENGALI
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0A36,             // GURMUKHI
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0AB6,             // GUJARATI
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0B36,             // ORIYA
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0BB6,             // TAMIL
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0C36,             // TELUGU
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0CB6,             // KANNADA
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0D36,             // MALAYALAM
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0E20,             // THAI
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0EA0,             // LAO
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x0EF0,             // TIBETAN
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x1010,             // MYANMAR
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x1338,             // ETHIOPIC - (low range-1) no ETHIOPIC '0' DIGIT!
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x17B0,             // KHMER
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0x17E0              // MONGOLIAN
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Set of context names used in toString method
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The contexts. */
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String[] contexts = {
264f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "EUROPEAN",
265f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "ARABIC",
266f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "EASTERN_ARABIC",
267f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "DEVANAGARI",
268f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "BENGALI",
269f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "GURMUKHI",
270f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "GUJARATI",
271f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "ORIYA",
272f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "TAMIL",
273f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "TELUGU",
274f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "KANNADA",
275f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "MALAYALAM",
276f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "THAI",
277f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "LAO",
278f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "TIBETAN",
279f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "MYANMAR",
280f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "ETHIOPIC",
281f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "KHMER",
282f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            "MONGOLIAN"
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
286f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Strong characters flags array is to determine if the
287f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * unicode bidirectional category of the character is strong,
288f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * according to Unicode specification. If the bit with index equals to
289f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * character's unicode value is 1 - the character is strong.
290f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * This array was generated using UnicodeData.txt file from
291f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * http://www.unicode.org/Public/UNIDATA/
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The Constant STRONG_TEXT_FLAGS. */
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int[] STRONG_TEXT_FLAGS = { 0, 0, 134217726, 134217726,
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 69207040, -8388609, -8388609, -1, -1, -1, -1, -1, -1, -1, -1,
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1, -1, -65533, -1, -1, -100663297, 196611, 16415, 0, 0, 0,
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            67108864, -10432, -5, -32769, -4194305, -1, -1, -1, -1, -1017, -1,
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -32769, 67108863, 65535, -131072, -25165825, -2, 767, 1073741824,
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -65463, 2033663, -939513841, 134217726, 2047, -73728, -1, -1,
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            541065215, -67059616, -180225, 65535, -8192, 16383, -1, 131135, 0,
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -469762049, -16703999, 537001971,
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -417812, -473563649, -1333765759, 133431235, -423960, -1016201729,
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            1577058305, 1900480, -278552, -470942209, 72193, 65475, -417812,
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            1676541439, -1333782143, 262083, -700594200, -1006647528, 8396230,
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            524224, -139282, 66059775, 30, 65475, -139284, -470811137,
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            1080036831, 65475, -139284, -1006633473, 8396225, 65475, -58720276,
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            805044223, -16547713, 1835008, -2, 917503, 268402815, 0, -17816170,
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            537783470, 872349791, 0, -50331649, -1050673153, -257, -2147481601,
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            3872, -1073741824, 237503, 0, -1, 16914171, 16777215, 0, 0, -1,
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -65473, 536870911, -1, -1, -2080374785, -1, -1, -249, -1, 67108863,
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1, -1, 1031749119, -1, -49665, 2134769663, -8388803, -1,
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -12713985, -1, 134217727, 536870911, 65535, -1, -1, 2097151, -2,
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1, 8388607, 134217726, -1, -1, 131071, 253951, 6553599, 262143,
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            122879, -1, -1065353217, 401605055, 1023, 67043328, -1, -1,
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            16777215, -1, 511, 0, 0, 536870911, 33226872, -64, 2047999, -1,
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -64513, 67044351, 0, -830472193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, 0, 0,
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1, -1, -1, -1, 268435455, -1, -1, 67108863, 1061158911, -1,
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1426112705, 1073741823, -1, 1608515583, 265232348, 534519807,
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            49152, 27648, 0, -2147352576, 2031616, 0, 0, 0, 1043332228,
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -201605808, 992, -1, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -4194304, -1, 134217727, 2097152, 0, 0, 0, 0, 0, 0, 0, -268435456,
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1, -1, 1023, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4096, 0, 0, 0,
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0,
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -32769, 2147483647, 0, -1, -1, -1, 31, -1, -65473, -1, 32831,
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            8388607, 2139062143, 2139062143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 224, 524157950, -2, -1, -528482305, -2, -1,
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -134217729, -32, -122881, -1, -1, -32769, 16777215, 0, -65536,
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            536870911, -1, 15, -1879048193, -1, 131071, -61441, 2147483647, -1,
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1, -1, -125829121, -1, -1, 1073741823, 2147483647, 1, 0, 0, 0, 0,
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 2097152, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            134217728, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1, -1, -1, -1, -1, -1, -1, 8191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2117, 159, 0, 0,
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 8, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2147483648, 1, 0, 0, -2147483648,
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, -2147483648, 1, 0, 0, 0, 0, 0, 0, 0, 0,
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2147483648, -1, -1, -1,
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1, -1, -1, -1, -1, -1, -49153, -1, -63489, -1, -1, 67108863, 0,
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1594359681, 1602223615, -37, -1, -1, 262143, -524288, -1, -1, -1,
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            -1, -1, -1, -1, -1, -1, -1, 1073741823, -65536, -1, -196609, -1,
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            255, 536805376, 0, 0, 0, -2162688, -1, -1, -1, 536870911, 0,
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            134217726, 134217726, -64, -1, 2147483647, 486341884, 0
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    };
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // index of context range (Serialization support)
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The key. */
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int key;
418f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // flag, true if shaping contextual (Serialization support)
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The mask. */
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int mask;
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // ranges to be shaped
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The ranges. */
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int fRanges;
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // index of the default context
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The default context index. */
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int fDefaultContextIndex;
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // flag if NumericShaper shapes contextually
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The contextual. */
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean fContextual;
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // uses for non-context dependent case only
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /** The single range index. */
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int fSingleRangeIndex;
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates NumericShaper with specified parameters.
441f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param ranges specified ranges to be shaped
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultContext default context range
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param isContextual specifies if the instance is contextual
445f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     */
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private NumericShaper(int ranges, int defaultContext, boolean isContextual){
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.fRanges = ranges;
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.fDefaultContextIndex = getIndexFromRange(defaultContext);
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.fContextual = isContextual;
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!fContextual){
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fSingleRangeIndex = getIndexFromRange(ranges);
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
455f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns script index of the specified context range.
458f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param range specified range
460f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return one of the script indices according to the specified range.
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int getIndexFromRange(int range){
464f88ba00a6ec9c43c344fbd1708c6d4ee2b593ca0Elliott Hughes        if (range == 0) {
465f88ba00a6ec9c43c344fbd1708c6d4ee2b593ca0Elliott Hughes            throw rangeException(range);
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int index = 0;
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (index < MAX_INDEX){
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (range == (1 << index)){
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return index;
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            index++;
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
476f88ba00a6ec9c43c344fbd1708c6d4ee2b593ca0Elliott Hughes        throw rangeException(range);
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns range corresponding to the specified script index.
481f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param index specified script index
483f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return one of the range constants according to the specified script index.
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int getRangeFromIndex(int index){
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (index < 0 || index >= MAX_INDEX){
488f88ba00a6ec9c43c344fbd1708c6d4ee2b593ca0Elliott Hughes            throw rangeException(index);
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return 1 << index;
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
494f88ba00a6ec9c43c344fbd1708c6d4ee2b593ca0Elliott Hughes    private static IllegalArgumentException rangeException(int value) {
495f88ba00a6ec9c43c344fbd1708c6d4ee2b593ca0Elliott Hughes        throw new IllegalArgumentException("Illegal range argument value: " + value);
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
5000917c4a9d5d0115950450cdd0bb46e43a48da5dbElliott Hughes        int result = 17;
5010917c4a9d5d0115950450cdd0bb46e43a48da5dbElliott Hughes        result = 31 * result + fRanges;
5020917c4a9d5d0115950450cdd0bb46e43a48da5dbElliott Hughes        result = 31 * result + fDefaultContextIndex;
5030917c4a9d5d0115950450cdd0bb46e43a48da5dbElliott Hughes        result = 31 * result + (fContextual ? 1 : 0);
5040917c4a9d5d0115950450cdd0bb46e43a48da5dbElliott Hughes        return result;
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object obj) {
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (obj == null) {
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (obj == this) {
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            NumericShaper ns = (NumericShaper)obj;
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (fRanges == ns.fRanges &&
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    fDefaultContextIndex == ns.fDefaultContextIndex &&
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    fContextual == ns.fContextual);
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (ClassCastException e){
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /* !! There is no description in the documentation what this method must
531f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * return. Thus format of toString method is based on 1.5 release
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * behavior and can be obtained using next test sample:
533f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *
534f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * // Simple shapers toString format
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * System.out.println(NumericShaper.getShaper(NumericShaper.EASTERN_ARABIC));
536f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * // Context shapers with default context toString format
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * System.out.println(NumericShaper.getContextualShaper(
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *      NumericShaper.ARABIC | NumericShaper.TAMIL));
540f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *
541f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         * // Context shapers with context
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * System.out.println(NumericShaper.getContextualShaper(
543f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes         *      NumericShaper.ARABIC | NumericShaper.TAMIL,
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *      NumericShaper.EASTERN_ARABIC));
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
5467f0c06f737b6f1f6b3a5bb30111f95dd0ca586a2Brian Carlstrom        StringBuilder sb = new StringBuilder(super.toString());
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
548f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        sb.append("[contextual:");
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        sb.append(fContextual);
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (fContextual){
552f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            sb.append(", context:");
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(contexts[fDefaultContextIndex]);
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
556f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        sb.append(", range(s): ");
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (fContextual) {
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int index = 0;
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            boolean isFirst = true;
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (index < MAX_INDEX){
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if ((fRanges & (1 << index)) != 0){
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (isFirst){
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        isFirst = false;
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    } else {
565f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                        sb.append(", ");
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    sb.append(contexts[index]);
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                index++;
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(contexts[fSingleRangeIndex]);
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
574f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        sb.append("]");
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sb.toString();
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the NumericShaper for the specified unicode ranges
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and default unicode range. The defaultContext parameter
582f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * is used as the starting context (which indicates the
583f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * language/script being used). The OR logical operation
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * should be used for multiple ranges:
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * NumericShaper.DEVANAGARI | NumericShaper.BENGALI.
586f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * The NumericShaper returned by this method is contextual
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in that it supports multiple character ranges, depending
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * on the context.
589f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param ranges the unicode ranges.
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultContext the default, starting context.
592f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the NumericShaper for the specified ranges.
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
595f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    public static NumericShaper getContextualShaper(int ranges,
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int defaultContext) {
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ranges &= ALL_RANGES;
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        defaultContext &= ALL_RANGES;
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new NumericShaper(ranges, defaultContext, true);
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
603f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Gets the NumericShaper for the specified unicode ranges.
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The OR logical operation should be used for multiple ranges:
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * NumericShaper.DEVANAGARI | NumericShaper.BENGALI.
606f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * The NumericShaper returned by this method is contextual
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in that it supports multiple character ranges, depending
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * on the context.
609f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param ranges the unicode ranges.
611f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the NumericShaper for the specified ranges.
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumericShaper getContextualShaper(int ranges) {
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ranges &= ALL_RANGES;
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new NumericShaper(ranges, EUROPEAN, true);
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
620f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Gets the masks for all of the ranges supported by this NumericShaper,
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * packed into an int value using the logical OR logical operation
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * for multiple ranges:
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * NumericShaper.DEVANAGARI | NumericShaper.BENGALI.
624f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return all ranges of this NumericShaper.
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getRanges() {
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return fRanges;
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets a NumericShaper for the specified unicode range.
633f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * The NumericShaper supports only a single range and
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * hence is not contextual.
635f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param singleRange the specified unicode single range.
637f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the NumericShaper for the specified unicode range.
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static NumericShaper getShaper(int singleRange) {
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        singleRange &= ALL_RANGES;
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new NumericShaper(singleRange, EUROPEAN, false);
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
646f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Checks if this NumericShaper is contextual (supporting
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * multiple script ranges) or not.
648f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return true, if this NumericShaper is contextual, false otherwise.
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isContextual() {
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return fContextual;
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
656f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Transforms the encoding of the text, starting from the character
657f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * at index start and transforming count characters,
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * using the specified context.
659f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param text the text to be shaped.
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start the start offset of the text.
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param count the number of characters to be shaped.
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param context the context to be used for shaping.
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void shape(char[] text, int start, int count, int context) {
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isContextual()){
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            contextualShape(text, start, count, getIndexFromRange(context));
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            nonContextualShape(text, start, count);
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
674f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Transforms the encoding of the text, starting from the character
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * at index start and transforming count characters.
676f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param text the text to be shaped.
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start the start offset of the text.
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param count the number of characters to be shaped.
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void shape(char[] text, int start, int count) {
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isContextual()){
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            contextualShape(text, start, count, fDefaultContextIndex);
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            nonContextualShape(text, start, count);
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts count of digits of the given array of characters from the start
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * index using specified context. This method is applied for the contextual
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * shaping, if the shaper instance is not contextual use nonContextualShape
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method.
694f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param text an array of chars
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start index of the first character to convert
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param count a number of characters to convert
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param contextIndex index of the script index to use in shaper
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
700f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    private void contextualShape(char[] text, int start, int count,
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int contextIndex){
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char maxDigit = (char)0x0039;
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char minDigit = (char)0x0030;
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int currIndex;
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (((1 << contextIndex) & fRanges) == 0 ){
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            currIndex = INDEX_EUROPEAN;
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            currIndex = contextIndex;
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int ind = start; ind < start + count; ind++){
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (minDigit <= text[ind] && text[ind] <= maxDigit){
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (currIndex != INDEX_ETHIOPIC || text[ind] != '0'){
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    text[ind] = (char)(digitsLowRanges[currIndex] + text[ind]);
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if(isCharStrong(text[ind])){
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    int index = getCharIndex(text[ind]);
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (currIndex != index){
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        if (((1 << index) & fRanges) != 0){
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            currIndex = index;
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        } else {
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            currIndex = INDEX_EUROPEAN;
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts count of digits of the given array of characters from the start
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * index. Method is applied for non-contextual shaper.
736f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param text an array of chars
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param start index of the first character to convert
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param count a number of characters to convert
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void nonContextualShape(char[] text, int start, int count){
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char maxDigit = (char)0x0039;
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char minDigit = (char)((fRanges == ETHIOPIC) ? 0x0031 : 0x0030);
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int ind = start; ind < start + count; ind++){
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (minDigit <= text[ind] && text[ind] <= maxDigit){
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    text[ind] = (char)(digitsLowRanges[fSingleRangeIndex] + text[ind]);
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the index of the script of the specified char.
754f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param ch specified unicode character
756f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return script index corresponding to the given char
758f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     */
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int getCharIndex(char ch){
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int index = INDEX_EUROPEAN;
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i=0; i < MAX_INDEX; i++){
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int j = i * 2;
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (scriptsRanges[j] <= ch && ch <= scriptsRanges[j+1]){
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return i;
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return index;
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns true if the bidirectional category of the character
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is strong.
774f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param chr the chr
776f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return true, if the character is strong, false otherwise
778f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     */
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isCharStrong(int chr) {
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (STRONG_TEXT_FLAGS[chr >> 5] & (1 << (chr % 32))) != 0;
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Updates all private serialized fields for object to be correctly serialized
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * according to the serialized form of this class mentioned in the
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * documentation.
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     private void updateRangesFields(){
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        fRanges = (mask & ~(1 << 31));
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        fContextual = ((mask &(1 << 31)) != 0);
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (fContextual){
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fRanges = (mask & ~(1 << 31));
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fDefaultContextIndex = key;
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fRanges = mask;
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fSingleRangeIndex = key;
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Updates private fields for object after deserialization
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * according to the serialized form of this class mentioned in the
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * documentation.
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void updateKeyMaskFields(){
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mask = fRanges;
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (fContextual){
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            mask |= (1 << 31);
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            key = fDefaultContextIndex;
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else{
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            key = fSingleRangeIndex;
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
814f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Write object.
817f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param out the out
819f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException Signals that an I/O exception has occurred.
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void writeObject(java.io.ObjectOutputStream out)
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                throws IOException{
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        updateKeyMaskFields();
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        out.defaultWriteObject();
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Read object.
830f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param in the in
832f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException Signals that an I/O exception has occurred.
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClassNotFoundException the class not found exception
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void readObject(java.io.ObjectInputStream in)
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                throws IOException, ClassNotFoundException{
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        in.defaultReadObject();
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        updateRangesFields();
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
843