BidiLine.java

1
/*
2
 *
3
 * Copyright 2002 Paulo Soares
4
 *
5
 * The contents of this file are subject to the Mozilla Public License Version 1.1
6
 * (the "License"); you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at http://www.mozilla.org/MPL/
8
 *
9
 * Software distributed under the License is distributed on an "AS IS" basis,
10
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11
 * for the specific language governing rights and limitations under the License.
12
 *
13
 * The Original Code is 'iText, a free JAVA-PDF library'.
14
 *
15
 * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
16
 * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
17
 * All Rights Reserved.
18
 * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
19
 * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
20
 *
21
 * Contributor(s): all the names of the contributors are added in the source code
22
 * where applicable.
23
 *
24
 * Alternatively, the contents of this file may be used under the terms of the
25
 * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
26
 * provisions of LGPL are applicable instead of those above.  If you wish to
27
 * allow use of your version of this file only under the terms of the LGPL
28
 * License and not to allow others to use your version of this file under
29
 * the MPL, indicate your decision by deleting the provisions above and
30
 * replace them with the notice and other provisions required by the LGPL.
31
 * If you do not delete the provisions above, a recipient may use your version
32
 * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
33
 *
34
 * This library is free software; you can redistribute it and/or modify it
35
 * under the terms of the MPL as stated above or under the terms of the GNU
36
 * Library General Public License as published by the Free Software Foundation;
37
 * either version 2 of the License, or any later version.
38
 *
39
 * This library is distributed in the hope that it will be useful, but WITHOUT
40
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
41
 * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
42
 * details.
43
 *
44
 * If you didn't download this code from the following link, you should check if
45
 * you aren't using an obsolete version:
46
 * http://www.lowagie.com/iText/
47
 */
48
49
package com.lowagie.text.pdf;
50
51
import java.text.Bidi;
52
import java.util.ArrayList;
53
54
import com.lowagie.text.Chunk;
55
import com.lowagie.text.Utilities;
56
57
/** Does all the line bidirectional processing with PdfChunk assembly.
58
 *
59
 * @author Paulo Soares (psoares@consiste.pt)
60
 */
