📄 bidiorder.java
字号:
package com.lowagie.text.pdf;
/*
* Copyright 2003 Paulo Soares
*
* The contents of this file are subject to the Mozilla Public License Version 1.1
* (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.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the License.
*
* The Original Code is 'iText, a free JAVA-PDF library'.
*
* The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
* the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
* All Rights Reserved.
* Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
* are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
*
* Contributor(s): all the names of the contributors are added in the source code
* where applicable.
*
* Alternatively, the contents of this file may be used under the terms of the
* LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
* provisions of LGPL are applicable instead of those above. If you wish to
* allow use of your version of this file only under the terms of the LGPL
* License and not to allow others to use your version of this file under
* the MPL, indicate your decision by deleting the provisions above and
* replace them with the notice and other provisions required by the LGPL.
* If you do not delete the provisions above, a recipient may use your version
* of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MPL as stated above or under the terms of the GNU
* Library General Public License as published by the Free Software Foundation;
* either version 2 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
* details.
*
* If you didn't download this code from the following link, you should check if
* you aren't using an obsolete version:
* http://www.lowagie.com/iText/
*/
/*
* (C) Copyright IBM Corp. 1999, All Rights Reserved
*
* version 1.1
*/
/*
* As stated in the Javadoc comments below, materials from Unicode.org
* are used in this class. The following license applies to these materials:
* http://www.unicode.org/copyright.html#Exhibit1
*
* EXHIBIT 1
* UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
*
* Unicode Data Files include all data files under the directories
* http://www.unicode.org/Public/, http://www.unicode.org/reports/,
* and http://www.unicode.org/cldr/data/ .
* Unicode Software includes any source code published in the Unicode Standard
* or under the directories http://www.unicode.org/Public/, http://www.unicode.org/reports/,
* and http://www.unicode.org/cldr/data/.
*
* NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING,
* INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"),
* AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY,
* ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
* DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
*
* COPYRIGHT AND PERMISSION NOTICE
* Copyright (C) 1991-2007 Unicode, Inc. All rights reserved. Distributed under
* the Terms of Use in http://www.unicode.org/copyright.html.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of the Unicode data files and any associated documentation (the "Data Files")
* or Unicode software and any associated documentation (the "Software") to deal
* in the Data Files or Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, and/or sell copies
* of the Data Files or Software, and to permit persons to whom the Data Files
* or Software are furnished to do so, provided that (a) the above copyright
* notice(s) and this permission notice appear with all copies of the Data Files
* or Software, (b) both the above copyright notice(s) and this permission notice
* appear in associated documentation, and (c) there is clear notice in each
* modified Data File or in the Software as well as in the documentation associated
* with the Data File(s) or Software that the data or software has been modified.
*
* THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE
* LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY
* DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE.
*
* Except as contained in this notice, the name of a copyright holder shall not
* be used in advertising or otherwise to promote the sale, use or other dealings
* in these Data Files or Software without prior written authorization of the
* copyright holder.
*/
/**
* Reference implementation of the Unicode 3.0 Bidi algorithm.
*
* <p>
* This implementation is not optimized for performance. It is intended
* as a reference implementation that closely follows the specification
* of the Bidirectional Algorithm in The Unicode Standard version 3.0.
* <p>
* <b>Input:</b><br>
* There are two levels of input to the algorithm, since clients may prefer
* to supply some information from out-of-band sources rather than relying on
* the default behavior.
* <ol>
* <li>unicode type array
* <li>unicode type array, with externally supplied base line direction
* </ol>
* <p><b>Output:</b><br>
* Output is separated into several stages as well, to better enable clients
* to evaluate various aspects of implementation conformance.
* <ol>
* <li>levels array over entire paragraph
* <li>reordering array over entire paragraph
* <li>levels array over line
* <li>reordering array over line
* </ol>
* Note that for conformance, algorithms are only required to generate correct
* reordering and character directionality (odd or even levels) over a line.
* Generating identical level arrays over a line is not required. Bidi
* explicit format codes (LRE, RLE, LRO, RLO, PDF) and BN can be assigned
* arbitrary levels and positions as long as the other text matches.
* <p>
* As the algorithm is defined to operate on a single paragraph at a time,
* this implementation is written to handle single paragraphs. Thus
* rule P1 is presumed by this implementation-- the data provided to the
* implementation is assumed to be a single paragraph, and either contains no
* 'B' codes, or a single 'B' code at the end of the input. 'B' is allowed
* as input to illustrate how the algorithm assigns it a level.
* <p>
* Also note that rules L3 and L4 depend on the rendering engine that uses
* the result of the bidi algorithm. This implementation assumes that the
* rendering engine expects combining marks in visual order (e.g. to the
* left of their base character in RTL runs) and that it adjust the glyphs
* used to render mirrored characters that are in RTL runs so that they
* render appropriately.
*
* @author Doug Felt
*/
public final class BidiOrder {
private byte[] initialTypes;
private byte[] embeddings; // generated from processing format codes
private byte paragraphEmbeddingLevel = -1; // undefined
private int textLength; // for convenience
private byte[] resultTypes; // for paragraph, not lines
private byte[] resultLevels; // for paragraph, not lines
// The bidi types
/** Left-to-right*/
public static final byte L = 0;
/** Left-to-Right Embedding */
public static final byte LRE = 1;
/** Left-to-Right Override */
public static final byte LRO = 2;
/** Right-to-Left */
public static final byte R = 3;
/** Right-to-Left Arabic */
public static final byte AL = 4;
/** Right-to-Left Embedding */
public static final byte RLE = 5;
/** Right-to-Left Override */
public static final byte RLO = 6;
/** Pop Directional Format */
public static final byte PDF = 7;
/** European Number */
public static final byte EN = 8;
/** European Number Separator */
public static final byte ES = 9;
/** European Number Terminator */
public static final byte ET = 10;
/** Arabic Number */
public static final byte AN = 11;
/** Common Number Separator */
public static final byte CS = 12;
/** Non-Spacing Mark */
public static final byte NSM = 13;
/** Boundary Neutral */
public static final byte BN = 14;
/** Paragraph Separator */
public static final byte B = 15;
/** Segment Separator */
public static final byte S = 16;
/** Whitespace */
public static final byte WS = 17;
/** Other Neutrals */
public static final byte ON = 18;
/** Minimum bidi type value. */
public static final byte TYPE_MIN = 0;
/** Maximum bidi type value. */
public static final byte TYPE_MAX = 18;
//
// Input
//
/**
* Initialize using an array of direction types. Types range from TYPE_MIN to TYPE_MAX inclusive
* and represent the direction codes of the characters in the text.
*
* @param types the types array
*/
public BidiOrder(byte[] types) {
validateTypes(types);
this.initialTypes = (byte[])types.clone(); // client type array remains unchanged
runAlgorithm();
}
/**
* Initialize using an array of direction types and an externally supplied paragraph embedding level.
* The embedding level may be -1, 0, or 1. -1 means to apply the default algorithm (rules P2 and P3),
* 0 is for LTR paragraphs, and 1 is for RTL paragraphs.
*
* @param types the types array
* @param paragraphEmbeddingLevel the externally supplied paragraph embedding level.
*/
public BidiOrder(byte[] types, byte paragraphEmbeddingLevel) {
validateTypes(types);
validateParagraphEmbeddingLevel(paragraphEmbeddingLevel);
this.initialTypes = (byte[])types.clone(); // client type array remains unchanged
this.paragraphEmbeddingLevel = paragraphEmbeddingLevel;
runAlgorithm();
}
public BidiOrder(char text[], int offset, int length, byte paragraphEmbeddingLevel) {
initialTypes = new byte[length];
for (int k = 0; k < length; ++k) {
initialTypes[k] = rtypes[text[offset + k]];
}
validateParagraphEmbeddingLevel(paragraphEmbeddingLevel);
this.paragraphEmbeddingLevel = paragraphEmbeddingLevel;
runAlgorithm();
}
public final static byte getDirection(char c) {
return rtypes[c];
}
/**
* The algorithm.
* Does not include line-based processing (Rules L1, L2).
* These are applied later in the line-based phase of the algorithm.
*/
private void runAlgorithm() {
textLength = initialTypes.length;
// Initialize output types.
// Result types initialized to input types.
resultTypes = (byte[])initialTypes.clone();
// 1) determining the paragraph level
// Rule P1 is the requirement for entering this algorithm.
// Rules P2, P3.
// If no externally supplied paragraph embedding level, use default.
if (paragraphEmbeddingLevel == -1) {
determineParagraphEmbeddingLevel();
}
// Initialize result levels to paragraph embedding level.
resultLevels = new byte[textLength];
setLevels(0, textLength, paragraphEmbeddingLevel);
// 2) Explicit levels and directions
// Rules X1-X8.
determineExplicitEmbeddingLevels();
// Rule X9.
textLength = removeExplicitCodes();
// Rule X10.
// Run remainder of algorithm one level run at a time
byte prevLevel = paragraphEmbeddingLevel;
int start = 0;
while (start < textLength) {
byte level = resultLevels[start];
byte prevType = typeForLevel(Math.max(prevLevel, level));
int limit = start + 1;
while (limit < textLength && resultLevels[limit] == level) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -