/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* $Id$ */

package org.apache.fop.complexscripts.util;

import java.util.Arrays;

Normalization related utilities. N.B. This implementation is an experimental shortcut, the full version of which would require either using ICU4J or an extraction of its normalization function, either being a significant undertaking. At present we handle only specialized decomposition of Indic two part matras.

This work was originally authored by Glenn Adams (gadams@apache.org).

/** * <p>Normalization related utilities. N.B. This implementation is an experimental * shortcut, the full version of which would require either using ICU4J or an extraction * of its normalization function, either being a significant undertaking. At present * we handle only specialized decomposition of Indic two part matras.</p> * * <p>This work was originally authored by Glenn Adams (gadams@apache.org).</p> */
public final class CharNormalize { // CSOFF: LineLength private CharNormalize() { } private static final int[] DECOMPOSABLES = { // bengali 0x09CB, 0x09CC, // oriya 0x0B4B, 0x0B4C, // tamil 0x0BCA, 0x0BCB, 0x0BCC, // malayalam 0x0D4A, 0x0D4B, 0x0D4C, // sinhala 0x0DDA, 0x0DDC, 0x0DDD, 0x0DDE, }; private static final int[][] DECOMPOSITIONS = { // bengali { 0x09C7, 0x09BE }, // 0x09CB { 0x09C7, 0x09D7 }, // 0x09CC // oriya { 0x0B47, 0x0B4E }, // 0x0B4B { 0x0B47, 0x0B57 }, // 0x0B4C // tamil { 0x0BC6, 0x0BBE }, // 0x0BCA { 0x0BC7, 0x0BBE }, // 0x0BCB { 0x0BC6, 0x0BD7 }, // 0x0BCC // malayalam { 0x0D46, 0x0D3E }, // 0x0D4A { 0x0D47, 0x0D3E }, // 0x0D4B { 0x0D46, 0x0D57 }, // 0x0D4C // sinhala { 0x0DD9, 0x0DCA }, // 0x0DDA { 0x0DD9, 0x0DCF }, // 0x0DDC { 0x0DD9, 0x0DCF, 0x0DCA }, // 0x0DDD { 0x0DD9, 0x0DDF }, // 0x0DDE }; private static final int MAX_DECOMPOSITION_LENGTH = 3; public static boolean isDecomposable(int c) { return Arrays.binarySearch(DECOMPOSABLES, c) >= 0; } public static int maximumDecompositionLength() { return MAX_DECOMPOSITION_LENGTH; } public static int[] decompose(int c, int[] da) { int di = Arrays.binarySearch(DECOMPOSABLES, c); if (di >= 0) { return DECOMPOSITIONS[di]; } else if ((da != null) && (da.length > 1)) { da[0] = c; da[1] = 0; return da; } else { return new int[] { c }; } } }