61
public class BidiLine {
62
    
63
    protected int runDirection;
64
    protected int pieceSize = 256;
65
    protected char[] text = new char[pieceSize];
66
    protected PdfChunk[] detailChunks = new PdfChunk[pieceSize];
67
    protected int totalTextLength = 0;
68
69
    protected byte[] orderLevels = new byte[pieceSize];
70
    protected int[] indexChars = new int[pieceSize];
71
    
72
    protected ArrayList chunks = new ArrayList();
73
    protected int indexChunk = 0;
74
    protected int indexChunkChar = 0;
75
    protected int currentChar = 0;
76
    
77
    protected int storedRunDirection;
78
    protected char[] storedText = new char[0];
79
    protected PdfChunk[] storedDetailChunks = new PdfChunk[0];
80
    protected int storedTotalTextLength = 0;
81
82
    protected byte[] storedOrderLevels = new byte[0];
83
    protected int[] storedIndexChars = new int[0];
84
    
85
    protected int storedIndexChunk = 0;
86
    protected int storedIndexChunkChar = 0;
87
    protected int storedCurrentChar = 0;
88
    
89
    protected boolean shortStore;
90
//    protected ArabicShaping arabic = new ArabicShaping(ArabicShaping.LETTERS_SHAPE | ArabicShaping.LENGTH_GROW_SHRINK | ArabicShaping.TEXT_DIRECTION_LOGICAL);
91
    protected static final IntHashtable mirrorChars = new IntHashtable();
92
    protected int arabicOptions;
93
    
94
    /** Creates new BidiLine */
95
    public BidiLine() {
96
    }
97
    
98
    public BidiLine(BidiLine org) {
99
        runDirection = org.runDirection;
100
        pieceSize = org.pieceSize;
101
        text = org.text.clone();
102
        detailChunks = org.detailChunks.clone();
103
        totalTextLength = org.totalTextLength;
104
105
        orderLevels = org.orderLevels.clone();
106
        indexChars = org.indexChars.clone();
107
108
        chunks = new ArrayList(org.chunks);
109
        indexChunk = org.indexChunk;
110
        indexChunkChar = org.indexChunkChar;
111
        currentChar = org.currentChar;
112
113
        storedRunDirection = org.storedRunDirection;
114
        storedText = org.storedText.clone();
115
        storedDetailChunks = org.storedDetailChunks.clone();
116
        storedTotalTextLength = org.storedTotalTextLength;
117
118
        storedOrderLevels = org.storedOrderLevels.clone();
119
        storedIndexChars = org.storedIndexChars.clone();
120
121
        storedIndexChunk = org.storedIndexChunk;
122
        storedIndexChunkChar = org.storedIndexChunkChar;
123
        storedCurrentChar = org.storedCurrentChar;
124
125
        shortStore = org.shortStore;
126
        arabicOptions = org.arabicOptions;
127
    }
128
    
129
    public boolean isEmpty() {
130 5 1. isEmpty : changed conditional boundary → NO_COVERAGE
2. isEmpty : changed conditional boundary → NO_COVERAGE
3. isEmpty : negated conditional → NO_COVERAGE
4. isEmpty : negated conditional → NO_COVERAGE
5. isEmpty : replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE
        return (currentChar >= totalTextLength && indexChunk >= chunks.size());
131
    }
132
    
133
    public void clearChunks() {
134 1 1. clearChunks : removed call to java/util/ArrayList::clear → NO_COVERAGE
        chunks.clear();
135
        totalTextLength = 0;
136
        currentChar = 0;
137
    }
138
139
    public boolean getParagraph(int runDirection) {
140
        this.runDirection = runDirection;
141
        currentChar = 0;
142
        totalTextLength = 0;
143
        boolean hasText = false;
144
        char c;
145
        char uniC;
146
        BaseFont bf;
147 3 1. getParagraph : changed conditional boundary → NO_COVERAGE
2. getParagraph : Replaced integer addition with subtraction → NO_COVERAGE
3. getParagraph : negated conditional → NO_COVERAGE
        for (; indexChunk < chunks.size(); ++indexChunk) {
148
            PdfChunk ck = (PdfChunk)chunks.get(indexChunk);
149
            bf = ck.font().getFont();
150
            String s = ck.toString();
151
            int len = s.length();
152 3 1. getParagraph : changed conditional boundary → NO_COVERAGE
2. getParagraph : Replaced integer addition with subtraction → NO_COVERAGE
3. getParagraph : negated conditional → NO_COVERAGE
            for (; indexChunkChar < len; ++indexChunkChar) {
153
                c = s.charAt(indexChunkChar);
154
                uniC = (char)bf.getUnicodeEquivalent(c);
155 2 1. getParagraph : negated conditional → NO_COVERAGE
2. getParagraph : negated conditional → NO_COVERAGE
                if (uniC == '\r' || uniC == '\n') {
156
                    // next condition is never true for CID
157 6 1. getParagraph : changed conditional boundary → NO_COVERAGE
2. getParagraph : Replaced integer addition with subtraction → NO_COVERAGE
3. getParagraph : Replaced integer addition with subtraction → NO_COVERAGE
4. getParagraph : negated conditional → NO_COVERAGE
5. getParagraph : negated conditional → NO_COVERAGE
6. getParagraph : negated conditional → NO_COVERAGE
                    if (uniC == '\r' && indexChunkChar + 1 < len && s.charAt(indexChunkChar + 1) == '\n')
158 1 1. getParagraph : Replaced integer addition with subtraction → NO_COVERAGE
                        ++indexChunkChar;
159 1 1. getParagraph : Replaced integer addition with subtraction → NO_COVERAGE
                    ++indexChunkChar;
160 2 1. getParagraph : changed conditional boundary → NO_COVERAGE
2. getParagraph : negated conditional → NO_COVERAGE
                    if (indexChunkChar >= len) {
161
                        indexChunkChar = 0;
162 1 1. getParagraph : Replaced integer addition with subtraction → NO_COVERAGE
                        ++indexChunk;
163
                    }
164
                    hasText = true;
165 1 1. getParagraph : negated conditional → NO_COVERAGE
                    if (totalTextLength == 0)
166
                        detailChunks[0] = ck;
167
                    break;
168
                }
169 1 1. getParagraph : removed call to com/lowagie/text/pdf/BidiLine::addPiece → NO_COVERAGE
                addPiece(c, ck);
170
            }
171 1 1. getParagraph : negated conditional → NO_COVERAGE
            if (hasText)
172
                break;
173
            indexChunkChar = 0;
174
        }
175 1 1. getParagraph : negated conditional → NO_COVERAGE
        if (totalTextLength == 0)
176 1 1. getParagraph : replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE
            return hasText;
177
178
        // remove trailing WS
179 2 1. getParagraph : Replaced integer subtraction with addition → NO_COVERAGE
2. getParagraph : Replaced integer addition with subtraction → NO_COVERAGE
        totalTextLength = trimRight(0, totalTextLength - 1) + 1;
180 1 1. getParagraph : negated conditional → NO_COVERAGE
        if (totalTextLength == 0) {
181 1 1. getParagraph : replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE
            return true;
182
        }
183
        
184 2 1. getParagraph : negated conditional → NO_COVERAGE
2. getParagraph : negated conditional → NO_COVERAGE
        if (runDirection == PdfWriter.RUN_DIRECTION_LTR || runDirection == PdfWriter.RUN_DIRECTION_RTL) {
185 2 1. getParagraph : changed conditional boundary → NO_COVERAGE
2. getParagraph : negated conditional → NO_COVERAGE
            if (orderLevels.length < totalTextLength) {
186
                orderLevels = new byte[pieceSize];
187
                indexChars = new int[pieceSize];
188
            }
189 1 1. getParagraph : removed call to com/lowagie/text/pdf/ArabicLigaturizer::processNumbers → NO_COVERAGE
            ArabicLigaturizer.processNumbers(text, 0, totalTextLength, arabicOptions);
190 1 1. getParagraph : negated conditional → NO_COVERAGE
            Bidi bidi = new Bidi(new String(text),
191
                                 (byte) (runDirection == PdfWriter.RUN_DIRECTION_RTL ? Bidi.DIRECTION_RIGHT_TO_LEFT : Bidi.DIRECTION_LEFT_TO_RIGHT));
192 3 1. getParagraph : changed conditional boundary → NO_COVERAGE
2. getParagraph : Changed increment from 1 to -1 → NO_COVERAGE
3. getParagraph : negated conditional → NO_COVERAGE
            for (int k = 0; k < totalTextLength; ++k) {
193
                orderLevels[k] = (byte) bidi.getLevelAt(k);
194
                indexChars[k] = k;
195
            }
196 1 1. getParagraph : removed call to com/lowagie/text/pdf/BidiLine::doArabicShapping → NO_COVERAGE
            doArabicShapping();
197 1 1. getParagraph : removed call to com/lowagie/text/pdf/BidiLine::mirrorGlyphs → NO_COVERAGE
            mirrorGlyphs();
198
        }
199
        
200 2 1. getParagraph : Replaced integer subtraction with addition → NO_COVERAGE
2. getParagraph : Replaced integer addition with subtraction → NO_COVERAGE
        totalTextLength = trimRightEx(0, totalTextLength - 1) + 1;
201 1 1. getParagraph : replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE
        return true;
202
    }
203
    
204
    public void addChunk(PdfChunk chunk) {
205
        chunks.add(chunk);
206
    }
207
    
208
    public void addChunks(ArrayList chunks) {
209
        this.chunks.addAll(chunks);
210
    }
211
    
212
    public void addPiece(char c, PdfChunk chunk) {
213 2 1. addPiece : changed conditional boundary → NO_COVERAGE
2. addPiece : negated conditional → NO_COVERAGE
        if (totalTextLength >= pieceSize) {
214
            char[] tempText = text;
215
            PdfChunk[] tempDetailChunks = detailChunks;
216 1 1. addPiece : Replaced integer multiplication with division → NO_COVERAGE
            pieceSize *= 2;
217
            text = new char[pieceSize];
218
            detailChunks = new PdfChunk[pieceSize];
219 1 1. addPiece : removed call to java/lang/System::arraycopy → NO_COVERAGE
            System.arraycopy(tempText, 0, text, 0, totalTextLength);
220 1 1. addPiece : removed call to java/lang/System::arraycopy → NO_COVERAGE
            System.arraycopy(tempDetailChunks, 0, detailChunks, 0, totalTextLength);
221
        }
222
        text[totalTextLength] = c;
223 1 1. addPiece : Replaced integer addition with subtraction → NO_COVERAGE
        detailChunks[totalTextLength++] = chunk;
224
    }
225
    
226
    public void save() {
227 2 1. save : changed conditional boundary → NO_COVERAGE
2. save : negated conditional → NO_COVERAGE
        if (indexChunk > 0) {
228 2 1. save : changed conditional boundary → NO_COVERAGE
2. save : negated conditional → NO_COVERAGE
            if (indexChunk >= chunks.size())
229 1 1. save : removed call to java/util/ArrayList::clear → NO_COVERAGE
                chunks.clear();
230
            else {
231 4 1. save : changed conditional boundary → NO_COVERAGE
2. save : Replaced integer subtraction with addition → NO_COVERAGE
3. save : Replaced integer subtraction with addition → NO_COVERAGE
4. save : negated conditional → NO_COVERAGE
                for (--indexChunk; indexChunk >= 0; --indexChunk)
232
                    chunks.remove(indexChunk);
233
            }
234
            indexChunk = 0;
235
        }
236
        storedRunDirection = runDirection;
237
        storedTotalTextLength = totalTextLength;
238
        storedIndexChunk = indexChunk;
239
        storedIndexChunkChar = indexChunkChar;
240
        storedCurrentChar = currentChar;
241 2 1. save : changed conditional boundary → NO_COVERAGE
2. save : negated conditional → NO_COVERAGE
        shortStore = (currentChar < totalTextLength);
242 1 1. save : negated conditional → NO_COVERAGE
        if (!shortStore) {
243
            // long save
244 2 1. save : changed conditional boundary → NO_COVERAGE
2. save : negated conditional → NO_COVERAGE
            if (storedText.length < totalTextLength) {
245
                storedText = new char[totalTextLength];
246
                storedDetailChunks = new PdfChunk[totalTextLength];
247
            }
248 1 1. save : removed call to java/lang/System::arraycopy → NO_COVERAGE
            System.arraycopy(text, 0, storedText, 0, totalTextLength);
249 1 1. save : removed call to java/lang/System::arraycopy → NO_COVERAGE
            System.arraycopy(detailChunks, 0, storedDetailChunks, 0, totalTextLength);
250
        }
251 2 1. save : negated conditional → NO_COVERAGE
2. save : negated conditional → NO_COVERAGE
        if (runDirection == PdfWriter.RUN_DIRECTION_LTR || runDirection == PdfWriter.RUN_DIRECTION_RTL) {
252 2 1. save : changed conditional boundary → NO_COVERAGE
2. save : negated conditional → NO_COVERAGE
            if (storedOrderLevels.length < totalTextLength) {
253
                storedOrderLevels = new byte[totalTextLength];
254
                storedIndexChars = new int[totalTextLength];
255
            }
256 2 1. save : Replaced integer subtraction with addition → NO_COVERAGE
2. save : removed call to java/lang/System::arraycopy → NO_COVERAGE
            System.arraycopy(orderLevels, currentChar, storedOrderLevels, currentChar, totalTextLength - currentChar);
257 2 1. save : Replaced integer subtraction with addition → NO_COVERAGE
2. save : removed call to java/lang/System::arraycopy → NO_COVERAGE
            System.arraycopy(indexChars, currentChar, storedIndexChars, currentChar, totalTextLength - currentChar);
258
        }
259
    }
260
    
261
    public void restore() {
262
        runDirection = storedRunDirection;
263
        totalTextLength = storedTotalTextLength;
264
        indexChunk = storedIndexChunk;
265
        indexChunkChar = storedIndexChunkChar;
266
        currentChar = storedCurrentChar;
267 1 1. restore : negated conditional → NO_COVERAGE
        if (!shortStore) {
268
            // long restore
269 1 1. restore : removed call to java/lang/System::arraycopy → NO_COVERAGE
            System.arraycopy(storedText, 0, text, 0, totalTextLength);
270 1 1. restore : removed call to java/lang/System::arraycopy → NO_COVERAGE
            System.arraycopy(storedDetailChunks, 0, detailChunks, 0, totalTextLength);
271
        }
272 2 1. restore : negated conditional → NO_COVERAGE
2. restore : negated conditional → NO_COVERAGE
        if (runDirection == PdfWriter.RUN_DIRECTION_LTR || runDirection == PdfWriter.RUN_DIRECTION_RTL) {
273 2 1. restore : Replaced integer subtraction with addition → NO_COVERAGE
2. restore : removed call to java/lang/System::arraycopy → NO_COVERAGE
            System.arraycopy(storedOrderLevels, currentChar, orderLevels, currentChar, totalTextLength - currentChar);
274 2 1. restore : Replaced integer subtraction with addition → NO_COVERAGE
2. restore : removed call to java/lang/System::arraycopy → NO_COVERAGE
            System.arraycopy(storedIndexChars, currentChar, indexChars, currentChar, totalTextLength - currentChar);
275
        }
276
    }
277
    
278
    public void mirrorGlyphs() {
279 3 1. mirrorGlyphs : changed conditional boundary → NO_COVERAGE
2. mirrorGlyphs : Changed increment from 1 to -1 → NO_COVERAGE
3. mirrorGlyphs : negated conditional → NO_COVERAGE
        for (int k = 0; k < totalTextLength; ++k) {
280 2 1. mirrorGlyphs : Replaced bitwise AND with OR → NO_COVERAGE
2. mirrorGlyphs : negated conditional → NO_COVERAGE
            if ((orderLevels[k] & 1) == 1) {
281
                int mirror = mirrorChars.get(text[k]);
282 1 1. mirrorGlyphs : negated conditional → NO_COVERAGE
                if (mirror != 0)
283
                    text[k] = (char)mirror;
284
            }
285
        }
286
    }
287
    
288
    public void doArabicShapping() {
289
        int src = 0;
290
        int dest = 0;
291
        for (;;) {
292 2 1. doArabicShapping : changed conditional boundary → NO_COVERAGE
2. doArabicShapping : negated conditional → NO_COVERAGE
            while (src < totalTextLength) {
293
                char c = text[src];
294 4 1. doArabicShapping : changed conditional boundary → NO_COVERAGE
2. doArabicShapping : changed conditional boundary → NO_COVERAGE
3. doArabicShapping : negated conditional → NO_COVERAGE
4. doArabicShapping : negated conditional → NO_COVERAGE
                if (c >= 0x0600 && c <= 0x06ff)
295
                    break;
296 1 1. doArabicShapping : negated conditional → NO_COVERAGE
                if (src != dest) {
297
                    text[dest] = text[src];
298
                    detailChunks[dest] = detailChunks[src];
299
                    orderLevels[dest] = orderLevels[src];
300
                }
301 1 1. doArabicShapping : Changed increment from 1 to -1 → NO_COVERAGE
                ++src;
302 1 1. doArabicShapping : Changed increment from 1 to -1 → NO_COVERAGE
                ++dest;
303
            }
304 2 1. doArabicShapping : changed conditional boundary → NO_COVERAGE
2. doArabicShapping : negated conditional → NO_COVERAGE
            if (src >= totalTextLength) {
305
                totalTextLength = dest;
306
                return;
307
            }
308
            int startArabicIdx = src;
309 1 1. doArabicShapping : Changed increment from 1 to -1 → NO_COVERAGE
            ++src;
310 2 1. doArabicShapping : changed conditional boundary → NO_COVERAGE
2. doArabicShapping : negated conditional → NO_COVERAGE
            while (src < totalTextLength) {
311
                char c = text[src];
312 4 1. doArabicShapping : changed conditional boundary → NO_COVERAGE
2. doArabicShapping : changed conditional boundary → NO_COVERAGE
3. doArabicShapping : negated conditional → NO_COVERAGE
4. doArabicShapping : negated conditional → NO_COVERAGE
                if (c < 0x0600 || c > 0x06ff)
313
                    break;
314 1 1. doArabicShapping : Changed increment from 1 to -1 → NO_COVERAGE
                ++src;
315
            }
316 1 1. doArabicShapping : Replaced integer subtraction with addition → NO_COVERAGE
            int arabicWordSize = src - startArabicIdx;
317
            int size = ArabicLigaturizer.arabic_shape(text, startArabicIdx, arabicWordSize, text, dest, arabicWordSize, arabicOptions);
318 1 1. doArabicShapping : negated conditional → NO_COVERAGE
            if (startArabicIdx != dest) {
319 3 1. doArabicShapping : changed conditional boundary → NO_COVERAGE
2. doArabicShapping : Changed increment from 1 to -1 → NO_COVERAGE
3. doArabicShapping : negated conditional → NO_COVERAGE
                for (int k = 0; k < size; ++k) {
320
                    detailChunks[dest] = detailChunks[startArabicIdx];
321 2 1. doArabicShapping : Changed increment from 1 to -1 → NO_COVERAGE
2. doArabicShapping : Changed increment from 1 to -1 → NO_COVERAGE
                    orderLevels[dest++] = orderLevels[startArabicIdx++];
322
                }
323
            }
324
            else
325 1 1. doArabicShapping : Replaced integer addition with subtraction → NO_COVERAGE
                dest += size;
326
        }
327
    }
328
       
329
    public PdfLine processLine(float leftX, float width, int alignment, int runDirection, int arabicOptions) {
330
        this.arabicOptions = arabicOptions;
331 1 1. processLine : removed call to com/lowagie/text/pdf/BidiLine::save → NO_COVERAGE
        save();
332 1 1. processLine : negated conditional → NO_COVERAGE
        boolean isRTL = (runDirection == PdfWriter.RUN_DIRECTION_RTL);
333 2 1. processLine : changed conditional boundary → NO_COVERAGE
2. processLine : negated conditional → NO_COVERAGE
        if (currentChar >= totalTextLength) {
334
            boolean hasText = getParagraph(runDirection);
335 1 1. processLine : negated conditional → NO_COVERAGE
            if (!hasText)
336 1 1. processLine : mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
                return null;
337 1 1. processLine : negated conditional → NO_COVERAGE
            if (totalTextLength == 0) {
338
                ArrayList ar = new ArrayList();
339
                PdfChunk ck = new PdfChunk("", detailChunks[0]);
340
                ar.add(ck);
341 1 1. processLine : mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
                return new PdfLine(0, 0, 0, alignment, true, ar, isRTL);
342
            }
343
        }
344
        float originalWidth = width;
345
        int lastSplit = -1;
346 1 1. processLine : negated conditional → NO_COVERAGE
        if (currentChar != 0)
347 1 1. processLine : Replaced integer subtraction with addition → NO_COVERAGE
            currentChar = trimLeftEx(currentChar, totalTextLength - 1);
348
        int oldCurrentChar = currentChar;
349
        int uniC = 0;
350
        PdfChunk ck = null;
351
        float charWidth = 0;
352
        PdfChunk lastValidChunk = null;
353
        boolean splitChar = false;
354
        boolean surrogate = false;
355 3 1. processLine : changed conditional boundary → NO_COVERAGE
2. processLine : Replaced integer addition with subtraction → NO_COVERAGE
3. processLine : negated conditional → NO_COVERAGE
        for (; currentChar < totalTextLength; ++currentChar) {
356
            ck = detailChunks[currentChar];
357
            surrogate = Utilities.isSurrogatePair(text, currentChar);
358 1 1. processLine : negated conditional → NO_COVERAGE
            if (surrogate)
359
                uniC = ck.getUnicodeEquivalent(Utilities.convertToUtf32(text, currentChar));
360
            else
361
                uniC = ck.getUnicodeEquivalent(text[currentChar]);
362 1 1. processLine : negated conditional → NO_COVERAGE
            if (PdfChunk.noPrint(uniC))
363
                continue;
364 1 1. processLine : negated conditional → NO_COVERAGE
            if (surrogate)
365
                charWidth = ck.getCharWidth(uniC);
366
            else
367
                charWidth = ck.getCharWidth(text[currentChar]);
368
            splitChar = ck.isExtSplitCharacter(oldCurrentChar, currentChar, totalTextLength, text, detailChunks);
369 2 1. processLine : negated conditional → NO_COVERAGE
2. processLine : negated conditional → NO_COVERAGE
            if (splitChar && Character.isWhitespace((char)uniC))
370
                lastSplit = currentChar;
371 3 1. processLine : changed conditional boundary → NO_COVERAGE
2. processLine : Replaced float subtraction with addition → NO_COVERAGE
3. processLine : negated conditional → NO_COVERAGE
            if (width - charWidth < 0)
372
                break;
373 1 1. processLine : negated conditional → NO_COVERAGE
            if (splitChar)
374
                lastSplit = currentChar;
375 1 1. processLine : Replaced float subtraction with addition → NO_COVERAGE
            width -= charWidth;
376
            lastValidChunk = ck;
377 1 1. processLine : negated conditional → NO_COVERAGE
            if (ck.isTab()) {
378
                Object[] tab = (Object[])ck.getAttribute(Chunk.TAB);
379
                float tabPosition = (Float) tab[1];
380
                boolean newLine = (Boolean) tab[2];
381 4 1. processLine : changed conditional boundary → NO_COVERAGE
2. processLine : Replaced float subtraction with addition → NO_COVERAGE
3. processLine : negated conditional → NO_COVERAGE
4. processLine : negated conditional → NO_COVERAGE
                if (newLine && tabPosition < originalWidth - width) {
382 2 1. processLine : Replaced integer subtraction with addition → NO_COVERAGE
2. processLine : mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
                    return new PdfLine(0, originalWidth, width, alignment, true, createArrayOfPdfChunks(oldCurrentChar, currentChar - 1), isRTL);
383
                }
384 1 1. processLine : removed call to com/lowagie/text/pdf/PdfChunk::adjustLeft → NO_COVERAGE
                detailChunks[currentChar].adjustLeft(leftX);
385 1 1. processLine : Replaced float subtraction with addition → NO_COVERAGE
                width = originalWidth - tabPosition;
386
            }
387 1 1. processLine : negated conditional → NO_COVERAGE
            if (surrogate)
388 1 1. processLine : Replaced integer addition with subtraction → NO_COVERAGE
                ++currentChar;
389
        }
390 1 1. processLine : negated conditional → NO_COVERAGE
        if (lastValidChunk == null) {
391
            // not even a single char fit; must output the first char
392 1 1. processLine : Replaced integer addition with subtraction → NO_COVERAGE
            ++currentChar;
393 1 1. processLine : negated conditional → NO_COVERAGE
            if (surrogate)
394 1 1. processLine : Replaced integer addition with subtraction → NO_COVERAGE
                ++currentChar;
395 3 1. processLine : Replaced integer subtraction with addition → NO_COVERAGE
2. processLine : Replaced integer subtraction with addition → NO_COVERAGE
3. processLine : mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
            return new PdfLine(0, originalWidth, 0, alignment, false, createArrayOfPdfChunks(currentChar - 1, currentChar - 1), isRTL);
396
        }
397 2 1. processLine : changed conditional boundary → NO_COVERAGE
2. processLine : negated conditional → NO_COVERAGE
        if (currentChar >= totalTextLength) {
398
            // there was more line than text
399 2 1. processLine : Replaced integer subtraction with addition → NO_COVERAGE
2. processLine : mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
            return new PdfLine(0, originalWidth, width, alignment, true, createArrayOfPdfChunks(oldCurrentChar, totalTextLength - 1), isRTL);
400
        }
401 1 1. processLine : Replaced integer subtraction with addition → NO_COVERAGE
        int newCurrentChar = trimRightEx(oldCurrentChar, currentChar - 1);
402 2 1. processLine : changed conditional boundary → NO_COVERAGE
2. processLine : negated conditional → NO_COVERAGE
        if (newCurrentChar < oldCurrentChar) {
403
            // only WS
404 2 1. processLine : Replaced integer subtraction with addition → NO_COVERAGE
2. processLine : mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
            return new PdfLine(0, originalWidth, width, alignment, false, createArrayOfPdfChunks(oldCurrentChar, currentChar - 1), isRTL);
405
        }
406 2 1. processLine : Replaced integer subtraction with addition → NO_COVERAGE
2. processLine : negated conditional → NO_COVERAGE
        if (newCurrentChar == currentChar - 1) { // middle of word
407
            HyphenationEvent he = (HyphenationEvent)lastValidChunk.getAttribute(Chunk.HYPHENATION);
408 1 1. processLine : negated conditional → NO_COVERAGE
            if (he != null) {
409
                int[] word = getWord(oldCurrentChar, newCurrentChar);
410 1 1. processLine : negated conditional → NO_COVERAGE
                if (word != null) {
411 2 1. processLine : Replaced integer subtraction with addition → NO_COVERAGE
2. processLine : Replaced float addition with subtraction → NO_COVERAGE
                    float testWidth = width + getWidth(word[0], currentChar - 1);
412 1 1. processLine : Replaced integer subtraction with addition → NO_COVERAGE
                    String pre = he.getHyphenatedWordPre(new String(text, word[0], word[1] - word[0]), lastValidChunk.font().getFont(), lastValidChunk.font().size(), testWidth);
413
                    String post = he.getHyphenatedWordPost();
414 2 1. processLine : changed conditional boundary → NO_COVERAGE
2. processLine : negated conditional → NO_COVERAGE
                    if (pre.length() > 0) {
415
                        PdfChunk extra = new PdfChunk(pre, lastValidChunk);
416 1 1. processLine : Replaced integer subtraction with addition → NO_COVERAGE
                        currentChar = word[1] - post.length();
417 3 1. processLine : Replaced float subtraction with addition → NO_COVERAGE
2. processLine : Replaced integer subtraction with addition → NO_COVERAGE
3. processLine : mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
                        return new PdfLine(0, originalWidth, testWidth - lastValidChunk.font().width(pre), alignment, false, createArrayOfPdfChunks(oldCurrentChar, word[0] - 1, extra), isRTL);
418
                    }
419
                }
420
            }
421
        }
422 3 1. processLine : changed conditional boundary → NO_COVERAGE
2. processLine : negated conditional → NO_COVERAGE
3. processLine : negated conditional → NO_COVERAGE
        if (lastSplit == -1 || lastSplit >= newCurrentChar) {
423
            // no split point or split point ahead of end
424 4 1. processLine : Replaced integer addition with subtraction → NO_COVERAGE
2. processLine : Replaced integer subtraction with addition → NO_COVERAGE
3. processLine : Replaced float addition with subtraction → NO_COVERAGE
4. processLine : mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
            return new PdfLine(0, originalWidth, width + getWidth(newCurrentChar + 1, currentChar - 1), alignment, false, createArrayOfPdfChunks(oldCurrentChar, newCurrentChar), isRTL);
425
        }
426
        // standard split
427 1 1. processLine : Replaced integer addition with subtraction → NO_COVERAGE
        currentChar = lastSplit + 1;
428
        newCurrentChar = trimRightEx(oldCurrentChar, lastSplit);
429 2 1. processLine : changed conditional boundary → NO_COVERAGE
2. processLine : negated conditional → NO_COVERAGE
        if (newCurrentChar < oldCurrentChar) {
430
            // only WS again
431 1 1. processLine : Replaced integer subtraction with addition → NO_COVERAGE
            newCurrentChar = currentChar - 1;
432
        }
433 2 1. processLine : Replaced float subtraction with addition → NO_COVERAGE
2. processLine : mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
        return new PdfLine(0, originalWidth, originalWidth - getWidth(oldCurrentChar, newCurrentChar), alignment, false, createArrayOfPdfChunks(oldCurrentChar, newCurrentChar), isRTL);
434
    }
435
    
436
    /** Gets the width of a range of characters.
437
     * @param startIdx the first index to calculate
438
     * @param lastIdx the last inclusive index to calculate
439
     * @return the sum of all widths
440
     */    
441
    public float getWidth(int startIdx, int lastIdx) {
442
        char c = 0;
443
        char uniC;
444
        PdfChunk ck = null;
445
        float width = 0;
446 3 1. getWidth : changed conditional boundary → NO_COVERAGE
2. getWidth : Changed increment from 1 to -1 → NO_COVERAGE
3. getWidth : negated conditional → NO_COVERAGE
        for (; startIdx <= lastIdx; ++startIdx) {
447
            boolean surrogate = Utilities.isSurrogatePair(text, startIdx);
448 1 1. getWidth : negated conditional → NO_COVERAGE
            if (surrogate) {
449 1 1. getWidth : Replaced float addition with subtraction → NO_COVERAGE
                width += detailChunks[startIdx].getCharWidth(Utilities.convertToUtf32(text, startIdx));
450 1 1. getWidth : Changed increment from 1 to -1 → NO_COVERAGE
                ++startIdx;
451
            }
452
            else {
453
                c = text[startIdx];
454
                ck = detailChunks[startIdx];
455 1 1. getWidth : negated conditional → NO_COVERAGE
                if (PdfChunk.noPrint(ck.getUnicodeEquivalent(c)))
456
                    continue;
457 1 1. getWidth : Replaced float addition with subtraction → NO_COVERAGE
                width += detailChunks[startIdx].getCharWidth(c);
458
            }
459
        }
460 1 1. getWidth : replaced return of float value with -(x + 1) for com/lowagie/text/pdf/BidiLine::getWidth → NO_COVERAGE
        return width;
461
    }
462
    
463
    public ArrayList createArrayOfPdfChunks(int startIdx, int endIdx) {
464 1 1. createArrayOfPdfChunks : mutated return of Object value for com/lowagie/text/pdf/BidiLine::createArrayOfPdfChunks to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
        return createArrayOfPdfChunks(startIdx, endIdx, null);
465
    }
466
    
467
    public ArrayList createArrayOfPdfChunks(int startIdx, int endIdx, PdfChunk extraPdfChunk) {
468 2 1. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
2. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
        boolean bidi = (runDirection == PdfWriter.RUN_DIRECTION_LTR || runDirection == PdfWriter.RUN_DIRECTION_RTL);
469 1 1. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
        if (bidi)
470 1 1. createArrayOfPdfChunks : removed call to com/lowagie/text/pdf/BidiLine::reorder → NO_COVERAGE
            reorder(startIdx, endIdx);
471
        ArrayList ar = new ArrayList();
472
        PdfChunk refCk = detailChunks[startIdx];
473
        PdfChunk ck = null;
474
        StringBuffer buf = new StringBuffer();
475
        char c;
476
        int idx = 0;
477 3 1. createArrayOfPdfChunks : changed conditional boundary → NO_COVERAGE
2. createArrayOfPdfChunks : Changed increment from 1 to -1 → NO_COVERAGE
3. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
        for (; startIdx <= endIdx; ++startIdx) {
478 1 1. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
            idx = bidi ? indexChars[startIdx] : startIdx;
479
            c = text[idx];
480
            ck = detailChunks[idx];
481 1 1. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
            if (PdfChunk.noPrint(ck.getUnicodeEquivalent(c)))
482
                continue;
483 3 1. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
2. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
3. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
            if (ck.isImage() || ck.isSeparator() || ck.isTab()) {
484 2 1. createArrayOfPdfChunks : changed conditional boundary → NO_COVERAGE
2. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
                if (buf.length() > 0) {
485
                    ar.add(new PdfChunk(buf.toString(), refCk));
486
                    buf = new StringBuffer();
487
                }
488
                ar.add(ck);
489
            }
490 1 1. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
            else if (ck == refCk) {
491
                buf.append(c);
492
            }
493
            else {
494 2 1. createArrayOfPdfChunks : changed conditional boundary → NO_COVERAGE
2. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
                if (buf.length() > 0) {
495
                    ar.add(new PdfChunk(buf.toString(), refCk));
496
                    buf = new StringBuffer();
497
                }
498 3 1. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
2. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
3. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
                if (!ck.isImage() && !ck.isSeparator() && !ck.isTab())
499
                    buf.append(c);
500
                refCk = ck;
501
            }
502
        }
503 2 1. createArrayOfPdfChunks : changed conditional boundary → NO_COVERAGE
2. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
        if (buf.length() > 0) {
504
            ar.add(new PdfChunk(buf.toString(), refCk));
505
        }
506 1 1. createArrayOfPdfChunks : negated conditional → NO_COVERAGE
        if (extraPdfChunk != null)
507
            ar.add(extraPdfChunk);
508 1 1. createArrayOfPdfChunks : mutated return of Object value for com/lowagie/text/pdf/BidiLine::createArrayOfPdfChunks to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
        return ar;
509
    }
510
    
511
    public int[] getWord(int startIdx, int idx) {
512
        int last = idx;
513
        int first = idx;
514
        // forward
515 3 1. getWord : changed conditional boundary → NO_COVERAGE
2. getWord : Changed increment from 1 to -1 → NO_COVERAGE
3. getWord : negated conditional → NO_COVERAGE
        for (; last < totalTextLength; ++last) {
516 1 1. getWord : negated conditional → NO_COVERAGE
            if (!Character.isLetter(text[last]))
517
                break;            
518
        }
519 1 1. getWord : negated conditional → NO_COVERAGE
        if (last == idx)
520 1 1. getWord : mutated return of Object value for com/lowagie/text/pdf/BidiLine::getWord to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
            return null;
521
        // backward
522 3 1. getWord : changed conditional boundary → NO_COVERAGE
2. getWord : Changed increment from -1 to 1 → NO_COVERAGE
3. getWord : negated conditional → NO_COVERAGE
        for (; first >= startIdx; --first) {
523 1 1. getWord : negated conditional → NO_COVERAGE
            if (!Character.isLetter(text[first]))
524
                break;            
525
        }
526 1 1. getWord : Changed increment from 1 to -1 → NO_COVERAGE
        ++first;
527 1 1. getWord : mutated return of Object value for com/lowagie/text/pdf/BidiLine::getWord to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE
        return new int[]{first, last};
528
    }
529
    
530
    public int trimRight(int startIdx, int endIdx) {
531
        int idx = endIdx;
532
        char c;
533 3 1. trimRight : changed conditional boundary → NO_COVERAGE
2. trimRight : Changed increment from -1 to 1 → NO_COVERAGE
3. trimRight : negated conditional → NO_COVERAGE
        for (; idx >= startIdx; --idx) {
534
            c = (char)detailChunks[idx].getUnicodeEquivalent(text[idx]);
535 1 1. trimRight : negated conditional → NO_COVERAGE
            if (!isWS(c))
536
                break;
537
        }
538 1 1. trimRight : replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE
        return idx;
539
    }
540
    
541
    public int trimLeft(int startIdx, int endIdx) {
542
        int idx = startIdx;
543
        char c;
544 3 1. trimLeft : changed conditional boundary → NO_COVERAGE
2. trimLeft : Changed increment from 1 to -1 → NO_COVERAGE
3. trimLeft : negated conditional → NO_COVERAGE
        for (; idx <= endIdx; ++idx) {
545
            c = (char)detailChunks[idx].getUnicodeEquivalent(text[idx]);
546 1 1. trimLeft : negated conditional → NO_COVERAGE
            if (!isWS(c))
547
                break;
548
        }
549 1 1. trimLeft : replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE
        return idx;
550
    }
551
    
552
    public int trimRightEx(int startIdx, int endIdx) {
553
        int idx = endIdx;
554
        char c = 0;
555 3 1. trimRightEx : changed conditional boundary → NO_COVERAGE
2. trimRightEx : Changed increment from -1 to 1 → NO_COVERAGE
3. trimRightEx : negated conditional → NO_COVERAGE
        for (; idx >= startIdx; --idx) {
556
            c = (char)detailChunks[idx].getUnicodeEquivalent(text[idx]);
557 2 1. trimRightEx : negated conditional → NO_COVERAGE
2. trimRightEx : negated conditional → NO_COVERAGE
            if (!isWS(c) && !PdfChunk.noPrint(c))
558
                break;
559
        }
560 1 1. trimRightEx : replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE
        return idx;
561
    }
562
    
563
    public int trimLeftEx(int startIdx, int endIdx) {
564
        int idx = startIdx;
565
        char c = 0;
566 3 1. trimLeftEx : changed conditional boundary → NO_COVERAGE
2. trimLeftEx : Changed increment from 1 to -1 → NO_COVERAGE
3. trimLeftEx : negated conditional → NO_COVERAGE
        for (; idx <= endIdx; ++idx) {
567
            c = (char)detailChunks[idx].getUnicodeEquivalent(text[idx]);
568 2 1. trimLeftEx : negated conditional → NO_COVERAGE
2. trimLeftEx : negated conditional → NO_COVERAGE
            if (!isWS(c) && !PdfChunk.noPrint(c))
569
                break;
570
        }
571 1 1. trimLeftEx : replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE
        return idx;
572
    }
573
    
574
    public void reorder(int start, int end) {
575
        byte maxLevel = orderLevels[start];
576
        byte minLevel = maxLevel;
577
        byte onlyOddLevels = maxLevel;
578
        byte onlyEvenLevels = maxLevel;
579 4 1. reorder : changed conditional boundary → NO_COVERAGE
2. reorder : Changed increment from 1 to -1 → NO_COVERAGE
3. reorder : Replaced integer addition with subtraction → NO_COVERAGE
4. reorder : negated conditional → NO_COVERAGE
        for (int k = start + 1; k <= end; ++k) {
580
            byte b = orderLevels[k];
581 2 1. reorder : changed conditional boundary → NO_COVERAGE
2. reorder : negated conditional → NO_COVERAGE
            if (b > maxLevel)
582
                maxLevel = b;
583 2 1. reorder : changed conditional boundary → NO_COVERAGE
2. reorder : negated conditional → NO_COVERAGE
            else if (b < minLevel)
584
                minLevel = b;
585 1 1. reorder : Replaced bitwise AND with OR → NO_COVERAGE
            onlyOddLevels &= b;
586 1 1. reorder : Replaced bitwise OR with AND → NO_COVERAGE
            onlyEvenLevels |= b;
587
        }
588 2 1. reorder : Replaced bitwise AND with OR → NO_COVERAGE
2. reorder : negated conditional → NO_COVERAGE
        if ((onlyEvenLevels & 1) == 0) // nothing to do
589
            return;
590 2 1. reorder : Replaced bitwise AND with OR → NO_COVERAGE
2. reorder : negated conditional → NO_COVERAGE
        if ((onlyOddLevels & 1) == 1) { // single inversion
591 2 1. reorder : Replaced integer addition with subtraction → NO_COVERAGE
2. reorder : removed call to com/lowagie/text/pdf/BidiLine::flip → NO_COVERAGE
            flip(start, end + 1);
592
            return;
593
        }
594 1 1. reorder : Replaced bitwise OR with AND → NO_COVERAGE
        minLevel |= 1;
595 3 1. reorder : changed conditional boundary → NO_COVERAGE
2. reorder : Replaced integer subtraction with addition → NO_COVERAGE
3. reorder : negated conditional → NO_COVERAGE
        for (; maxLevel >= minLevel; --maxLevel) {
596
            int pstart = start;
597
            for (;;) {
598 3 1. reorder : changed conditional boundary → NO_COVERAGE
2. reorder : Changed increment from 1 to -1 → NO_COVERAGE
3. reorder : negated conditional → NO_COVERAGE
                for (;pstart <= end; ++pstart) {
599 2 1. reorder : changed conditional boundary → NO_COVERAGE
2. reorder : negated conditional → NO_COVERAGE
                    if (orderLevels[pstart] >= maxLevel)
600
                        break;
601
                }
602 2 1. reorder : changed conditional boundary → NO_COVERAGE
2. reorder : negated conditional → NO_COVERAGE
                if (pstart > end)
603
                    break;
604 1 1. reorder : Replaced integer addition with subtraction → NO_COVERAGE
                int pend = pstart + 1;
605 3 1. reorder : changed conditional boundary → NO_COVERAGE
2. reorder : Changed increment from 1 to -1 → NO_COVERAGE
3. reorder : negated conditional → NO_COVERAGE
                for (; pend <= end; ++pend) {
606 2 1. reorder : changed conditional boundary → NO_COVERAGE
2. reorder : negated conditional → NO_COVERAGE
                    if (orderLevels[pend] < maxLevel)
607
                        break;
608
                }
609 1 1. reorder : removed call to com/lowagie/text/pdf/BidiLine::flip → NO_COVERAGE
                flip(pstart, pend);
610 1 1. reorder : Replaced integer addition with subtraction → NO_COVERAGE
                pstart = pend + 1;
611
            }
612
        }
613
    }
614
    
615
    public void flip(int start, int end) {
616 2 1. flip : Replaced integer addition with subtraction → NO_COVERAGE
2. flip : Replaced integer division with multiplication → NO_COVERAGE
        int mid = (start + end) / 2;
617 1 1. flip : Changed increment from -1 to 1 → NO_COVERAGE
        --end;
618 4 1. flip : changed conditional boundary → NO_COVERAGE
2. flip : Changed increment from 1 to -1 → NO_COVERAGE
3. flip : Changed increment from -1 to 1 → NO_COVERAGE
4. flip : negated conditional → NO_COVERAGE
        for (; start < mid; ++start, --end) {
619
            int temp = indexChars[start];
620
            indexChars[start] = indexChars[end];
621
            indexChars[end] = temp;
622
        }
623
    }
624
    
625
    public static boolean isWS(char c) {
626 3 1. isWS : changed conditional boundary → NO_COVERAGE
2. isWS : negated conditional → NO_COVERAGE
3. isWS : replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE
        return (c <= ' ');
627
    }
628
629
    static {
630
        mirrorChars.put(0x0028, 0x0029); // LEFT PARENTHESIS
631
        mirrorChars.put(0x0029, 0x0028); // RIGHT PARENTHESIS
632
        mirrorChars.put(0x003C, 0x003E); // LESS-THAN SIGN
633
        mirrorChars.put(0x003E, 0x003C); // GREATER-THAN SIGN
634
        mirrorChars.put(0x005B, 0x005D); // LEFT SQUARE BRACKET
635
        mirrorChars.put(0x005D, 0x005B); // RIGHT SQUARE BRACKET
636
        mirrorChars.put(0x007B, 0x007D); // LEFT CURLY BRACKET
637
        mirrorChars.put(0x007D, 0x007B); // RIGHT CURLY BRACKET
638
        mirrorChars.put(0x00AB, 0x00BB); // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
639
        mirrorChars.put(0x00BB, 0x00AB); // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
640
        mirrorChars.put(0x2039, 0x203A); // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
641
        mirrorChars.put(0x203A, 0x2039); // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
642
        mirrorChars.put(0x2045, 0x2046); // LEFT SQUARE BRACKET WITH QUILL
643
        mirrorChars.put(0x2046, 0x2045); // RIGHT SQUARE BRACKET WITH QUILL
644
        mirrorChars.put(0x207D, 0x207E); // SUPERSCRIPT LEFT PARENTHESIS
645
        mirrorChars.put(0x207E, 0x207D); // SUPERSCRIPT RIGHT PARENTHESIS
646
        mirrorChars.put(0x208D, 0x208E); // SUBSCRIPT LEFT PARENTHESIS
647
        mirrorChars.put(0x208E, 0x208D); // SUBSCRIPT RIGHT PARENTHESIS
648
        mirrorChars.put(0x2208, 0x220B); // ELEMENT OF
649
        mirrorChars.put(0x2209, 0x220C); // NOT AN ELEMENT OF
650
        mirrorChars.put(0x220A, 0x220D); // SMALL ELEMENT OF
651
        mirrorChars.put(0x220B, 0x2208); // CONTAINS AS MEMBER
652
        mirrorChars.put(0x220C, 0x2209); // DOES NOT CONTAIN AS MEMBER
653
        mirrorChars.put(0x220D, 0x220A); // SMALL CONTAINS AS MEMBER
654
        mirrorChars.put(0x2215, 0x29F5); // DIVISION SLASH
655
        mirrorChars.put(0x223C, 0x223D); // TILDE OPERATOR
656
        mirrorChars.put(0x223D, 0x223C); // REVERSED TILDE
657
        mirrorChars.put(0x2243, 0x22CD); // ASYMPTOTICALLY EQUAL TO
658
        mirrorChars.put(0x2252, 0x2253); // APPROXIMATELY EQUAL TO OR THE IMAGE OF
659
        mirrorChars.put(0x2253, 0x2252); // IMAGE OF OR APPROXIMATELY EQUAL TO
660
        mirrorChars.put(0x2254, 0x2255); // COLON EQUALS
661
        mirrorChars.put(0x2255, 0x2254); // EQUALS COLON
662
        mirrorChars.put(0x2264, 0x2265); // LESS-THAN OR EQUAL TO
663
        mirrorChars.put(0x2265, 0x2264); // GREATER-THAN OR EQUAL TO
664
        mirrorChars.put(0x2266, 0x2267); // LESS-THAN OVER EQUAL TO
665
        mirrorChars.put(0x2267, 0x2266); // GREATER-THAN OVER EQUAL TO
666
        mirrorChars.put(0x2268, 0x2269); // [BEST FIT] LESS-THAN BUT NOT EQUAL TO
667
        mirrorChars.put(0x2269, 0x2268); // [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
668
        mirrorChars.put(0x226A, 0x226B); // MUCH LESS-THAN
669
        mirrorChars.put(0x226B, 0x226A); // MUCH GREATER-THAN
670
        mirrorChars.put(0x226E, 0x226F); // [BEST FIT] NOT LESS-THAN
671
        mirrorChars.put(0x226F, 0x226E); // [BEST FIT] NOT GREATER-THAN
672
        mirrorChars.put(0x2270, 0x2271); // [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
673
        mirrorChars.put(0x2271, 0x2270); // [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
674
        mirrorChars.put(0x2272, 0x2273); // [BEST FIT] LESS-THAN OR EQUIVALENT TO
675
        mirrorChars.put(0x2273, 0x2272); // [BEST FIT] GREATER-THAN OR EQUIVALENT TO
676
        mirrorChars.put(0x2274, 0x2275); // [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
677
        mirrorChars.put(0x2275, 0x2274); // [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
678
        mirrorChars.put(0x2276, 0x2277); // LESS-THAN OR GREATER-THAN
679
        mirrorChars.put(0x2277, 0x2276); // GREATER-THAN OR LESS-THAN
680
        mirrorChars.put(0x2278, 0x2279); // NEITHER LESS-THAN NOR GREATER-THAN
681
        mirrorChars.put(0x2279, 0x2278); // NEITHER GREATER-THAN NOR LESS-THAN
682
        mirrorChars.put(0x227A, 0x227B); // PRECEDES
683
        mirrorChars.put(0x227B, 0x227A); // SUCCEEDS
684
        mirrorChars.put(0x227C, 0x227D); // PRECEDES OR EQUAL TO
685
        mirrorChars.put(0x227D, 0x227C); // SUCCEEDS OR EQUAL TO
686
        mirrorChars.put(0x227E, 0x227F); // [BEST FIT] PRECEDES OR EQUIVALENT TO
687
        mirrorChars.put(0x227F, 0x227E); // [BEST FIT] SUCCEEDS OR EQUIVALENT TO
688
        mirrorChars.put(0x2280, 0x2281); // [BEST FIT] DOES NOT PRECEDE
689
        mirrorChars.put(0x2281, 0x2280); // [BEST FIT] DOES NOT SUCCEED
690
        mirrorChars.put(0x2282, 0x2283); // SUBSET OF
691
        mirrorChars.put(0x2283, 0x2282); // SUPERSET OF
692
        mirrorChars.put(0x2284, 0x2285); // [BEST FIT] NOT A SUBSET OF
693
        mirrorChars.put(0x2285, 0x2284); // [BEST FIT] NOT A SUPERSET OF
694
        mirrorChars.put(0x2286, 0x2287); // SUBSET OF OR EQUAL TO
695
        mirrorChars.put(0x2287, 0x2286); // SUPERSET OF OR EQUAL TO
696
        mirrorChars.put(0x2288, 0x2289); // [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
697
        mirrorChars.put(0x2289, 0x2288); // [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
698
        mirrorChars.put(0x228A, 0x228B); // [BEST FIT] SUBSET OF WITH NOT EQUAL TO
699
        mirrorChars.put(0x228B, 0x228A); // [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
700
        mirrorChars.put(0x228F, 0x2290); // SQUARE IMAGE OF
701
        mirrorChars.put(0x2290, 0x228F); // SQUARE ORIGINAL OF
702
        mirrorChars.put(0x2291, 0x2292); // SQUARE IMAGE OF OR EQUAL TO
703
        mirrorChars.put(0x2292, 0x2291); // SQUARE ORIGINAL OF OR EQUAL TO
704
        mirrorChars.put(0x2298, 0x29B8); // CIRCLED DIVISION SLASH
705
        mirrorChars.put(0x22A2, 0x22A3); // RIGHT TACK
706
        mirrorChars.put(0x22A3, 0x22A2); // LEFT TACK
707
        mirrorChars.put(0x22A6, 0x2ADE); // ASSERTION
708
        mirrorChars.put(0x22A8, 0x2AE4); // TRUE
709
        mirrorChars.put(0x22A9, 0x2AE3); // FORCES
710
        mirrorChars.put(0x22AB, 0x2AE5); // DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
711
        mirrorChars.put(0x22B0, 0x22B1); // PRECEDES UNDER RELATION
712
        mirrorChars.put(0x22B1, 0x22B0); // SUCCEEDS UNDER RELATION
713
        mirrorChars.put(0x22B2, 0x22B3); // NORMAL SUBGROUP OF
714
        mirrorChars.put(0x22B3, 0x22B2); // CONTAINS AS NORMAL SUBGROUP
715
        mirrorChars.put(0x22B4, 0x22B5); // NORMAL SUBGROUP OF OR EQUAL TO
716
        mirrorChars.put(0x22B5, 0x22B4); // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
717
        mirrorChars.put(0x22B6, 0x22B7); // ORIGINAL OF
718
        mirrorChars.put(0x22B7, 0x22B6); // IMAGE OF
719
        mirrorChars.put(0x22C9, 0x22CA); // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
720
        mirrorChars.put(0x22CA, 0x22C9); // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
721
        mirrorChars.put(0x22CB, 0x22CC); // LEFT SEMIDIRECT PRODUCT
722
        mirrorChars.put(0x22CC, 0x22CB); // RIGHT SEMIDIRECT PRODUCT
723
        mirrorChars.put(0x22CD, 0x2243); // REVERSED TILDE EQUALS
724
        mirrorChars.put(0x22D0, 0x22D1); // DOUBLE SUBSET
725
        mirrorChars.put(0x22D1, 0x22D0); // DOUBLE SUPERSET
726
        mirrorChars.put(0x22D6, 0x22D7); // LESS-THAN WITH DOT
727
        mirrorChars.put(0x22D7, 0x22D6); // GREATER-THAN WITH DOT
728
        mirrorChars.put(0x22D8, 0x22D9); // VERY MUCH LESS-THAN
729
        mirrorChars.put(0x22D9, 0x22D8); // VERY MUCH GREATER-THAN
730
        mirrorChars.put(0x22DA, 0x22DB); // LESS-THAN EQUAL TO OR GREATER-THAN
731
        mirrorChars.put(0x22DB, 0x22DA); // GREATER-THAN EQUAL TO OR LESS-THAN
732
        mirrorChars.put(0x22DC, 0x22DD); // EQUAL TO OR LESS-THAN
733
        mirrorChars.put(0x22DD, 0x22DC); // EQUAL TO OR GREATER-THAN
734
        mirrorChars.put(0x22DE, 0x22DF); // EQUAL TO OR PRECEDES
735
        mirrorChars.put(0x22DF, 0x22DE); // EQUAL TO OR SUCCEEDS
736
        mirrorChars.put(0x22E0, 0x22E1); // [BEST FIT] DOES NOT PRECEDE OR EQUAL
737
        mirrorChars.put(0x22E1, 0x22E0); // [BEST FIT] DOES NOT SUCCEED OR EQUAL
738
        mirrorChars.put(0x22E2, 0x22E3); // [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO
739
        mirrorChars.put(0x22E3, 0x22E2); // [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO
740
        mirrorChars.put(0x22E4, 0x22E5); // [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO
741
        mirrorChars.put(0x22E5, 0x22E4); // [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO
742
        mirrorChars.put(0x22E6, 0x22E7); // [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO
743
        mirrorChars.put(0x22E7, 0x22E6); // [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO
744
        mirrorChars.put(0x22E8, 0x22E9); // [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO
745
        mirrorChars.put(0x22E9, 0x22E8); // [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO
746
        mirrorChars.put(0x22EA, 0x22EB); // [BEST FIT] NOT NORMAL SUBGROUP OF
747
        mirrorChars.put(0x22EB, 0x22EA); // [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP
748
        mirrorChars.put(0x22EC, 0x22ED); // [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO
749
        mirrorChars.put(0x22ED, 0x22EC); // [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
750
        mirrorChars.put(0x22F0, 0x22F1); // UP RIGHT DIAGONAL ELLIPSIS
751
        mirrorChars.put(0x22F1, 0x22F0); // DOWN RIGHT DIAGONAL ELLIPSIS
752
        mirrorChars.put(0x22F2, 0x22FA); // ELEMENT OF WITH LONG HORIZONTAL STROKE
753
        mirrorChars.put(0x22F3, 0x22FB); // ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
754
        mirrorChars.put(0x22F4, 0x22FC); // SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
755
        mirrorChars.put(0x22F6, 0x22FD); // ELEMENT OF WITH OVERBAR
756
        mirrorChars.put(0x22F7, 0x22FE); // SMALL ELEMENT OF WITH OVERBAR
757
        mirrorChars.put(0x22FA, 0x22F2); // CONTAINS WITH LONG HORIZONTAL STROKE
758
        mirrorChars.put(0x22FB, 0x22F3); // CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
759
        mirrorChars.put(0x22FC, 0x22F4); // SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
760
        mirrorChars.put(0x22FD, 0x22F6); // CONTAINS WITH OVERBAR
761
        mirrorChars.put(0x22FE, 0x22F7); // SMALL CONTAINS WITH OVERBAR
762
        mirrorChars.put(0x2308, 0x2309); // LEFT CEILING
763
        mirrorChars.put(0x2309, 0x2308); // RIGHT CEILING
764
        mirrorChars.put(0x230A, 0x230B); // LEFT FLOOR
765
        mirrorChars.put(0x230B, 0x230A); // RIGHT FLOOR
766
        mirrorChars.put(0x2329, 0x232A); // LEFT-POINTING ANGLE BRACKET
767
        mirrorChars.put(0x232A, 0x2329); // RIGHT-POINTING ANGLE BRACKET
768
        mirrorChars.put(0x2768, 0x2769); // MEDIUM LEFT PARENTHESIS ORNAMENT
769
        mirrorChars.put(0x2769, 0x2768); // MEDIUM RIGHT PARENTHESIS ORNAMENT
770
        mirrorChars.put(0x276A, 0x276B); // MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
771
        mirrorChars.put(0x276B, 0x276A); // MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
772
        mirrorChars.put(0x276C, 0x276D); // MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
773
        mirrorChars.put(0x276D, 0x276C); // MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
774
        mirrorChars.put(0x276E, 0x276F); // HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
775
        mirrorChars.put(0x276F, 0x276E); // HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
776
        mirrorChars.put(0x2770, 0x2771); // HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
777
        mirrorChars.put(0x2771, 0x2770); // HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
778
        mirrorChars.put(0x2772, 0x2773); // LIGHT LEFT TORTOISE SHELL BRACKET
779
        mirrorChars.put(0x2773, 0x2772); // LIGHT RIGHT TORTOISE SHELL BRACKET
780
        mirrorChars.put(0x2774, 0x2775); // MEDIUM LEFT CURLY BRACKET ORNAMENT
781
        mirrorChars.put(0x2775, 0x2774); // MEDIUM RIGHT CURLY BRACKET ORNAMENT
782
        mirrorChars.put(0x27D5, 0x27D6); // LEFT OUTER JOIN
783
        mirrorChars.put(0x27D6, 0x27D5); // RIGHT OUTER JOIN
784
        mirrorChars.put(0x27DD, 0x27DE); // LONG RIGHT TACK
785
        mirrorChars.put(0x27DE, 0x27DD); // LONG LEFT TACK
786
        mirrorChars.put(0x27E2, 0x27E3); // WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
787
        mirrorChars.put(0x27E3, 0x27E2); // WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
788
        mirrorChars.put(0x27E4, 0x27E5); // WHITE SQUARE WITH LEFTWARDS TICK
789
        mirrorChars.put(0x27E5, 0x27E4); // WHITE SQUARE WITH RIGHTWARDS TICK
790
        mirrorChars.put(0x27E6, 0x27E7); // MATHEMATICAL LEFT WHITE SQUARE BRACKET
791
        mirrorChars.put(0x27E7, 0x27E6); // MATHEMATICAL RIGHT WHITE SQUARE BRACKET
792
        mirrorChars.put(0x27E8, 0x27E9); // MATHEMATICAL LEFT ANGLE BRACKET
793
        mirrorChars.put(0x27E9, 0x27E8); // MATHEMATICAL RIGHT ANGLE BRACKET
794
        mirrorChars.put(0x27EA, 0x27EB); // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
795
        mirrorChars.put(0x27EB, 0x27EA); // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
796
        mirrorChars.put(0x2983, 0x2984); // LEFT WHITE CURLY BRACKET
797
        mirrorChars.put(0x2984, 0x2983); // RIGHT WHITE CURLY BRACKET
798
        mirrorChars.put(0x2985, 0x2986); // LEFT WHITE PARENTHESIS
799
        mirrorChars.put(0x2986, 0x2985); // RIGHT WHITE PARENTHESIS
800
        mirrorChars.put(0x2987, 0x2988); // Z NOTATION LEFT IMAGE BRACKET
801
        mirrorChars.put(0x2988, 0x2987); // Z NOTATION RIGHT IMAGE BRACKET
802
        mirrorChars.put(0x2989, 0x298A); // Z NOTATION LEFT BINDING BRACKET
803
        mirrorChars.put(0x298A, 0x2989); // Z NOTATION RIGHT BINDING BRACKET
804
        mirrorChars.put(0x298B, 0x298C); // LEFT SQUARE BRACKET WITH UNDERBAR
805
        mirrorChars.put(0x298C, 0x298B); // RIGHT SQUARE BRACKET WITH UNDERBAR
806
        mirrorChars.put(0x298D, 0x2990); // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
807
        mirrorChars.put(0x298E, 0x298F); // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
808
        mirrorChars.put(0x298F, 0x298E); // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
809
        mirrorChars.put(0x2990, 0x298D); // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
810
        mirrorChars.put(0x2991, 0x2992); // LEFT ANGLE BRACKET WITH DOT
811
        mirrorChars.put(0x2992, 0x2991); // RIGHT ANGLE BRACKET WITH DOT
812
        mirrorChars.put(0x2993, 0x2994); // LEFT ARC LESS-THAN BRACKET
813
        mirrorChars.put(0x2994, 0x2993); // RIGHT ARC GREATER-THAN BRACKET
814
        mirrorChars.put(0x2995, 0x2996); // DOUBLE LEFT ARC GREATER-THAN BRACKET
815
        mirrorChars.put(0x2996, 0x2995); // DOUBLE RIGHT ARC LESS-THAN BRACKET
816
        mirrorChars.put(0x2997, 0x2998); // LEFT BLACK TORTOISE SHELL BRACKET
817
        mirrorChars.put(0x2998, 0x2997); // RIGHT BLACK TORTOISE SHELL BRACKET
818
        mirrorChars.put(0x29B8, 0x2298); // CIRCLED REVERSE SOLIDUS
819
        mirrorChars.put(0x29C0, 0x29C1); // CIRCLED LESS-THAN
820
        mirrorChars.put(0x29C1, 0x29C0); // CIRCLED GREATER-THAN
821
        mirrorChars.put(0x29C4, 0x29C5); // SQUARED RISING DIAGONAL SLASH
822
        mirrorChars.put(0x29C5, 0x29C4); // SQUARED FALLING DIAGONAL SLASH
823
        mirrorChars.put(0x29CF, 0x29D0); // LEFT TRIANGLE BESIDE VERTICAL BAR
824
        mirrorChars.put(0x29D0, 0x29CF); // VERTICAL BAR BESIDE RIGHT TRIANGLE
825
        mirrorChars.put(0x29D1, 0x29D2); // BOWTIE WITH LEFT HALF BLACK
826
        mirrorChars.put(0x29D2, 0x29D1); // BOWTIE WITH RIGHT HALF BLACK
827
        mirrorChars.put(0x29D4, 0x29D5); // TIMES WITH LEFT HALF BLACK
828
        mirrorChars.put(0x29D5, 0x29D4); // TIMES WITH RIGHT HALF BLACK
829
        mirrorChars.put(0x29D8, 0x29D9); // LEFT WIGGLY FENCE
830
        mirrorChars.put(0x29D9, 0x29D8); // RIGHT WIGGLY FENCE
831
        mirrorChars.put(0x29DA, 0x29DB); // LEFT DOUBLE WIGGLY FENCE
832
        mirrorChars.put(0x29DB, 0x29DA); // RIGHT DOUBLE WIGGLY FENCE
833
        mirrorChars.put(0x29F5, 0x2215); // REVERSE SOLIDUS OPERATOR
834
        mirrorChars.put(0x29F8, 0x29F9); // BIG SOLIDUS
835
        mirrorChars.put(0x29F9, 0x29F8); // BIG REVERSE SOLIDUS
836
        mirrorChars.put(0x29FC, 0x29FD); // LEFT-POINTING CURVED ANGLE BRACKET
837
        mirrorChars.put(0x29FD, 0x29FC); // RIGHT-POINTING CURVED ANGLE BRACKET
838
        mirrorChars.put(0x2A2B, 0x2A2C); // MINUS SIGN WITH FALLING DOTS
839
        mirrorChars.put(0x2A2C, 0x2A2B); // MINUS SIGN WITH RISING DOTS
840
        mirrorChars.put(0x2A2D, 0x2A2C); // PLUS SIGN IN LEFT HALF CIRCLE
841
        mirrorChars.put(0x2A2E, 0x2A2D); // PLUS SIGN IN RIGHT HALF CIRCLE
842
        mirrorChars.put(0x2A34, 0x2A35); // MULTIPLICATION SIGN IN LEFT HALF CIRCLE
843
        mirrorChars.put(0x2A35, 0x2A34); // MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
844
        mirrorChars.put(0x2A3C, 0x2A3D); // INTERIOR PRODUCT
845
        mirrorChars.put(0x2A3D, 0x2A3C); // RIGHTHAND INTERIOR PRODUCT
846
        mirrorChars.put(0x2A64, 0x2A65); // Z NOTATION DOMAIN ANTIRESTRICTION
847
        mirrorChars.put(0x2A65, 0x2A64); // Z NOTATION RANGE ANTIRESTRICTION
848
        mirrorChars.put(0x2A79, 0x2A7A); // LESS-THAN WITH CIRCLE INSIDE
849
        mirrorChars.put(0x2A7A, 0x2A79); // GREATER-THAN WITH CIRCLE INSIDE
850
        mirrorChars.put(0x2A7D, 0x2A7E); // LESS-THAN OR SLANTED EQUAL TO
851
        mirrorChars.put(0x2A7E, 0x2A7D); // GREATER-THAN OR SLANTED EQUAL TO
852
        mirrorChars.put(0x2A7F, 0x2A80); // LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
853
        mirrorChars.put(0x2A80, 0x2A7F); // GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
854
        mirrorChars.put(0x2A81, 0x2A82); // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
855
        mirrorChars.put(0x2A82, 0x2A81); // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
856
        mirrorChars.put(0x2A83, 0x2A84); // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
857
        mirrorChars.put(0x2A84, 0x2A83); // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
858
        mirrorChars.put(0x2A8B, 0x2A8C); // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
859
        mirrorChars.put(0x2A8C, 0x2A8B); // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
860
        mirrorChars.put(0x2A91, 0x2A92); // LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
861
        mirrorChars.put(0x2A92, 0x2A91); // GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
862
        mirrorChars.put(0x2A93, 0x2A94); // LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
863
        mirrorChars.put(0x2A94, 0x2A93); // GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
864
        mirrorChars.put(0x2A95, 0x2A96); // SLANTED EQUAL TO OR LESS-THAN
865
        mirrorChars.put(0x2A96, 0x2A95); // SLANTED EQUAL TO OR GREATER-THAN
866
        mirrorChars.put(0x2A97, 0x2A98); // SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
867
        mirrorChars.put(0x2A98, 0x2A97); // SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
868
        mirrorChars.put(0x2A99, 0x2A9A); // DOUBLE-LINE EQUAL TO OR LESS-THAN
869
        mirrorChars.put(0x2A9A, 0x2A99); // DOUBLE-LINE EQUAL TO OR GREATER-THAN
870
        mirrorChars.put(0x2A9B, 0x2A9C); // DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
871
        mirrorChars.put(0x2A9C, 0x2A9B); // DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
872
        mirrorChars.put(0x2AA1, 0x2AA2); // DOUBLE NESTED LESS-THAN
873
        mirrorChars.put(0x2AA2, 0x2AA1); // DOUBLE NESTED GREATER-THAN
874
        mirrorChars.put(0x2AA6, 0x2AA7); // LESS-THAN CLOSED BY CURVE
875
        mirrorChars.put(0x2AA7, 0x2AA6); // GREATER-THAN CLOSED BY CURVE
876
        mirrorChars.put(0x2AA8, 0x2AA9); // LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
877
        mirrorChars.put(0x2AA9, 0x2AA8); // GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
878
        mirrorChars.put(0x2AAA, 0x2AAB); // SMALLER THAN
879
        mirrorChars.put(0x2AAB, 0x2AAA); // LARGER THAN
880
        mirrorChars.put(0x2AAC, 0x2AAD); // SMALLER THAN OR EQUAL TO
881
        mirrorChars.put(0x2AAD, 0x2AAC); // LARGER THAN OR EQUAL TO
882
        mirrorChars.put(0x2AAF, 0x2AB0); // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
883
        mirrorChars.put(0x2AB0, 0x2AAF); // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
884
        mirrorChars.put(0x2AB3, 0x2AB4); // PRECEDES ABOVE EQUALS SIGN
885
        mirrorChars.put(0x2AB4, 0x2AB3); // SUCCEEDS ABOVE EQUALS SIGN
886
        mirrorChars.put(0x2ABB, 0x2ABC); // DOUBLE PRECEDES
887
        mirrorChars.put(0x2ABC, 0x2ABB); // DOUBLE SUCCEEDS
888
        mirrorChars.put(0x2ABD, 0x2ABE); // SUBSET WITH DOT
889
        mirrorChars.put(0x2ABE, 0x2ABD); // SUPERSET WITH DOT
890
        mirrorChars.put(0x2ABF, 0x2AC0); // SUBSET WITH PLUS SIGN BELOW
891
        mirrorChars.put(0x2AC0, 0x2ABF); // SUPERSET WITH PLUS SIGN BELOW
892
        mirrorChars.put(0x2AC1, 0x2AC2); // SUBSET WITH MULTIPLICATION SIGN BELOW
893
        mirrorChars.put(0x2AC2, 0x2AC1); // SUPERSET WITH MULTIPLICATION SIGN BELOW
894
        mirrorChars.put(0x2AC3, 0x2AC4); // SUBSET OF OR EQUAL TO WITH DOT ABOVE
895
        mirrorChars.put(0x2AC4, 0x2AC3); // SUPERSET OF OR EQUAL TO WITH DOT ABOVE
896
        mirrorChars.put(0x2AC5, 0x2AC6); // SUBSET OF ABOVE EQUALS SIGN
897
        mirrorChars.put(0x2AC6, 0x2AC5); // SUPERSET OF ABOVE EQUALS SIGN
898
        mirrorChars.put(0x2ACD, 0x2ACE); // SQUARE LEFT OPEN BOX OPERATOR
899
        mirrorChars.put(0x2ACE, 0x2ACD); // SQUARE RIGHT OPEN BOX OPERATOR
900
        mirrorChars.put(0x2ACF, 0x2AD0); // CLOSED SUBSET
901
        mirrorChars.put(0x2AD0, 0x2ACF); // CLOSED SUPERSET
902
        mirrorChars.put(0x2AD1, 0x2AD2); // CLOSED SUBSET OR EQUAL TO
903
        mirrorChars.put(0x2AD2, 0x2AD1); // CLOSED SUPERSET OR EQUAL TO
904
        mirrorChars.put(0x2AD3, 0x2AD4); // SUBSET ABOVE SUPERSET
905
        mirrorChars.put(0x2AD4, 0x2AD3); // SUPERSET ABOVE SUBSET
906
        mirrorChars.put(0x2AD5, 0x2AD6); // SUBSET ABOVE SUBSET
907
        mirrorChars.put(0x2AD6, 0x2AD5); // SUPERSET ABOVE SUPERSET
908
        mirrorChars.put(0x2ADE, 0x22A6); // SHORT LEFT TACK
909
        mirrorChars.put(0x2AE3, 0x22A9); // DOUBLE VERTICAL BAR LEFT TURNSTILE
910
        mirrorChars.put(0x2AE4, 0x22A8); // VERTICAL BAR DOUBLE LEFT TURNSTILE
911
        mirrorChars.put(0x2AE5, 0x22AB); // DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
912
        mirrorChars.put(0x2AEC, 0x2AED); // DOUBLE STROKE NOT SIGN
913
        mirrorChars.put(0x2AED, 0x2AEC); // REVERSED DOUBLE STROKE NOT SIGN
914
        mirrorChars.put(0x2AF7, 0x2AF8); // TRIPLE NESTED LESS-THAN
915
        mirrorChars.put(0x2AF8, 0x2AF7); // TRIPLE NESTED GREATER-THAN
916
        mirrorChars.put(0x2AF9, 0x2AFA); // DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
917
        mirrorChars.put(0x2AFA, 0x2AF9); // DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
918
        mirrorChars.put(0x3008, 0x3009); // LEFT ANGLE BRACKET
919
        mirrorChars.put(0x3009, 0x3008); // RIGHT ANGLE BRACKET
920
        mirrorChars.put(0x300A, 0x300B); // LEFT DOUBLE ANGLE BRACKET
921
        mirrorChars.put(0x300B, 0x300A); // RIGHT DOUBLE ANGLE BRACKET
922
        mirrorChars.put(0x300C, 0x300D); // [BEST FIT] LEFT CORNER BRACKET
923
        mirrorChars.put(0x300D, 0x300C); // [BEST FIT] RIGHT CORNER BRACKET
924
        mirrorChars.put(0x300E, 0x300F); // [BEST FIT] LEFT WHITE CORNER BRACKET
925
        mirrorChars.put(0x300F, 0x300E); // [BEST FIT] RIGHT WHITE CORNER BRACKET
926
        mirrorChars.put(0x3010, 0x3011); // LEFT BLACK LENTICULAR BRACKET
927
        mirrorChars.put(0x3011, 0x3010); // RIGHT BLACK LENTICULAR BRACKET
928
        mirrorChars.put(0x3014, 0x3015); // LEFT TORTOISE SHELL BRACKET
929
        mirrorChars.put(0x3015, 0x3014); // RIGHT TORTOISE SHELL BRACKET
930
        mirrorChars.put(0x3016, 0x3017); // LEFT WHITE LENTICULAR BRACKET
931
        mirrorChars.put(0x3017, 0x3016); // RIGHT WHITE LENTICULAR BRACKET
932
        mirrorChars.put(0x3018, 0x3019); // LEFT WHITE TORTOISE SHELL BRACKET
933
        mirrorChars.put(0x3019, 0x3018); // RIGHT WHITE TORTOISE SHELL BRACKET
934
        mirrorChars.put(0x301A, 0x301B); // LEFT WHITE SQUARE BRACKET
935
        mirrorChars.put(0x301B, 0x301A); // RIGHT WHITE SQUARE BRACKET
936
        mirrorChars.put(0xFF08, 0xFF09); // FULLWIDTH LEFT PARENTHESIS
937
        mirrorChars.put(0xFF09, 0xFF08); // FULLWIDTH RIGHT PARENTHESIS
938
        mirrorChars.put(0xFF1C, 0xFF1E); // FULLWIDTH LESS-THAN SIGN
939
        mirrorChars.put(0xFF1E, 0xFF1C); // FULLWIDTH GREATER-THAN SIGN
940
        mirrorChars.put(0xFF3B, 0xFF3D); // FULLWIDTH LEFT SQUARE BRACKET
941
        mirrorChars.put(0xFF3D, 0xFF3B); // FULLWIDTH RIGHT SQUARE BRACKET
942
        mirrorChars.put(0xFF5B, 0xFF5D); // FULLWIDTH LEFT CURLY BRACKET
943
        mirrorChars.put(0xFF5D, 0xFF5B); // FULLWIDTH RIGHT CURLY BRACKET
944
        mirrorChars.put(0xFF5F, 0xFF60); // FULLWIDTH LEFT WHITE PARENTHESIS
945
        mirrorChars.put(0xFF60, 0xFF5F); // FULLWIDTH RIGHT WHITE PARENTHESIS
946
        mirrorChars.put(0xFF62, 0xFF63); // [BEST FIT] HALFWIDTH LEFT CORNER BRACKET
947
        mirrorChars.put(0xFF63, 0xFF62); // [BEST FIT] HALFWIDTH RIGHT CORNER BRACKET
948
    }
949
}

