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 2.2 3.3 4.4 5.5 |
|
134 |
1.1 |
|
147 |
1.1 2.2 3.3 |
|
152 |
1.1 2.2 3.3 |
|
155 |
1.1 2.2 |
|
157 |
1.1 2.2 3.3 4.4 5.5 6.6 |
|
158 |
1.1 |
|
159 |
1.1 |
|
160 |
1.1 2.2 |
|
162 |
1.1 |
|
165 |
1.1 |
|
169 |
1.1 |
|
171 |
1.1 |
|
175 |
1.1 |
|
176 |
1.1 |
|
179 |
1.1 2.2 |
|
180 |
1.1 |
|
181 |
1.1 |
|
184 |
1.1 2.2 |
|
185 |
1.1 2.2 |
|
189 |
1.1 |
|
190 |
1.1 |
|
192 |
1.1 2.2 3.3 |
|
196 |
1.1 |
|
197 |
1.1 |
|
200 |
1.1 2.2 |
|
201 |
1.1 |
|
213 |
1.1 2.2 |
|
216 |
1.1 |
|
219 |
1.1 |
|
220 |
1.1 |
|
223 |
1.1 |
|
227 |
1.1 2.2 |
|
228 |
1.1 2.2 |
|
229 |
1.1 |
|
231 |
1.1 2.2 3.3 4.4 |
|
241 |
1.1 2.2 |
|
242 |
1.1 |
|
244 |
1.1 2.2 |
|
248 |
1.1 |
|
249 |
1.1 |
|
251 |
1.1 2.2 |
|
252 |
1.1 2.2 |
|
256 |
1.1 2.2 |
|
257 |
1.1 2.2 |
|
267 |
1.1 |
|
269 |
1.1 |
|
270 |
1.1 |
|
272 |
1.1 2.2 |
|
273 |
1.1 2.2 |
|
274 |
1.1 2.2 |
|
279 |
1.1 2.2 3.3 |
|
280 |
1.1 2.2 |
|
282 |
1.1 |
|
292 |
1.1 2.2 |
|
294 |
1.1 2.2 3.3 4.4 |
|
296 |
1.1 |
|
301 |
1.1 |
|
302 |
1.1 |
|
304 |
1.1 2.2 |
|
309 |
1.1 |
|
310 |
1.1 2.2 |
|
312 |
1.1 2.2 3.3 4.4 |
|
314 |
1.1 |
|
316 |
1.1 |
|
318 |
1.1 |
|
319 |
1.1 2.2 3.3 |
|
321 |
1.1 2.2 |
|
325 |
1.1 |
|
331 |
1.1 |
|
332 |
1.1 |
|
333 |
1.1 2.2 |
|
335 |
1.1 |
|
336 |
1.1 |
|
337 |
1.1 |
|
341 |
1.1 |
|
346 |
1.1 |
|
347 |
1.1 |
|
355 |
1.1 2.2 3.3 |
|
358 |
1.1 |
|
362 |
1.1 |
|
364 |
1.1 |
|
369 |
1.1 2.2 |
|
371 |
1.1 2.2 3.3 |
|
373 |
1.1 |
|
375 |
1.1 |
|
377 |
1.1 |
|
381 |
1.1 2.2 3.3 4.4 |
|
382 |
1.1 2.2 |
|
384 |
1.1 |
|
385 |
1.1 |
|
387 |
1.1 |
|
388 |
1.1 |
|
390 |
1.1 |
|
392 |
1.1 |
|
393 |
1.1 |
|
394 |
1.1 |
|
395 |
1.1 2.2 3.3 |
|
397 |
1.1 2.2 |
|
399 |
1.1 2.2 |
|
401 |
1.1 |
|
402 |
1.1 2.2 |
|
404 |
1.1 2.2 |
|
406 |
1.1 2.2 |
|
408 |
1.1 |
|
410 |
1.1 |
|
411 |
1.1 2.2 |
|
412 |
1.1 |
|
414 |
1.1 2.2 |
|
416 |
1.1 |
|
417 |
1.1 2.2 3.3 |
|
422 |
1.1 2.2 3.3 |
|
424 |
1.1 2.2 3.3 4.4 |
|
427 |
1.1 |
|
429 |
1.1 2.2 |
|
431 |
1.1 |
|
433 |
1.1 2.2 |
|
446 |
1.1 2.2 3.3 |
|
448 |
1.1 |
|
449 |
1.1 |
|
450 |
1.1 |
|
455 |
1.1 |
|
457 |
1.1 |
|
460 |
1.1 |
|
464 |
1.1 |
|
468 |
1.1 2.2 |
|
469 |
1.1 |
|
470 |
1.1 |
|
477 |
1.1 2.2 3.3 |
|
478 |
1.1 |
|
481 |
1.1 |
|
483 |
1.1 2.2 3.3 |
|
484 |
1.1 2.2 |
|
490 |
1.1 |
|
494 |
1.1 2.2 |
|
498 |
1.1 2.2 3.3 |
|
503 |
1.1 2.2 |
|
506 |
1.1 |
|
508 |
1.1 |
|
515 |
1.1 2.2 3.3 |
|
516 |
1.1 |
|
519 |
1.1 |
|
520 |
1.1 |
|
522 |
1.1 2.2 3.3 |
|
523 |
1.1 |
|
526 |
1.1 |
|
527 |
1.1 |
|
533 |
1.1 2.2 3.3 |
|
535 |
1.1 |
|
538 |
1.1 |
|
544 |
1.1 2.2 3.3 |
|
546 |
1.1 |
|
549 |
1.1 |
|
555 |
1.1 2.2 3.3 |
|
557 |
1.1 2.2 |
|
560 |
1.1 |
|
566 |
1.1 2.2 3.3 |
|
568 |
1.1 2.2 |
|
571 |
1.1 |
|
579 |
1.1 2.2 3.3 4.4 |
|
581 |
1.1 2.2 |
|
583 |
1.1 2.2 |
|
585 |
1.1 |
|
586 |
1.1 |
|
588 |
1.1 2.2 |
|
590 |
1.1 2.2 |
|
591 |
1.1 2.2 |
|
594 |
1.1 |
|
595 |
1.1 2.2 3.3 |
|
598 |
1.1 2.2 3.3 |
|
599 |
1.1 2.2 |
|
602 |
1.1 2.2 |
|
604 |
1.1 |
|
605 |
1.1 2.2 3.3 |
|
606 |
1.1 2.2 |
|
609 |
1.1 |
|
610 |
1.1 |
|
616 |
1.1 2.2 |
|
617 |
1.1 |
|
618 |
1.1 2.2 3.3 4.4 |
|
626 |
1.1 2.2 3.3 |