⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bidiorder.java

📁 处理PDF
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
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 + -