Mutations

130

1.1
Location : isEmpty
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : isEmpty
Killed by : none
changed conditional boundary → NO_COVERAGE

3.3
Location : isEmpty
Killed by : none
negated conditional → NO_COVERAGE

4.4
Location : isEmpty
Killed by : none
negated conditional → NO_COVERAGE

5.5
Location : isEmpty
Killed by : none
replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE

134

1.1
Location : clearChunks
Killed by : none
removed call to java/util/ArrayList::clear → NO_COVERAGE

147

1.1
Location : getParagraph
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : getParagraph
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

3.3
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

152

1.1
Location : getParagraph
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : getParagraph
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

3.3
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

155

1.1
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

157

1.1
Location : getParagraph
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : getParagraph
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

3.3
Location : getParagraph
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

4.4
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

5.5
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

6.6
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

158

1.1
Location : getParagraph
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

159

1.1
Location : getParagraph
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

160

1.1
Location : getParagraph
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

162

1.1
Location : getParagraph
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

165

1.1
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

169

1.1
Location : getParagraph
Killed by : none
removed call to com/lowagie/text/pdf/BidiLine::addPiece → NO_COVERAGE

171

1.1
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

175

1.1
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

176

1.1
Location : getParagraph
Killed by : none
replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE

179

1.1
Location : getParagraph
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : getParagraph
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

