1 | /* | |
2 | * $Id: Pfm2afm.java 4065 2009-09-16 23:09:11Z psoares33 $ | |
3 | * | |
4 | * Copyright 1991 Ken Borgendale | |
5 | * | |
6 | * The contents of this file are subject to the Mozilla Public License Version 1.1 | |
7 | * (the "License"); you may not use this file except in compliance with the License. | |
8 | * You may obtain a copy of the License at http://www.mozilla.org/MPL/ | |
9 | * | |
10 | * Software distributed under the License is distributed on an "AS IS" basis, | |
11 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | |
12 | * for the specific language governing rights and limitations under the License. | |
13 | * | |
14 | * The Original Code is 'iText, a free JAVA-PDF library'. | |
15 | * | |
16 | * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by | |
17 | * the Initial Developer are Copyright (C) 1999-2007 by Bruno Lowagie. | |
18 | * All Rights Reserved. | |
19 | * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer | |
20 | * are Copyright (C) 2000-2007 by Paulo Soares. All Rights Reserved. | |
21 | * | |
22 | * Contributor(s): all the names of the contributors are added in the source code | |
23 | * where applicable. | |
24 | * | |
25 | * Alternatively, the contents of this file may be used under the terms of the | |
26 | * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the | |
27 | * provisions of LGPL are applicable instead of those above. If you wish to | |
28 | * allow use of your version of this file only under the terms of the LGPL | |
29 | * License and not to allow others to use your version of this file under | |
30 | * the MPL, indicate your decision by deleting the provisions above and | |
31 | * replace them with the notice and other provisions required by the LGPL. | |
32 | * If you do not delete the provisions above, a recipient may use your version | |
33 | * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE. | |
34 | * | |
35 | * This library is free software; you can redistribute it and/or modify it | |
36 | * under the terms of the MPL as stated above or under the terms of the GNU | |
37 | * Library General Public License as published by the Free Software Foundation; | |
38 | * either version 2 of the License, or any later version. | |
39 | * | |
40 | * This library is distributed in the hope that it will be useful, but WITHOUT | |
41 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
42 | * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more | |
43 | * details. | |
44 | * | |
45 | * If you didn't download this code from the following link, you should check if | |
46 | * you aren't using an obsolete version: | |
47 | * http://www.lowagie.com/iText/ | |
48 | */ | |
49 | /******************************************************************** | |
50 | * * | |
51 | * Title: pfm2afm - Convert Windows .pfm files to .afm files * | |
52 | * * | |
53 | * Author: Ken Borgendale 10/9/91 Version 1.0 * | |
54 | * * | |
55 | * Function: * | |
56 | * Convert a Windows .pfm (Printer Font Metrics) file to a * | |
57 | * .afm (Adobe Font Metrics) file. The purpose of this is * | |
58 | * to allow fonts put out for Windows to be used with OS/2. * | |
59 | * * | |
60 | * Syntax: * | |
61 | * pfm2afm infile [outfile] -a * | |
62 | * * | |
63 | * Copyright: * | |
64 | * pfm2afm - Copyright (C) IBM Corp., 1991 * | |
65 | * * | |
66 | * This code is released for public use as long as the * | |
67 | * copyright remains intact. This code is provided asis * | |
68 | * without any warrenties, express or implied. * | |
69 | * * | |
70 | * Notes: * | |
71 | * 1. Much of the information in the original .afm file is * | |
72 | * lost when the .pfm file is created, and thus cannot be * | |
73 | * reconstructed by this utility. This is especially true * | |
74 | * of data for characters not in the Windows character set. * | |
75 | * * | |
76 | * 2. This module is coded to be compiled by the MSC 6.0. * | |
77 | * For other compilers, be careful of the packing of the * | |
78 | * PFM structure. * | |
79 | * * | |
80 | ********************************************************************/ | |
81 | ||
82 | /******************************************************************** | |
83 | * * | |
84 | * Modifications by Rod Smith, 5/22/96 * | |
85 | * * | |
86 | * These changes look for the strings "italic", "bold", "black", * | |
87 | * and "light" in the font's name and set the weight accordingly * | |
88 | * and adds an ItalicAngle line with a value of "0" or "-12.00". * | |
89 | * This allows OS/2 programs such as DeScribe to handle the bold * | |
90 | * and italic attributes appropriately, which was not the case * | |
91 | * when I used the original version on fonts from the KeyFonts * | |
92 | * Pro 2002 font CD. * | |
93 | * * | |
94 | * I've also increased the size of the buffer used to load the * | |
95 | * .PFM file; the old size was inadequate for most of the fonts * | |
96 | * from the SoftKey collection. * | |
97 | * * | |
98 | * Compiled with Watcom C 10.6 * | |
99 | * * | |
100 | ********************************************************************/ | |
101 | | |
102 | /******************************************************************** | |
103 | * * | |
104 | * Further modifications, 4/21/98, by Rod Smith * | |
105 | * * | |
106 | * Minor changes to get the program to compile with gcc under * | |
107 | * Linux (Red Hat 5.0, to be precise). I had to add an itoa * | |
108 | * function from the net (the function was buggy, so I had to fix * | |
109 | * it, too!). I also made the program more friendly towards * | |
110 | * files with mixed-case filenames. * | |
111 | * * | |
112 | ********************************************************************/ | |
113 | ||
114 | /******************************************************************** | |
115 | * * | |
116 | * 1/31/2005, by Paulo Soares * | |
117 | * * | |
118 | * This code was integrated into iText. * | |
119 | * Note that the itoa function mentioned in the comment by Rod * | |
120 | * Smith is no longer in the code because Java has native support * | |
121 | * in PrintWriter to convert integers to strings * | |
122 | * * | |
123 | ********************************************************************/ | |
124 | ||
125 | /******************************************************************** | |
126 | * * | |
127 | * 7/16/2005, by Bruno Lowagie * | |
128 | * * | |
129 | * I solved an Eclipse Warning. * | |
130 | * * | |
131 | ********************************************************************/ | |
132 | ||
133 | /******************************************************************** | |
134 | * * | |
135 | * 9/14/2006, by Xavier Le Vourch * | |
136 | * * | |
137 | * expand import clauses (import java.io.*) * | |
138 | * the removal of an exception in readString was restored on 9/16 * | |
139 | * * | |
140 | ********************************************************************/ | |
141 | package com.lowagie.text.pdf; | |
142 | ||
143 | import java.io.FileOutputStream; | |
144 | import java.io.IOException; | |
145 | import java.io.OutputStream; | |
146 | import java.io.OutputStreamWriter; | |
147 | import java.io.PrintWriter; | |
148 | import java.nio.charset.StandardCharsets; | |
149 | import java.util.Locale; | |
150 | ||
151 | import com.lowagie.text.error_messages.MessageLocalization; | |
152 | ||
153 | /** | |
154 | * Converts a PFM file into an AFM file. | |
155 | */ | |
156 | public final class Pfm2afm { | |
157 | private RandomAccessFileOrArray in; | |
158 | private PrintWriter out; | |
159 | | |
160 | /** Creates a new instance of Pfm2afm */ | |
161 | private Pfm2afm(RandomAccessFileOrArray in, OutputStream out) throws IOException { | |
162 | this.in = in; | |
163 | this.out = new PrintWriter(new OutputStreamWriter(out, StandardCharsets.ISO_8859_1)); | |
164 | } | |
165 | | |
166 | /** | |
167 | * Converts a PFM file into an AFM file. | |
168 | * @param in the PFM file | |
169 | * @param out the AFM file | |
170 | * @throws IOException on error | |
171 | */ | |
172 | public static void convert(RandomAccessFileOrArray in, OutputStream out) throws IOException { | |
173 | Pfm2afm p = new Pfm2afm(in, out); | |
174 |
1
1. convert : removed call to com/lowagie/text/pdf/Pfm2afm::openpfm → NO_COVERAGE |
p.openpfm(); |
175 |
1
1. convert : removed call to com/lowagie/text/pdf/Pfm2afm::putheader → NO_COVERAGE |
p.putheader(); |
176 |
1
1. convert : removed call to com/lowagie/text/pdf/Pfm2afm::putchartab → NO_COVERAGE |
p.putchartab(); |
177 |
1
1. convert : removed call to com/lowagie/text/pdf/Pfm2afm::putkerntab → NO_COVERAGE |
p.putkerntab(); |
178 |
1
1. convert : removed call to com/lowagie/text/pdf/Pfm2afm::puttrailer → NO_COVERAGE |
p.puttrailer(); |
179 |
1
1. convert : removed call to java/io/PrintWriter::flush → NO_COVERAGE |
p.out.flush(); |
180 | } | |
181 | | |
182 | public static void main(String[] args) { | |
183 | try { | |
184 | RandomAccessFileOrArray in = new RandomAccessFileOrArray(args[0]); | |
185 | OutputStream out = new FileOutputStream(args[1]); | |
186 |
1
1. main : removed call to com/lowagie/text/pdf/Pfm2afm::convert → NO_COVERAGE |
convert(in, out); |
187 |
1
1. main : removed call to com/lowagie/text/pdf/RandomAccessFileOrArray::close → NO_COVERAGE |
in.close(); |
188 |
1
1. main : removed call to java/io/OutputStream::close → NO_COVERAGE |
out.close(); |
189 | } | |
190 | catch (Exception e) { | |
191 |
1
1. main : removed call to java/lang/Exception::printStackTrace → NO_COVERAGE |
e.printStackTrace(); |
192 | } | |
193 | } | |
194 | | |
195 | private String readString(int n) throws IOException { | |
196 | byte[] b = new byte[n]; | |
197 |
1
1. readString : removed call to com/lowagie/text/pdf/RandomAccessFileOrArray::readFully → NO_COVERAGE |
in.readFully(b); |
198 | int k; | |
199 |
2
1. readString : changed conditional boundary → NO_COVERAGE 2. readString : negated conditional → NO_COVERAGE |
for (k = 0; k < b.length; ++k) { |
200 |
1
1. readString : negated conditional → NO_COVERAGE |
if (b[k] == 0) |
201 | break; | |
202 | } | |
203 |
1
1. readString : mutated return of Object value for com/lowagie/text/pdf/Pfm2afm::readString to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE |
return new String(b, 0, k, StandardCharsets.ISO_8859_1); |
204 | } | |
205 | | |
206 | private String readString() throws IOException { | |
207 | StringBuilder buf = new StringBuilder(); | |
208 | while (true) { | |
209 | int c = in.read(); | |
210 |
2
1. readString : changed conditional boundary → NO_COVERAGE 2. readString : negated conditional → NO_COVERAGE |
if (c <= 0) |
211 | break; | |
212 | buf.append((char)c); | |
213 | } | |
214 |
1
1. readString : mutated return of Object value for com/lowagie/text/pdf/Pfm2afm::readString to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE |
return buf.toString(); |
215 | } | |
216 | | |
217 | private void outval(int n) { | |
218 |
1
1. outval : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print(' '); |
219 |
1
1. outval : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print(n); |
220 | } | |
221 | | |
222 | /* | |
223 | * Output a character entry | |
224 | */ | |
225 | private void outchar(int code, int width, String name) { | |
226 |
1
1. outchar : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("C "); |
227 |
1
1. outchar : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(code); |
228 |
1
1. outchar : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print(" ; WX "); |
229 |
1
1. outchar : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(width); |
230 |
1
1. outchar : negated conditional → NO_COVERAGE |
if (name != null) { |
231 |
1
1. outchar : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print(" ; N "); |
232 |
1
1. outchar : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print(name); |
233 | } | |
234 |
1
1. outchar : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print(" ;\n"); |
235 | } | |
236 | | |
237 | private void openpfm() throws IOException { | |
238 |
1
1. openpfm : removed call to com/lowagie/text/pdf/RandomAccessFileOrArray::seek → NO_COVERAGE |
in.seek(0); |
239 | vers = in.readShortLE(); | |
240 | h_len = in.readIntLE(); | |
241 | copyright = readString(60); | |
242 | type = in.readShortLE(); | |
243 | points = in.readShortLE(); | |
244 | verres = in.readShortLE(); | |
245 | horres = in.readShortLE(); | |
246 | ascent = in.readShortLE(); | |
247 | intleading = in.readShortLE(); | |
248 | extleading = in.readShortLE(); | |
249 | italic = (byte)in.read(); | |
250 | uline = (byte)in.read(); | |
251 | overs = (byte)in.read(); | |
252 | weight = in.readShortLE(); | |
253 | charset = (byte)in.read(); | |
254 | pixwidth = in.readShortLE(); | |
255 | pixheight = in.readShortLE(); | |
256 | kind = (byte)in.read(); | |
257 | avgwidth = in.readShortLE(); | |
258 | maxwidth = in.readShortLE(); | |
259 | firstchar = in.read(); | |
260 | lastchar = in.read(); | |
261 | defchar = (byte)in.read(); | |
262 | brkchar = (byte)in.read(); | |
263 | widthby = in.readShortLE(); | |
264 | device = in.readIntLE(); | |
265 | face = in.readIntLE(); | |
266 | bits = in.readIntLE(); | |
267 | bitoff = in.readIntLE(); | |
268 | extlen = in.readShortLE(); | |
269 | psext = in.readIntLE(); | |
270 | chartab = in.readIntLE(); | |
271 | res1 = in.readIntLE(); | |
272 | kernpairs = in.readIntLE(); | |
273 | res2 = in.readIntLE(); | |
274 | fontname = in.readIntLE(); | |
275 |
6
1. openpfm : changed conditional boundary → NO_COVERAGE 2. openpfm : changed conditional boundary → NO_COVERAGE 3. openpfm : negated conditional → NO_COVERAGE 4. openpfm : negated conditional → NO_COVERAGE 5. openpfm : negated conditional → NO_COVERAGE 6. openpfm : negated conditional → NO_COVERAGE |
if (h_len != in.length() || extlen != 30 || fontname < 75 || fontname > 512) |
276 | throw new IOException(MessageLocalization.getComposedMessage("not.a.valid.pfm.file")); | |
277 |
2
1. openpfm : Replaced integer addition with subtraction → NO_COVERAGE 2. openpfm : removed call to com/lowagie/text/pdf/RandomAccessFileOrArray::seek → NO_COVERAGE |
in.seek(psext + 14); |
278 | capheight = in.readShortLE(); | |
279 | xheight = in.readShortLE(); | |
280 | ascender = in.readShortLE(); | |
281 | descender = in.readShortLE(); | |
282 | } | |
283 | | |
284 | private void putheader() throws IOException { | |
285 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("StartFontMetrics 2.0\n"); |
286 |
2
1. putheader : changed conditional boundary → NO_COVERAGE 2. putheader : negated conditional → NO_COVERAGE |
if (copyright.length() > 0) |
287 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("Comment " + copyright + '\n'); |
288 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("FontName "); |
289 |
1
1. putheader : removed call to com/lowagie/text/pdf/RandomAccessFileOrArray::seek → NO_COVERAGE |
in.seek(fontname); |
290 | String fname = readString(); | |
291 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print(fname); |
292 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("\nEncodingScheme "); |
293 |
1
1. putheader : negated conditional → NO_COVERAGE |
if (charset != 0) |
294 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("FontSpecific\n"); |
295 | else | |
296 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("AdobeStandardEncoding\n"); |
297 | /* | |
298 | * The .pfm is missing full name, so construct from font name by | |
299 | * changing the hyphen to a space. This actually works in a lot | |
300 | * of cases. | |
301 | */ | |
302 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("FullName " + fname.replace('-', ' ')); |
303 |
1
1. putheader : negated conditional → NO_COVERAGE |
if (face != 0) { |
304 |
1
1. putheader : removed call to com/lowagie/text/pdf/RandomAccessFileOrArray::seek → NO_COVERAGE |
in.seek(face); |
305 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("\nFamilyName " + readString()); |
306 | } | |
307 | ||
308 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("\nWeight "); |
309 |
3
1. putheader : changed conditional boundary → NO_COVERAGE 2. putheader : negated conditional → NO_COVERAGE 3. putheader : negated conditional → NO_COVERAGE |
if (weight > 475 || fname.toLowerCase(Locale.ROOT).contains("bold")) |
310 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("Bold"); |
311 |
4
1. putheader : changed conditional boundary → NO_COVERAGE 2. putheader : negated conditional → NO_COVERAGE 3. putheader : negated conditional → NO_COVERAGE 4. putheader : negated conditional → NO_COVERAGE |
else if ((weight < 325 && weight != 0) || fname.toLowerCase(Locale.ROOT).contains("light")) |
312 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("Light"); |
313 |
1
1. putheader : negated conditional → NO_COVERAGE |
else if (fname.toLowerCase(Locale.ROOT).contains("black")) |
314 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("Black"); |
315 | else | |
316 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("Medium"); |
317 | ||
318 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("\nItalicAngle "); |
319 |
2
1. putheader : negated conditional → NO_COVERAGE 2. putheader : negated conditional → NO_COVERAGE |
if (italic != 0 || fname.toLowerCase(Locale.ROOT).contains("italic")) |
320 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("-12.00"); |
321 | /* this is a typical value; something else may work better for a | |
322 | specific font */ | |
323 | else | |
324 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("0"); |
325 | ||
326 | /* | |
327 | * The mono flag in the pfm actually indicates whether there is a | |
328 | * table of font widths, not if they are all the same. | |
329 | */ | |
330 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("\nIsFixedPitch "); |
331 |
3
1. putheader : Replaced bitwise AND with OR → NO_COVERAGE 2. putheader : negated conditional → NO_COVERAGE 3. putheader : negated conditional → NO_COVERAGE |
if ((kind & 1) == 0 || /* Flag for mono */ |
332 | avgwidth == maxwidth ) { /* Avg width = max width */ | |
333 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("true"); |
334 | isMono = true; | |
335 | } | |
336 | else { | |
337 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("false"); |
338 | isMono = false; | |
339 | } | |
340 | ||
341 | /* | |
342 | * The font bounding box is lost, but try to reconstruct it. | |
343 | * Much of this is just guess work. The bounding box is required in | |
344 | * the .afm, but is not used by the PM font installer. | |
345 | */ | |
346 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("\nFontBBox"); |
347 |
1
1. putheader : negated conditional → NO_COVERAGE |
if (isMono) |
348 |
1
1. putheader : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(-20); /* Just guess at left bounds */ |
349 | else | |
350 |
1
1. putheader : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(-100); |
351 |
3
1. putheader : removed negation → NO_COVERAGE 2. putheader : Replaced integer addition with subtraction → NO_COVERAGE 3. putheader : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(-(descender+5)); /* Descender is given as positive value */ |
352 |
2
1. putheader : Replaced integer addition with subtraction → NO_COVERAGE 2. putheader : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(maxwidth+10); |
353 |
2
1. putheader : Replaced integer addition with subtraction → NO_COVERAGE 2. putheader : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(ascent+5); |
354 | ||
355 | /* | |
356 | * Give other metrics that were kept | |
357 | */ | |
358 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("\nCapHeight"); |
359 |
1
1. putheader : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(capheight); |
360 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("\nXHeight"); |
361 |
1
1. putheader : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(xheight); |
362 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("\nDescender"); |
363 |
1
1. putheader : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(descender); |
364 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("\nAscender"); |
365 |
1
1. putheader : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(ascender); |
366 |
1
1. putheader : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print('\n'); |
367 | } | |
368 | | |
369 | private void putchartab() throws IOException { | |
370 |
2
1. putchartab : Replaced integer subtraction with addition → NO_COVERAGE 2. putchartab : Replaced integer addition with subtraction → NO_COVERAGE |
int count = lastchar - firstchar + 1; |
371 | int[] ctabs = new int[count]; | |
372 |
1
1. putchartab : removed call to com/lowagie/text/pdf/RandomAccessFileOrArray::seek → NO_COVERAGE |
in.seek(chartab); |
373 |
3
1. putchartab : changed conditional boundary → NO_COVERAGE 2. putchartab : Changed increment from 1 to -1 → NO_COVERAGE 3. putchartab : negated conditional → NO_COVERAGE |
for (int k = 0; k < count; ++k) |
374 | ctabs[k] = in.readUnsignedShortLE(); | |
375 | int[] back = new int[256]; | |
376 |
1
1. putchartab : negated conditional → NO_COVERAGE |
if (charset == 0) { |
377 |
3
1. putchartab : changed conditional boundary → NO_COVERAGE 2. putchartab : Changed increment from 1 to -1 → NO_COVERAGE 3. putchartab : negated conditional → NO_COVERAGE |
for (int i = firstchar; i <= lastchar; ++i) { |
378 |
1
1. putchartab : negated conditional → NO_COVERAGE |
if (Win2PSStd[i] != 0) |
379 | back[Win2PSStd[i]] = i; | |
380 | } | |
381 | } | |
382 | /* Put out the header */ | |
383 |
1
1. putchartab : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("StartCharMetrics"); |
384 |
1
1. putchartab : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(count); |
385 |
1
1. putchartab : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print('\n'); |
386 | ||
387 | /* Put out all encoded chars */ | |
388 |
1
1. putchartab : negated conditional → NO_COVERAGE |
if (charset != 0) { |
389 | /* | |
390 | * If the charset is not the Windows standard, just put out | |
391 | * unnamed entries. | |
392 | */ | |
393 |
3
1. putchartab : changed conditional boundary → NO_COVERAGE 2. putchartab : Changed increment from 1 to -1 → NO_COVERAGE 3. putchartab : negated conditional → NO_COVERAGE |
for (int i = firstchar; i <= lastchar; i++) { |
394 |
2
1. putchartab : Replaced integer subtraction with addition → NO_COVERAGE 2. putchartab : negated conditional → NO_COVERAGE |
if (ctabs[i - firstchar] != 0) { |
395 |
2
1. putchartab : Replaced integer subtraction with addition → NO_COVERAGE 2. putchartab : removed call to com/lowagie/text/pdf/Pfm2afm::outchar → NO_COVERAGE |
outchar(i, ctabs[i - firstchar], null); |
396 | } | |
397 | } | |
398 | } | |
399 | else { | |
400 |
3
1. putchartab : changed conditional boundary → NO_COVERAGE 2. putchartab : Changed increment from 1 to -1 → NO_COVERAGE 3. putchartab : negated conditional → NO_COVERAGE |
for (int i = 0; i < 256; i++) { |
401 | int j = back[i]; | |
402 |
1
1. putchartab : negated conditional → NO_COVERAGE |
if (j != 0) { |
403 |
2
1. putchartab : Replaced integer subtraction with addition → NO_COVERAGE 2. putchartab : removed call to com/lowagie/text/pdf/Pfm2afm::outchar → NO_COVERAGE |
outchar(i, ctabs[j - firstchar], WinChars[j]); |
404 |
1
1. putchartab : Replaced integer subtraction with addition → NO_COVERAGE |
ctabs[j - firstchar] = 0; |
405 | } | |
406 | } | |
407 | /* Put out all non-encoded chars */ | |
408 |
3
1. putchartab : changed conditional boundary → NO_COVERAGE 2. putchartab : Changed increment from 1 to -1 → NO_COVERAGE 3. putchartab : negated conditional → NO_COVERAGE |
for (int i = firstchar; i <= lastchar; i++) { |
409 |
2
1. putchartab : Replaced integer subtraction with addition → NO_COVERAGE 2. putchartab : negated conditional → NO_COVERAGE |
if (ctabs[i - firstchar] != 0) { |
410 |
2
1. putchartab : Replaced integer subtraction with addition → NO_COVERAGE 2. putchartab : removed call to com/lowagie/text/pdf/Pfm2afm::outchar → NO_COVERAGE |
outchar(-1, ctabs[i - firstchar], WinChars[i]); |
411 | } | |
412 | } | |
413 | } | |
414 | /* Put out the trailer */ | |
415 |
1
1. putchartab : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("EndCharMetrics\n"); |
416 | | |
417 | } | |
418 | | |
419 | private void putkerntab() throws IOException { | |
420 |
1
1. putkerntab : negated conditional → NO_COVERAGE |
if (kernpairs == 0) |
421 | return; | |
422 |
1
1. putkerntab : removed call to com/lowagie/text/pdf/RandomAccessFileOrArray::seek → NO_COVERAGE |
in.seek(kernpairs); |
423 | int count = in.readUnsignedShortLE(); | |
424 | int nzero = 0; | |
425 |
1
1. putkerntab : Replaced integer multiplication with division → NO_COVERAGE |
int[] kerns = new int[count * 3]; |
426 |
2
1. putkerntab : changed conditional boundary → NO_COVERAGE 2. putkerntab : negated conditional → NO_COVERAGE |
for (int k = 0; k < kerns.length;) { |
427 |
1
1. putkerntab : Changed increment from 1 to -1 → NO_COVERAGE |
kerns[k++] = in.read(); |
428 |
1
1. putkerntab : Changed increment from 1 to -1 → NO_COVERAGE |
kerns[k++] = in.read(); |
429 |
2
1. putkerntab : Changed increment from 1 to -1 → NO_COVERAGE 2. putkerntab : negated conditional → NO_COVERAGE |
if ((kerns[k++] = in.readShortLE()) != 0) |
430 |
1
1. putkerntab : Changed increment from 1 to -1 → NO_COVERAGE |
++nzero; |
431 | } | |
432 |
1
1. putkerntab : negated conditional → NO_COVERAGE |
if (nzero == 0) |
433 | return; | |
434 |
1
1. putkerntab : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("StartKernData\nStartKernPairs"); |
435 |
1
1. putkerntab : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(nzero); |
436 |
1
1. putkerntab : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print('\n'); |
437 |
2
1. putkerntab : changed conditional boundary → NO_COVERAGE 2. putkerntab : negated conditional → NO_COVERAGE |
for (int k = 0; k < kerns.length; k += 3) { |
438 |
2
1. putkerntab : Replaced integer addition with subtraction → NO_COVERAGE 2. putkerntab : negated conditional → NO_COVERAGE |
if (kerns[k + 2] != 0) { |
439 |
1
1. putkerntab : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("KPX "); |
440 |
1
1. putkerntab : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print(WinChars[kerns[k]]); |
441 |
1
1. putkerntab : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print(' '); |
442 |
2
1. putkerntab : Replaced integer addition with subtraction → NO_COVERAGE 2. putkerntab : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print(WinChars[kerns[k + 1]]); |
443 |
2
1. putkerntab : Replaced integer addition with subtraction → NO_COVERAGE 2. putkerntab : removed call to com/lowagie/text/pdf/Pfm2afm::outval → NO_COVERAGE |
outval(kerns[k + 2]); |
444 |
1
1. putkerntab : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print('\n'); |
445 | } | |
446 | } | |
447 | /* Put out trailer */ | |
448 |
1
1. putkerntab : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("EndKernPairs\nEndKernData\n"); |
449 | } | |
450 | | |
451 | ||
452 | private void puttrailer() { | |
453 |
1
1. puttrailer : removed call to java/io/PrintWriter::print → NO_COVERAGE |
out.print("EndFontMetrics\n"); |
454 | } | |
455 | ||
456 | private short vers; | |
457 | private int h_len; /* Total length of .pfm file */ | |
458 | private String copyright; /* Copyright string [60]*/ | |
459 | private short type; | |
460 | private short points; | |
461 | private short verres; | |
462 | private short horres; | |
463 | private short ascent; | |
464 | private short intleading; | |
465 | private short extleading; | |
466 | private byte italic; | |
467 | private byte uline; | |
468 | private byte overs; | |
469 | private short weight; | |
470 | private byte charset; /* 0=windows, otherwise nomap */ | |
471 | private short pixwidth; /* Width for mono fonts */ | |
472 | private short pixheight; | |
473 | private byte kind; /* Lower bit off in mono */ | |
474 | private short avgwidth; /* Mono if avg=max width */ | |
475 | private short maxwidth; /* Use to compute bounding box */ | |
476 | private int firstchar; /* First char in table */ | |
477 | private int lastchar; /* Last char in table */ | |
478 | private byte defchar; | |
479 | private byte brkchar; | |
480 | private short widthby; | |
481 | private int device; | |
482 | private int face; /* Face name */ | |
483 | private int bits; | |
484 | private int bitoff; | |
485 | private short extlen; | |
486 | private int psext; /* PostScript extension */ | |
487 | private int chartab; /* Character width tables */ | |
488 | private int res1; | |
489 | private int kernpairs; /* Kerning pairs */ | |
490 | private int res2; | |
491 | private int fontname; /* Font name */ | |
492 | ||
493 | /* | |
494 | * Some metrics from the PostScript extension | |
495 | */ | |
496 | private short capheight; /* Cap height */ | |
497 | private short xheight; /* X height */ | |
498 | private short ascender; /* Ascender */ | |
499 | private short descender; /* Descender (positive) */ | |
500 | ||
501 | | |
502 | private boolean isMono; | |
503 | /** | |
504 | * Translate table from 1004 to psstd. 1004 is an extension of the | |
505 | * Windows translate table used in PM. | |
506 | */ | |
507 | private int[] Win2PSStd = { | |
508 | 0, 0, 0, 0, 197, 198, 199, 0, 202, 0, 205, 206, 207, 0, 0, 0, // 00 | |
509 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 10 | |
510 | 32, 33, 34, 35, 36, 37, 38, 169, 40, 41, 42, 43, 44, 45, 46, 47, // 20 | |
511 | 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, // 30 | |
512 | 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 40 | |
513 | 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, // 50 | |
514 | 193, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, // 60 | |
515 | 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, // 70 | |
516 | 0, 0, 184, 166, 185, 188, 178, 179, 195, 189, 0, 172, 234, 0, 0, 0, // 80 | |
517 | 0, 96, 0, 170, 186, 183, 177, 208, 196, 0, 0, 173, 250, 0, 0, 0, // 90 | |
518 | 0, 161, 162, 163, 168, 165, 0, 167, 200, 0, 227, 171, 0, 0, 0, 197, // A0 | |
519 | 0, 0, 0, 0, 194, 0, 182, 180, 203, 0, 235, 187, 0, 0, 0, 191, // B0 | |
520 | 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, // C0 | |
521 | 0, 0, 0, 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 251, // D0 | |
522 | 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, // E0 | |
523 | 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0 // F0 | |
524 | }; | |
525 | ||
526 | /** | |
527 | * Character class. This is a minor attempt to overcome the problem that | |
528 | * in the pfm file, all unused characters are given the width of space. | |
529 | * Note that this array isn't used in iText. | |
530 | */ | |
531 | private int[] WinClass = { | |
532 | 0, 0, 0, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 0, 0, /* 00 */ | |
533 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 */ | |
534 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 20 */ | |
535 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 30 */ | |
536 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 40 */ | |
537 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 50 */ | |
538 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 60 */ | |
539 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, /* 70 */ | |
540 | 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, /* 80 */ | |
541 | 0, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, /* 90 */ | |
542 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* a0 */ | |
543 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* b0 */ | |
544 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* c0 */ | |
545 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* d0 */ | |
546 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* e0 */ | |
547 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 /* f0 */ | |
548 | }; | |
549 | ||
550 | /** | |
551 | * Windows character names. Give a name to the used locations | |
552 | * for when the all flag is specified. | |
553 | */ | |
554 | private String[] WinChars = { | |
555 | "W00", /* 00 */ | |
556 | "W01", /* 01 */ | |
557 | "W02", /* 02 */ | |
558 | "W03", /* 03 */ | |
559 | "macron", /* 04 */ | |
560 | "breve", /* 05 */ | |
561 | "dotaccent", /* 06 */ | |
562 | "W07", /* 07 */ | |
563 | "ring", /* 08 */ | |
564 | "W09", /* 09 */ | |
565 | "W0a", /* 0a */ | |
566 | "W0b", /* 0b */ | |
567 | "W0c", /* 0c */ | |
568 | "W0d", /* 0d */ | |
569 | "W0e", /* 0e */ | |
570 | "W0f", /* 0f */ | |
571 | "hungarumlaut", /* 10 */ | |
572 | "ogonek", /* 11 */ | |
573 | "caron", /* 12 */ | |
574 | "W13", /* 13 */ | |
575 | "W14", /* 14 */ | |
576 | "W15", /* 15 */ | |
577 | "W16", /* 16 */ | |
578 | "W17", /* 17 */ | |
579 | "W18", /* 18 */ | |
580 | "W19", /* 19 */ | |
581 | "W1a", /* 1a */ | |
582 | "W1b", /* 1b */ | |
583 | "W1c", /* 1c */ | |
584 | "W1d", /* 1d */ | |
585 | "W1e", /* 1e */ | |
586 | "W1f", /* 1f */ | |
587 | "space", /* 20 */ | |
588 | "exclam", /* 21 */ | |
589 | "quotedbl", /* 22 */ | |
590 | "numbersign", /* 23 */ | |
591 | "dollar", /* 24 */ | |
592 | "percent", /* 25 */ | |
593 | "ampersand", /* 26 */ | |
594 | "quotesingle", /* 27 */ | |
595 | "parenleft", /* 28 */ | |
596 | "parenright", /* 29 */ | |
597 | "asterisk", /* 2A */ | |
598 | "plus", /* 2B */ | |
599 | "comma", /* 2C */ | |
600 | "hyphen", /* 2D */ | |
601 | "period", /* 2E */ | |
602 | "slash", /* 2F */ | |
603 | "zero", /* 30 */ | |
604 | "one", /* 31 */ | |
605 | "two", /* 32 */ | |
606 | "three", /* 33 */ | |
607 | "four", /* 34 */ | |
608 | "five", /* 35 */ | |
609 | "six", /* 36 */ | |
610 | "seven", /* 37 */ | |
611 | "eight", /* 38 */ | |
612 | "nine", /* 39 */ | |
613 | "colon", /* 3A */ | |
614 | "semicolon", /* 3B */ | |
615 | "less", /* 3C */ | |
616 | "equal", /* 3D */ | |
617 | "greater", /* 3E */ | |
618 | "question", /* 3F */ | |
619 | "at", /* 40 */ | |
620 | "A", /* 41 */ | |
621 | "B", /* 42 */ | |
622 | "C", /* 43 */ | |
623 | "D", /* 44 */ | |
624 | "E", /* 45 */ | |
625 | "F", /* 46 */ | |
626 | "G", /* 47 */ | |
627 | "H", /* 48 */ | |
628 | "I", /* 49 */ | |
629 | "J", /* 4A */ | |
630 | "K", /* 4B */ | |
631 | "L", /* 4C */ | |
632 | "M", /* 4D */ | |
633 | "N", /* 4E */ | |
634 | "O", /* 4F */ | |
635 | "P", /* 50 */ | |
636 | "Q", /* 51 */ | |
637 | "R", /* 52 */ | |
638 | "S", /* 53 */ | |
639 | "T", /* 54 */ | |
640 | "U", /* 55 */ | |
641 | "V", /* 56 */ | |
642 | "W", /* 57 */ | |
643 | "X", /* 58 */ | |
644 | "Y", /* 59 */ | |
645 | "Z", /* 5A */ | |
646 | "bracketleft", /* 5B */ | |
647 | "backslash", /* 5C */ | |
648 | "bracketright", /* 5D */ | |
649 | "asciicircum", /* 5E */ | |
650 | "underscore", /* 5F */ | |
651 | "grave", /* 60 */ | |
652 | "a", /* 61 */ | |
653 | "b", /* 62 */ | |
654 | "c", /* 63 */ | |
655 | "d", /* 64 */ | |
656 | "e", /* 65 */ | |
657 | "f", /* 66 */ | |
658 | "g", /* 67 */ | |
659 | "h", /* 68 */ | |
660 | "i", /* 69 */ | |
661 | "j", /* 6A */ | |
662 | "k", /* 6B */ | |
663 | "l", /* 6C */ | |
664 | "m", /* 6D */ | |
665 | "n", /* 6E */ | |
666 | "o", /* 6F */ | |
667 | "p", /* 70 */ | |
668 | "q", /* 71 */ | |
669 | "r", /* 72 */ | |
670 | "s", /* 73 */ | |
671 | "t", /* 74 */ | |
672 | "u", /* 75 */ | |
673 | "v", /* 76 */ | |
674 | "w", /* 77 */ | |
675 | "x", /* 78 */ | |
676 | "y", /* 79 */ | |
677 | "z", /* 7A */ | |
678 | "braceleft", /* 7B */ | |
679 | "bar", /* 7C */ | |
680 | "braceright", /* 7D */ | |
681 | "asciitilde", /* 7E */ | |
682 | "W7f", /* 7F */ | |
683 | "euro", /* 80 */ | |
684 | "W81", /* 81 */ | |
685 | "quotesinglbase", /* 82 */ | |
686 | "florin", /* 83 */ | |
687 | "quotedblbase", /* 84 */ | |
688 | "ellipsis", /* 85 */ | |
689 | "dagger", /* 86 */ | |
690 | "daggerdbl", /* 87 */ | |
691 | "circumflex", /* 88 */ | |
692 | "perthousand", /* 89 */ | |
693 | "Scaron", /* 8A */ | |
694 | "guilsinglleft", /* 8B */ | |
695 | "OE", /* 8C */ | |
696 | "W8d", /* 8D */ | |
697 | "Zcaron", /* 8E */ | |
698 | "W8f", /* 8F */ | |
699 | "W90", /* 90 */ | |
700 | "quoteleft", /* 91 */ | |
701 | "quoteright", /* 92 */ | |
702 | "quotedblleft", /* 93 */ | |
703 | "quotedblright", /* 94 */ | |
704 | "bullet", /* 95 */ | |
705 | "endash", /* 96 */ | |
706 | "emdash", /* 97 */ | |
707 | "tilde", /* 98 */ | |
708 | "trademark", /* 99 */ | |
709 | "scaron", /* 9A */ | |
710 | "guilsinglright", /* 9B */ | |
711 | "oe", /* 9C */ | |
712 | "W9d", /* 9D */ | |
713 | "zcaron", /* 9E */ | |
714 | "Ydieresis", /* 9F */ | |
715 | "reqspace", /* A0 */ | |
716 | "exclamdown", /* A1 */ | |
717 | "cent", /* A2 */ | |
718 | "sterling", /* A3 */ | |
719 | "currency", /* A4 */ | |
720 | "yen", /* A5 */ | |
721 | "brokenbar", /* A6 */ | |
722 | "section", /* A7 */ | |
723 | "dieresis", /* A8 */ | |
724 | "copyright", /* A9 */ | |
725 | "ordfeminine", /* AA */ | |
726 | "guillemotleft", /* AB */ | |
727 | "logicalnot", /* AC */ | |
728 | "syllable", /* AD */ | |
729 | "registered", /* AE */ | |
730 | "macron", /* AF */ | |
731 | "degree", /* B0 */ | |
732 | "plusminus", /* B1 */ | |
733 | "twosuperior", /* B2 */ | |
734 | "threesuperior", /* B3 */ | |
735 | "acute", /* B4 */ | |
736 | "mu", /* B5 */ | |
737 | "paragraph", /* B6 */ | |
738 | "periodcentered", /* B7 */ | |
739 | "cedilla", /* B8 */ | |
740 | "onesuperior", /* B9 */ | |
741 | "ordmasculine", /* BA */ | |
742 | "guillemotright", /* BB */ | |
743 | "onequarter", /* BC */ | |
744 | "onehalf", /* BD */ | |
745 | "threequarters", /* BE */ | |
746 | "questiondown", /* BF */ | |
747 | "Agrave", /* C0 */ | |
748 | "Aacute", /* C1 */ | |
749 | "Acircumflex", /* C2 */ | |
750 | "Atilde", /* C3 */ | |
751 | "Adieresis", /* C4 */ | |
752 | "Aring", /* C5 */ | |
753 | "AE", /* C6 */ | |
754 | "Ccedilla", /* C7 */ | |
755 | "Egrave", /* C8 */ | |
756 | "Eacute", /* C9 */ | |
757 | "Ecircumflex", /* CA */ | |
758 | "Edieresis", /* CB */ | |
759 | "Igrave", /* CC */ | |
760 | "Iacute", /* CD */ | |
761 | "Icircumflex", /* CE */ | |
762 | "Idieresis", /* CF */ | |
763 | "Eth", /* D0 */ | |
764 | "Ntilde", /* D1 */ | |
765 | "Ograve", /* D2 */ | |
766 | "Oacute", /* D3 */ | |
767 | "Ocircumflex", /* D4 */ | |
768 | "Otilde", /* D5 */ | |
769 | "Odieresis", /* D6 */ | |
770 | "multiply", /* D7 */ | |
771 | "Oslash", /* D8 */ | |
772 | "Ugrave", /* D9 */ | |
773 | "Uacute", /* DA */ | |
774 | "Ucircumflex", /* DB */ | |
775 | "Udieresis", /* DC */ | |
776 | "Yacute", /* DD */ | |
777 | "Thorn", /* DE */ | |
778 | "germandbls", /* DF */ | |
779 | "agrave", /* E0 */ | |
780 | "aacute", /* E1 */ | |
781 | "acircumflex", /* E2 */ | |
782 | "atilde", /* E3 */ | |
783 | "adieresis", /* E4 */ | |
784 | "aring", /* E5 */ | |
785 | "ae", /* E6 */ | |
786 | "ccedilla", /* E7 */ | |
787 | "egrave", /* E8 */ | |
788 | "eacute", /* E9 */ | |
789 | "ecircumflex", /* EA */ | |
790 | "edieresis", /* EB */ | |
791 | "igrave", /* EC */ | |
792 | "iacute", /* ED */ | |
793 | "icircumflex", /* EE */ | |
794 | "idieresis", /* EF */ | |
795 | "eth", /* F0 */ | |
796 | "ntilde", /* F1 */ | |
797 | "ograve", /* F2 */ | |
798 | "oacute", /* F3 */ | |
799 | "ocircumflex", /* F4 */ | |
800 | "otilde", /* F5 */ | |
801 | "odieresis", /* F6 */ | |
802 | "divide", /* F7 */ | |
803 | "oslash", /* F8 */ | |
804 | "ugrave", /* F9 */ | |
805 | "uacute", /* FA */ | |
806 | "ucircumflex", /* FB */ | |
807 | "udieresis", /* FC */ | |
808 | "yacute", /* FD */ | |
809 | "thorn", /* FE */ | |
810 | "ydieresis" /* FF */ | |
811 | }; | |
812 | } | |
Mutations | ||
174 |
1.1 |
|
175 |
1.1 |
|
176 |
1.1 |
|
177 |
1.1 |
|
178 |
1.1 |
|
179 |
1.1 |
|
186 |
1.1 |
|
187 |
1.1 |
|
188 |
1.1 |
|
191 |
1.1 |
|
197 |
1.1 |
|
199 |
1.1 2.2 |
|
200 |
1.1 |
|
203 |
1.1 |
|
210 |
1.1 2.2 |
|
214 |
1.1 |
|
218 |
1.1 |
|
219 |
1.1 |
|
226 |
1.1 |
|
227 |
1.1 |
|
228 |
1.1 |
|
229 |
1.1 |
|
230 |
1.1 |
|
231 |
1.1 |
|
232 |
1.1 |
|
234 |
1.1 |
|
238 |
1.1 |
|
275 |
1.1 2.2 3.3 4.4 5.5 6.6 |
|
277 |
1.1 2.2 |
|
285 |
1.1 |
|
286 |
1.1 2.2 |
|
287 |
1.1 |
|
288 |
1.1 |
|
289 |
1.1 |
|
291 |
1.1 |
|
292 |
1.1 |
|
293 |
1.1 |
|
294 |
1.1 |
|
296 |
1.1 |
|
302 |
1.1 |
|
303 |
1.1 |
|
304 |
1.1 |
|
305 |
1.1 |
|
308 |
1.1 |
|
309 |
1.1 2.2 3.3 |
|
310 |
1.1 |
|
311 |
1.1 2.2 3.3 4.4 |
|
312 |
1.1 |
|
313 |
1.1 |
|
314 |
1.1 |
|
316 |
1.1 |
|
318 |
1.1 |
|
319 |
1.1 2.2 |
|
320 |
1.1 |
|
324 |
1.1 |
|
330 |
1.1 |
|
331 |
1.1 2.2 3.3 |
|
333 |
1.1 |
|
337 |
1.1 |
|
346 |
1.1 |
|
347 |
1.1 |
|
348 |
1.1 |
|
350 |
1.1 |
|
351 |
1.1 2.2 3.3 |
|
352 |
1.1 2.2 |
|
353 |
1.1 2.2 |
|
358 |
1.1 |
|
359 |
1.1 |
|
360 |
1.1 |
|
361 |
1.1 |
|
362 |
1.1 |
|
363 |
1.1 |
|
364 |
1.1 |
|
365 |
1.1 |
|
366 |
1.1 |
|
370 |
1.1 2.2 |
|
372 |
1.1 |
|
373 |
1.1 2.2 3.3 |
|
376 |
1.1 |
|
377 |
1.1 2.2 3.3 |
|
378 |
1.1 |
|
383 |
1.1 |
|
384 |
1.1 |
|
385 |
1.1 |
|
388 |
1.1 |
|
393 |
1.1 2.2 3.3 |
|
394 |
1.1 2.2 |
|
395 |
1.1 2.2 |
|
400 |
1.1 2.2 3.3 |
|
402 |
1.1 |
|
403 |
1.1 2.2 |
|
404 |
1.1 |
|
408 |
1.1 2.2 3.3 |
|
409 |
1.1 2.2 |
|
410 |
1.1 2.2 |
|
415 |
1.1 |
|
420 |
1.1 |
|
422 |
1.1 |
|
425 |
1.1 |
|
426 |
1.1 2.2 |
|
427 |
1.1 |
|
428 |
1.1 |
|
429 |
1.1 2.2 |
|
430 |
1.1 |
|
432 |
1.1 |
|
434 |
1.1 |
|
435 |
1.1 |
|
436 |
1.1 |
|
437 |
1.1 2.2 |
|
438 |
1.1 2.2 |
|
439 |
1.1 |
|
440 |
1.1 |
|
441 |
1.1 |
|
442 |
1.1 2.2 |
|
443 |
1.1 2.2 |
|
444 |
1.1 |
|
448 |
1.1 |
|
453 |
1.1 |