📄 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 + -