180

1.1
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

181

1.1
Location : getParagraph
Killed by : none
replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE

184

1.1
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

185

1.1
Location : getParagraph
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

189

1.1
Location : getParagraph
Killed by : none
removed call to com/lowagie/text/pdf/ArabicLigaturizer::processNumbers → NO_COVERAGE

190

1.1
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

192

1.1
Location : getParagraph
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : getParagraph
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : getParagraph
Killed by : none
negated conditional → NO_COVERAGE

196

1.1
Location : getParagraph
Killed by : none
removed call to com/lowagie/text/pdf/BidiLine::doArabicShapping → NO_COVERAGE

197

1.1
Location : getParagraph
Killed by : none
removed call to com/lowagie/text/pdf/BidiLine::mirrorGlyphs → NO_COVERAGE

200

1.1
Location : getParagraph
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : getParagraph
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

201

1.1
Location : getParagraph
Killed by : none
replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE

213

1.1
Location : addPiece
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : addPiece
Killed by : none
negated conditional → NO_COVERAGE

216

1.1
Location : addPiece
Killed by : none
Replaced integer multiplication with division → NO_COVERAGE

219

1.1
Location : addPiece
Killed by : none
removed call to java/lang/System::arraycopy → NO_COVERAGE

220

1.1
Location : addPiece
Killed by : none
removed call to java/lang/System::arraycopy → NO_COVERAGE

223

1.1
Location : addPiece
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

227

1.1
Location : save
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : save
Killed by : none
negated conditional → NO_COVERAGE

228

1.1
Location : save
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : save
Killed by : none
negated conditional → NO_COVERAGE

229

1.1
Location : save
Killed by : none
removed call to java/util/ArrayList::clear → NO_COVERAGE

231

1.1
Location : save
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : save
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

3.3
Location : save
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

4.4
Location : save
Killed by : none
negated conditional → NO_COVERAGE

241

1.1
Location : save
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : save
Killed by : none
negated conditional → NO_COVERAGE

242

1.1
Location : save
Killed by : none
negated conditional → NO_COVERAGE

244

1.1
Location : save
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : save
Killed by : none
negated conditional → NO_COVERAGE

248

1.1
Location : save
Killed by : none
removed call to java/lang/System::arraycopy → NO_COVERAGE

249

1.1
Location : save
Killed by : none
removed call to java/lang/System::arraycopy → NO_COVERAGE

251

1.1
Location : save
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : save
Killed by : none
negated conditional → NO_COVERAGE

252

1.1
Location : save
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : save
Killed by : none
negated conditional → NO_COVERAGE

256

1.1
Location : save
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : save
Killed by : none
removed call to java/lang/System::arraycopy → NO_COVERAGE

257

1.1
Location : save
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : save
Killed by : none
removed call to java/lang/System::arraycopy → NO_COVERAGE

267

1.1
Location : restore
Killed by : none
negated conditional → NO_COVERAGE

269

1.1
Location : restore
Killed by : none
removed call to java/lang/System::arraycopy → NO_COVERAGE

270

1.1
Location : restore
Killed by : none
removed call to java/lang/System::arraycopy → NO_COVERAGE

272

1.1
Location : restore
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : restore
Killed by : none
negated conditional → NO_COVERAGE

273

1.1
Location : restore
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : restore
Killed by : none
removed call to java/lang/System::arraycopy → NO_COVERAGE

274

1.1
Location : restore
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : restore
Killed by : none
removed call to java/lang/System::arraycopy → NO_COVERAGE

279

1.1
Location : mirrorGlyphs
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : mirrorGlyphs
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : mirrorGlyphs
Killed by : none
negated conditional → NO_COVERAGE

280

1.1
Location : mirrorGlyphs
Killed by : none
Replaced bitwise AND with OR → NO_COVERAGE

2.2
Location : mirrorGlyphs
Killed by : none
negated conditional → NO_COVERAGE

282

1.1
Location : mirrorGlyphs
Killed by : none
negated conditional → NO_COVERAGE

292

1.1
Location : doArabicShapping
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : doArabicShapping
Killed by : none
negated conditional → NO_COVERAGE

294

1.1
Location : doArabicShapping
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : doArabicShapping
Killed by : none
changed conditional boundary → NO_COVERAGE

3.3
Location : doArabicShapping
Killed by : none
negated conditional → NO_COVERAGE

4.4
Location : doArabicShapping
Killed by : none
negated conditional → NO_COVERAGE

296

1.1
Location : doArabicShapping
Killed by : none
negated conditional → NO_COVERAGE

301

1.1
Location : doArabicShapping
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

302

1.1
Location : doArabicShapping
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

304

1.1
Location : doArabicShapping
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : doArabicShapping
Killed by : none
negated conditional → NO_COVERAGE

309

1.1
Location : doArabicShapping
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

310

1.1
Location : doArabicShapping
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : doArabicShapping
Killed by : none
negated conditional → NO_COVERAGE

312

1.1
Location : doArabicShapping
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : doArabicShapping
Killed by : none
changed conditional boundary → NO_COVERAGE

3.3
Location : doArabicShapping
Killed by : none
negated conditional → NO_COVERAGE

4.4
Location : doArabicShapping
Killed by : none
negated conditional → NO_COVERAGE

314

1.1
Location : doArabicShapping
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

316

1.1
Location : doArabicShapping
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

318

1.1
Location : doArabicShapping
Killed by : none
negated conditional → NO_COVERAGE

319

1.1
Location : doArabicShapping
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : doArabicShapping
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : doArabicShapping
Killed by : none
negated conditional → NO_COVERAGE

321

1.1
Location : doArabicShapping
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

2.2
Location : doArabicShapping
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

325

1.1
Location : doArabicShapping
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

331

1.1
Location : processLine
Killed by : none
removed call to com/lowagie/text/pdf/BidiLine::save → NO_COVERAGE

332

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

333

1.1
Location : processLine
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

335

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

336

1.1
Location : processLine
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

337

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

341

1.1
Location : processLine
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

346

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

347

1.1
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

355

1.1
Location : processLine
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : processLine
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

3.3
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

358

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

362

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

364

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

369

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

371

1.1
Location : processLine
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : processLine
Killed by : none
Replaced float subtraction with addition → NO_COVERAGE

3.3
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

373

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

375

1.1
Location : processLine
Killed by : none
Replaced float subtraction with addition → NO_COVERAGE

377

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

381

1.1
Location : processLine
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : processLine
Killed by : none
Replaced float subtraction with addition → NO_COVERAGE

3.3
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

4.4
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

382

1.1
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : processLine
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

384

1.1
Location : processLine
Killed by : none
removed call to com/lowagie/text/pdf/PdfChunk::adjustLeft → NO_COVERAGE

385

1.1
Location : processLine
Killed by : none
Replaced float subtraction with addition → NO_COVERAGE

387

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

388

1.1
Location : processLine
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

390

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

392

1.1
Location : processLine
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

393

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

394

1.1
Location : processLine
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

395

1.1
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

3.3
Location : processLine
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

397

1.1
Location : processLine
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

399

1.1
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : processLine
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

401

1.1
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

402

1.1
Location : processLine
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

404

1.1
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : processLine
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

406

1.1
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

408

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

410

1.1
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

411

1.1
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : processLine
Killed by : none
Replaced float addition with subtraction → NO_COVERAGE

412

1.1
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

414

1.1
Location : processLine
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

416

1.1
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

417

1.1
Location : processLine
Killed by : none
Replaced float subtraction with addition → NO_COVERAGE

2.2
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

3.3
Location : processLine
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

422

1.1
Location : processLine
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

3.3
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

424

1.1
Location : processLine
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

2.2
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

3.3
Location : processLine
Killed by : none
Replaced float addition with subtraction → NO_COVERAGE

4.4
Location : processLine
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

427

1.1
Location : processLine
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

429

1.1
Location : processLine
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : processLine
Killed by : none
negated conditional → NO_COVERAGE

431

1.1
Location : processLine
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

433

1.1
Location : processLine
Killed by : none
Replaced float subtraction with addition → NO_COVERAGE

2.2
Location : processLine
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::processLine to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

446

1.1
Location : getWidth
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : getWidth
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : getWidth
Killed by : none
negated conditional → NO_COVERAGE

448

1.1
Location : getWidth
Killed by : none
negated conditional → NO_COVERAGE

449

1.1
Location : getWidth
Killed by : none
Replaced float addition with subtraction → NO_COVERAGE

450

1.1
Location : getWidth
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

455

1.1
Location : getWidth
Killed by : none
negated conditional → NO_COVERAGE

457

1.1
Location : getWidth
Killed by : none
Replaced float addition with subtraction → NO_COVERAGE

460

1.1
Location : getWidth
Killed by : none
replaced return of float value with -(x + 1) for com/lowagie/text/pdf/BidiLine::getWidth → NO_COVERAGE

464

1.1
Location : createArrayOfPdfChunks
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::createArrayOfPdfChunks to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

468

1.1
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

469

1.1
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

470

1.1
Location : createArrayOfPdfChunks
Killed by : none
removed call to com/lowagie/text/pdf/BidiLine::reorder → NO_COVERAGE

477

1.1
Location : createArrayOfPdfChunks
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : createArrayOfPdfChunks
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

478

1.1
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

481

1.1
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

483

1.1
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

3.3
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

484

1.1
Location : createArrayOfPdfChunks
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

490

1.1
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

494

1.1
Location : createArrayOfPdfChunks
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

498

1.1
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

3.3
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

503

1.1
Location : createArrayOfPdfChunks
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

506

1.1
Location : createArrayOfPdfChunks
Killed by : none
negated conditional → NO_COVERAGE

508

1.1
Location : createArrayOfPdfChunks
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::createArrayOfPdfChunks to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

515

1.1
Location : getWord
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : getWord
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : getWord
Killed by : none
negated conditional → NO_COVERAGE

516

1.1
Location : getWord
Killed by : none
negated conditional → NO_COVERAGE

519

1.1
Location : getWord
Killed by : none
negated conditional → NO_COVERAGE

520

1.1
Location : getWord
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::getWord to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

522

1.1
Location : getWord
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : getWord
Killed by : none
Changed increment from -1 to 1 → NO_COVERAGE

3.3
Location : getWord
Killed by : none
negated conditional → NO_COVERAGE

523

1.1
Location : getWord
Killed by : none
negated conditional → NO_COVERAGE

526

1.1
Location : getWord
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

527

1.1
Location : getWord
Killed by : none
mutated return of Object value for com/lowagie/text/pdf/BidiLine::getWord to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE

533

1.1
Location : trimRight
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : trimRight
Killed by : none
Changed increment from -1 to 1 → NO_COVERAGE

3.3
Location : trimRight
Killed by : none
negated conditional → NO_COVERAGE

535

1.1
Location : trimRight
Killed by : none
negated conditional → NO_COVERAGE

538

1.1
Location : trimRight
Killed by : none
replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE

544

1.1
Location : trimLeft
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : trimLeft
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : trimLeft
Killed by : none
negated conditional → NO_COVERAGE

546

1.1
Location : trimLeft
Killed by : none
negated conditional → NO_COVERAGE

549

1.1
Location : trimLeft
Killed by : none
replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE

555

1.1
Location : trimRightEx
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : trimRightEx
Killed by : none
Changed increment from -1 to 1 → NO_COVERAGE

3.3
Location : trimRightEx
Killed by : none
negated conditional → NO_COVERAGE

557

1.1
Location : trimRightEx
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : trimRightEx
Killed by : none
negated conditional → NO_COVERAGE

560

1.1
Location : trimRightEx
Killed by : none
replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE

566

1.1
Location : trimLeftEx
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : trimLeftEx
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : trimLeftEx
Killed by : none
negated conditional → NO_COVERAGE

568

1.1
Location : trimLeftEx
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : trimLeftEx
Killed by : none
negated conditional → NO_COVERAGE

571

1.1
Location : trimLeftEx
Killed by : none
replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE

579

1.1
Location : reorder
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : reorder
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : reorder
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

4.4
Location : reorder
Killed by : none
negated conditional → NO_COVERAGE

581

1.1
Location : reorder
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : reorder
Killed by : none
negated conditional → NO_COVERAGE

583

1.1
Location : reorder
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : reorder
Killed by : none
negated conditional → NO_COVERAGE

585

1.1
Location : reorder
Killed by : none
Replaced bitwise AND with OR → NO_COVERAGE

586

1.1
Location : reorder
Killed by : none
Replaced bitwise OR with AND → NO_COVERAGE

588

1.1
Location : reorder
Killed by : none
Replaced bitwise AND with OR → NO_COVERAGE

2.2
Location : reorder
Killed by : none
negated conditional → NO_COVERAGE

590

1.1
Location : reorder
Killed by : none
Replaced bitwise AND with OR → NO_COVERAGE

2.2
Location : reorder
Killed by : none
negated conditional → NO_COVERAGE

591

1.1
Location : reorder
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

2.2
Location : reorder
Killed by : none
removed call to com/lowagie/text/pdf/BidiLine::flip → NO_COVERAGE

594

1.1
Location : reorder
Killed by : none
Replaced bitwise OR with AND → NO_COVERAGE

595

1.1
Location : reorder
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : reorder
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

3.3
Location : reorder
Killed by : none
negated conditional → NO_COVERAGE

598

1.1
Location : reorder
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : reorder
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : reorder
Killed by : none
negated conditional → NO_COVERAGE

599

1.1
Location : reorder
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : reorder
Killed by : none
negated conditional → NO_COVERAGE

602

1.1
Location : reorder
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : reorder
Killed by : none
negated conditional → NO_COVERAGE

604

1.1
Location : reorder
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

605

1.1
Location : reorder
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : reorder
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : reorder
Killed by : none
negated conditional → NO_COVERAGE

606

1.1
Location : reorder
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : reorder
Killed by : none
negated conditional → NO_COVERAGE

609

1.1
Location : reorder
Killed by : none
removed call to com/lowagie/text/pdf/BidiLine::flip → NO_COVERAGE

610

1.1
Location : reorder
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

616

1.1
Location : flip
Killed by : none
Replaced integer addition with subtraction → NO_COVERAGE

2.2
Location : flip
Killed by : none
Replaced integer division with multiplication → NO_COVERAGE

617

1.1
Location : flip
Killed by : none
Changed increment from -1 to 1 → NO_COVERAGE

618

1.1
Location : flip
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : flip
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

3.3
Location : flip
Killed by : none
Changed increment from -1 to 1 → NO_COVERAGE

4.4
Location : flip
Killed by : none
negated conditional → NO_COVERAGE

626

1.1
Location : isWS
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : isWS
Killed by : none
negated conditional → NO_COVERAGE

3.3
Location : isWS
Killed by : none
replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE

Active mutators

Tests examined


Report generated by PIT 1.4.2