From 24de7a9af4e201d3487edccac8b773c057a040a2 Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Sat, 28 Mar 2015 16:45:53 +0100 Subject: [PATCH] warnings fixed in ttf project + removed SuppressWarnings --- lib/ttf.jar | Bin 811703 -> 818109 bytes .../flash/exporters/FontExporter.java | 4 +- .../doubletype/ossa/truetype/CmapWriter.java | 631 +- .../ossa/truetype/FontFileWriter.java | 572 +- .../ossa/truetype/TTUnicodeRange.java | 760 +- .../org/doubletype/ossa/xml/RInterleave.java | 1510 +- .../src/org/doubletype/ossa/xml/RStack.java | 573 +- .../src/org/doubletype/ossa/xml/UJAXP.java | 2034 +- .../src/org/doubletype/ossa/xml/URelaxer.java | 17579 ++++++++-------- .../src/org/doubletype/ossa/xml/XBody.java | 2386 +-- .../src/org/doubletype/ossa/xml/XContour.java | 1515 +- .../doubletype/ossa/xml/XContourPoint.java | 2027 +- .../doubletype/ossa/xml/XControlPoint.java | 1329 +- .../org/doubletype/ossa/xml/XGlyphFile.java | 1261 +- .../src/org/doubletype/ossa/xml/XHead.java | 5089 +++-- .../org/doubletype/ossa/xml/XHeadGlobal.java | 1365 +- .../org/doubletype/ossa/xml/XHeadLocal.java | 1365 +- .../src/org/doubletype/ossa/xml/XHint.java | 1212 +- .../src/org/doubletype/ossa/xml/XInclude.java | 1221 +- .../src/org/doubletype/ossa/xml/XInvoke.java | 1857 +- .../org/doubletype/ossa/xml/XInvokeArg.java | 1233 +- .../org/doubletype/ossa/xml/XInvokePos.java | 1093 +- .../org/doubletype/ossa/xml/XInvokeVarg.java | 1271 +- .../src/org/doubletype/ossa/xml/XModule.java | 1595 +- .../org/doubletype/ossa/xml/XParamList.java | 901 +- .../doubletype/ossa/xml/XParamListParam.java | 1233 +- .../src/org/doubletype/ossa/xml/XPoint2d.java | 1251 +- .../ossa/xml/XStartGlyphElement.java | 1171 +- 28 files changed, 27004 insertions(+), 27034 deletions(-) diff --git a/lib/ttf.jar b/lib/ttf.jar index 9f4e7edcca6c1c9eb3faa6bcad2ccbbd43febcd6..c3719aacfd7f16229c6d42b7e2121d767ad2a12c 100644 GIT binary patch delta 85797 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 delta 82584 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пBgzJ4HCa9@{I~3)M3Um{&ZgpGTT{^HqE+ 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 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java index 7bc93147a..5be9e3e76 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/FontExporter.java @@ -153,7 +153,7 @@ public class FontExporter { if (ascent != -1) { f.setAscender(Math.round(ascent / divider)); } - + int descent = t.getDescent(); if (descent != -1) { f.setDescender(Math.round(descent / divider)); @@ -247,7 +247,7 @@ public class FontExporter { if (mode == FontExportMode.WOFF) { FontFactory fontFactory = FontFactory.getInstance(); - byte[] fontBytes = new byte[0]; + byte[] fontBytes; try (FileInputStream fis = new FileInputStream(ttfFile)) { fontBytes = new byte[(int) ttfFile.length()]; fis.read(fontBytes); diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/CmapWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/CmapWriter.java index eb1640bf3..c752b193c 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/CmapWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/CmapWriter.java @@ -1,316 +1,315 @@ -/* - * $Id: CmapWriter.java,v 1.8 2004/01/27 00:35:08 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.truetype; - -import java.io.*; -import java.util.*; - -/** - * @author e.e - */ -public class CmapWriter extends FontFormatWriter { - final long k_basicLatinStart = 0x20; - final long k_basicLatinEnd = 0x7e; - final long k_tableEnd = 0xffff; - final int k_unmappedChar = 0x0; - - private OS2Writer m_os2; - private List m_unicodes = new ArrayList<>(); - private List m_startCodes = new ArrayList<>(); - private List m_endCodes = new ArrayList<>(); - private Hashtable m_unicode2glyph = new Hashtable<>(); - private List m_unicodeRanges = new ArrayList<>(); - private List m_idDeltas = new ArrayList<>(); - private List m_idRangeOffsets = new ArrayList<>(); - private boolean m_isIncludeVersion0; - private byte [] m_version0; - private byte [] m_version4; - private byte [] m_version12; - - public CmapWriter(OS2Writer a_os2) { - super(); - - m_os2 = a_os2; - m_isIncludeVersion0 = false; - } - - @SuppressWarnings("unchecked") - private void prepare() { - Collections.sort(m_unicodeRanges); - - TTUnicodeRange range = (TTUnicodeRange) m_unicodeRanges.get(0); - m_os2.m_usFirstCharIndex = (int) range.getStartCode(); - m_os2.m_usLastCharIndex = (int) range.getEndCode(); - - int i; - for (i = 0; i < m_unicodeRanges.size(); i++) { - range = m_unicodeRanges.get(i); - - m_startCodes.add(range.getStartCode()); - m_endCodes.add(range.getEndCode()); - m_idDeltas.add(0L); - m_idRangeOffsets.add( - 2L * (m_unicodeRanges.size() - i) + 2L - + 2L * (m_unicodes.size())); - - m_os2.m_usLastCharIndex = (int) range.getEndCode(); - m_os2.setUnicodeRangeFlag(range.getOsTwoFlag()); - - for (long unicode = range.getStartCode(); - unicode <= range.getEndCode(); unicode++) - { - m_unicodes.add(unicode); - } // for unicode - } // for i - - m_startCodes.add(k_tableEnd); - m_endCodes.add(k_tableEnd); - m_idDeltas.add(1L); - m_idRangeOffsets.add(0L); - } - - public void write() throws IOException { - prepare(); - - if (m_isIncludeVersion0) { - storeVersion0(); - } // if - storeVersion4(); - - reset(); - - writeUInt16(0); // table version number - writeUInt16(getNumOfEncoding()); // num of encodings - - if (m_isIncludeVersion0) { - writeUInt16(TTName.k_macintosh); - writeUInt16(TTName.k_macRomanEncode); - writeUInt32(size() + 4 + 8); - } // if - - writeUInt16(TTName.k_microsoft); - writeUInt16(TTName.k_winUnicodeEncode); - int version4Offset = size() + 4; - if (m_isIncludeVersion0) { - version4Offset += m_version0.length; - } // if - writeUInt32(version4Offset); - - if (m_isIncludeVersion0) { - m_buffer.write(m_version0); - } // if - - m_buffer.write(m_version4); - pad(); - } - - private int getNumOfEncoding() { - if (m_isIncludeVersion0) { - return 2; - } // if - - return 1; - } - - public void addUnicodeRange(TTUnicodeRange a_range) { - m_unicodeRanges.add(a_range); - } - - public void addMapping(long a_unicode, long a_glyfIndex) { - m_unicode2glyph.put(a_unicode, a_glyfIndex); - } - - /** - * Find 'glyf' index for the given unicode. - * This method returns 0, if a_key was not found, which will be treated - * as unmapped character. - * @param a_key Long object with unicode value. - * @return 'glyf' index if a_key was found; 0 otherwise. - */ - public long getGlyfIndex(Long a_key) { - long retval = 0; - - if (m_unicode2glyph.containsKey(a_key)) { - retval = m_unicode2glyph.get(a_key); - } // if - - return retval; - } - - private void storeVersion0() throws IOException { - reset(); - writeVersion0(); - m_version0 = toByteArray(); - reset(); - } - - private void storeVersion4() throws IOException { - reset(); - writeVersion4(); - m_version4 = toByteArray(); - reset(); - } - - private void storeVersion12() throws IOException { - reset(); - writeVersion12(); - m_version12 = toByteArray(); - reset(); - } - - protected String getTag() { - return "cmap"; - } - - private void writeVersion0() throws IOException { - writeUInt16(0); - writeUInt16(262); - writeUInt16(0); - int i; - for (i = 0; i < 256; i++) { - if ((i == 0x000) || (i == 0x0008) || (i == 0x001D)) { - writeUInt8((int) getGlyfIndex(TTUnicodeRange.k_null)); // .null - } - else if ((i == 0x0009) || (i == 0x000d)) { - writeUInt8((int) getGlyfIndex(TTUnicodeRange.k_cr)); // CR - } - else { - writeUInt8((int) getGlyfIndex((long) i)); - } // if - } // for i - } - - private void writeVersion4() throws IOException { - int segCount = m_startCodes.size(); - int i; - - // endCount - for (i = 0; i < segCount; i++) { - Long n = (Long) m_endCodes.get(i); - writeUInt16(n.intValue()); - } // for i - - // reserverdPad - writeUInt16(0); - - // startCount - for (i = 0; i < segCount; i++) { - Long n = m_startCodes.get(i); - writeUInt16(n.intValue()); - } // for i - - // idDelta - for (i = 0; i < segCount; i++) { - Long n = m_idDeltas.get(i); - writeInt16(n.intValue()); - } // for i - - // idRangeOffset - for (i = 0; i < segCount; i++) { - Long n = m_idRangeOffsets.get(i); - writeInt16(n.intValue()); - } - - // glyphIdArray 2 bytes each - for (i = 0; i < m_unicodes.size(); i++) { - Long unicode = m_unicodes.get(i); - writeUInt16((int) getGlyfIndex(unicode)); - } // for i - - byte [] bytes = m_bytes.toByteArray(); - - reset(); - - writeUInt16(4); - writeUInt16(bytes.length + 14); - writeUInt16(0); - writeUInt16(segCount * 2); - - int searchRange = getSearchRange(segCount); - writeUInt16(searchRange); - writeUInt16(getEntrySelector(searchRange)); - writeUInt16(getRangeShift(segCount, searchRange)); - m_buffer.write(bytes); - } - - public void writeVersion12() throws IOException { - ArrayList startCharCode = new ArrayList<>(); - ArrayList endCharCode = new ArrayList<>(); - ArrayList startGlyphCode = new ArrayList<>(); - - // TODO: map to real one - startCharCode.add(k_basicLatinStart); - endCharCode.add(k_basicLatinEnd); - startGlyphCode.add(1L); - - long length = 16 + 12 * startCharCode.size(); - - writeFixed32(12.0); - writeUInt32(length); - writeUInt32(0); - writeUInt32(startCharCode.size()); - - int i; - for (i = 0; i < startCharCode.size(); i++) { - writeUInt32(startCharCode.get(i)); - writeUInt32(endCharCode.get(i)); - writeUInt32(startGlyphCode.get(i)); - } // for i - } - - /** - * Used for searchRange - * @param a_value - * @return - */ - private int getSearchRange(int a_value) { - int retval - = (int) Math.pow(2, Math.floor(Math.log(a_value) / Math.log(2))); - return 2 * retval; - } - - private int getEntrySelector(int a_searchRange) { - int retval - = (int) (Math.log(a_searchRange / 2) / Math.log(2)); - return retval; - } - - private int getRangeShift(int a_value, int a_searchRange) { - int retval - = 2 * a_value - a_searchRange; - return retval; - } -} +/* + * $Id: CmapWriter.java,v 1.8 2004/01/27 00:35:08 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + +package org.doubletype.ossa.truetype; + +import java.io.*; +import java.util.*; + +/** + * @author e.e + */ +public class CmapWriter extends FontFormatWriter { + final long k_basicLatinStart = 0x20; + final long k_basicLatinEnd = 0x7e; + final long k_tableEnd = 0xffff; + final int k_unmappedChar = 0x0; + + private OS2Writer m_os2; + private List m_unicodes = new ArrayList<>(); + private List m_startCodes = new ArrayList<>(); + private List m_endCodes = new ArrayList<>(); + private Hashtable m_unicode2glyph = new Hashtable<>(); + private List m_unicodeRanges = new ArrayList<>(); + private List m_idDeltas = new ArrayList<>(); + private List m_idRangeOffsets = new ArrayList<>(); + private boolean m_isIncludeVersion0; + private byte [] m_version0; + private byte [] m_version4; + private byte [] m_version12; + + public CmapWriter(OS2Writer a_os2) { + super(); + + m_os2 = a_os2; + m_isIncludeVersion0 = false; + } + + private void prepare() { + Collections.sort(m_unicodeRanges); + + TTUnicodeRange range = (TTUnicodeRange) m_unicodeRanges.get(0); + m_os2.m_usFirstCharIndex = (int) range.getStartCode(); + m_os2.m_usLastCharIndex = (int) range.getEndCode(); + + int i; + for (i = 0; i < m_unicodeRanges.size(); i++) { + range = m_unicodeRanges.get(i); + + m_startCodes.add(range.getStartCode()); + m_endCodes.add(range.getEndCode()); + m_idDeltas.add(0L); + m_idRangeOffsets.add( + 2L * (m_unicodeRanges.size() - i) + 2L + + 2L * (m_unicodes.size())); + + m_os2.m_usLastCharIndex = (int) range.getEndCode(); + m_os2.setUnicodeRangeFlag(range.getOsTwoFlag()); + + for (long unicode = range.getStartCode(); + unicode <= range.getEndCode(); unicode++) + { + m_unicodes.add(unicode); + } // for unicode + } // for i + + m_startCodes.add(k_tableEnd); + m_endCodes.add(k_tableEnd); + m_idDeltas.add(1L); + m_idRangeOffsets.add(0L); + } + + public void write() throws IOException { + prepare(); + + if (m_isIncludeVersion0) { + storeVersion0(); + } // if + storeVersion4(); + + reset(); + + writeUInt16(0); // table version number + writeUInt16(getNumOfEncoding()); // num of encodings + + if (m_isIncludeVersion0) { + writeUInt16(TTName.k_macintosh); + writeUInt16(TTName.k_macRomanEncode); + writeUInt32(size() + 4 + 8); + } // if + + writeUInt16(TTName.k_microsoft); + writeUInt16(TTName.k_winUnicodeEncode); + int version4Offset = size() + 4; + if (m_isIncludeVersion0) { + version4Offset += m_version0.length; + } // if + writeUInt32(version4Offset); + + if (m_isIncludeVersion0) { + m_buffer.write(m_version0); + } // if + + m_buffer.write(m_version4); + pad(); + } + + private int getNumOfEncoding() { + if (m_isIncludeVersion0) { + return 2; + } // if + + return 1; + } + + public void addUnicodeRange(TTUnicodeRange a_range) { + m_unicodeRanges.add(a_range); + } + + public void addMapping(long a_unicode, long a_glyfIndex) { + m_unicode2glyph.put(a_unicode, a_glyfIndex); + } + + /** + * Find 'glyf' index for the given unicode. + * This method returns 0, if a_key was not found, which will be treated + * as unmapped character. + * @param a_key Long object with unicode value. + * @return 'glyf' index if a_key was found; 0 otherwise. + */ + public long getGlyfIndex(Long a_key) { + long retval = 0; + + if (m_unicode2glyph.containsKey(a_key)) { + retval = m_unicode2glyph.get(a_key); + } // if + + return retval; + } + + private void storeVersion0() throws IOException { + reset(); + writeVersion0(); + m_version0 = toByteArray(); + reset(); + } + + private void storeVersion4() throws IOException { + reset(); + writeVersion4(); + m_version4 = toByteArray(); + reset(); + } + + private void storeVersion12() throws IOException { + reset(); + writeVersion12(); + m_version12 = toByteArray(); + reset(); + } + + protected String getTag() { + return "cmap"; + } + + private void writeVersion0() throws IOException { + writeUInt16(0); + writeUInt16(262); + writeUInt16(0); + int i; + for (i = 0; i < 256; i++) { + if ((i == 0x000) || (i == 0x0008) || (i == 0x001D)) { + writeUInt8((int) getGlyfIndex(TTUnicodeRange.k_null)); // .null + } + else if ((i == 0x0009) || (i == 0x000d)) { + writeUInt8((int) getGlyfIndex(TTUnicodeRange.k_cr)); // CR + } + else { + writeUInt8((int) getGlyfIndex((long) i)); + } // if + } // for i + } + + private void writeVersion4() throws IOException { + int segCount = m_startCodes.size(); + int i; + + // endCount + for (i = 0; i < segCount; i++) { + Long n = (Long) m_endCodes.get(i); + writeUInt16(n.intValue()); + } // for i + + // reserverdPad + writeUInt16(0); + + // startCount + for (i = 0; i < segCount; i++) { + Long n = m_startCodes.get(i); + writeUInt16(n.intValue()); + } // for i + + // idDelta + for (i = 0; i < segCount; i++) { + Long n = m_idDeltas.get(i); + writeInt16(n.intValue()); + } // for i + + // idRangeOffset + for (i = 0; i < segCount; i++) { + Long n = m_idRangeOffsets.get(i); + writeInt16(n.intValue()); + } + + // glyphIdArray 2 bytes each + for (i = 0; i < m_unicodes.size(); i++) { + Long unicode = m_unicodes.get(i); + writeUInt16((int) getGlyfIndex(unicode)); + } // for i + + byte [] bytes = m_bytes.toByteArray(); + + reset(); + + writeUInt16(4); + writeUInt16(bytes.length + 14); + writeUInt16(0); + writeUInt16(segCount * 2); + + int searchRange = getSearchRange(segCount); + writeUInt16(searchRange); + writeUInt16(getEntrySelector(searchRange)); + writeUInt16(getRangeShift(segCount, searchRange)); + m_buffer.write(bytes); + } + + public void writeVersion12() throws IOException { + ArrayList startCharCode = new ArrayList<>(); + ArrayList endCharCode = new ArrayList<>(); + ArrayList startGlyphCode = new ArrayList<>(); + + // TODO: map to real one + startCharCode.add(k_basicLatinStart); + endCharCode.add(k_basicLatinEnd); + startGlyphCode.add(1L); + + long length = 16 + 12 * startCharCode.size(); + + writeFixed32(12.0); + writeUInt32(length); + writeUInt32(0); + writeUInt32(startCharCode.size()); + + int i; + for (i = 0; i < startCharCode.size(); i++) { + writeUInt32(startCharCode.get(i)); + writeUInt32(endCharCode.get(i)); + writeUInt32(startGlyphCode.get(i)); + } // for i + } + + /** + * Used for searchRange + * @param a_value + * @return + */ + private int getSearchRange(int a_value) { + int retval + = (int) Math.pow(2, Math.floor(Math.log(a_value) / Math.log(2))); + return 2 * retval; + } + + private int getEntrySelector(int a_searchRange) { + int retval + = (int) (Math.log(a_searchRange / 2) / Math.log(2)); + return retval; + } + + private int getRangeShift(int a_value, int a_searchRange) { + int retval + = 2 * a_value - a_searchRange; + return retval; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java index 97ff35df3..78a4c2681 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/FontFileWriter.java @@ -1,286 +1,286 @@ -/* - * $Id: FontFileWriter.java,v 1.15 2004/10/04 02:25:39 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - - -package org.doubletype.ossa.truetype; - -import java.io.*; -import java.util.*; - -/** - * @author e.e - */ -public class FontFileWriter extends FontFormatWriter { - private CmapWriter m_cmap; - private GlyfWriter m_glyf; - private LocaWriter m_loca; - private HeadWriter m_head; - private HdmxWriter m_hdmx; - private HheaWriter m_hhea; - private HmtxWriter m_hmtx; - private MaxpWriter m_maxp; - private NameWriter m_name; - private PostWriter m_post; - private OS2Writer m_os2; - - protected RandomAccessFile m_file; - private ArrayList m_tables = new ArrayList<>(); - - public FontFileWriter(RandomAccessFile a_file) { - super(); - - m_file = a_file; - - m_loca = new LocaWriter(); - m_maxp = new MaxpWriter(); - m_head = new HeadWriter(); - m_hdmx = new HdmxWriter(); - m_os2 = new OS2Writer(m_head); - m_cmap = new CmapWriter(m_os2); - - m_glyf = new GlyfWriter(m_loca, m_maxp, - m_head, m_hdmx); - - m_hhea = new HheaWriter(m_glyf, m_head); - m_hmtx = new HmtxWriter(m_glyf, m_hhea); - m_name = new NameWriter(); - m_post = new PostWriter(); - - // http://www.microsoft.com/typography/otspec/recom.htm - // head, hhea, maxp, OS/2, hmtx, LTSH, VDMX, hdmx, cmap, - // fpgm, prep, cvt, loca, glyf, kern, name, post, gasp, PCLT, DSIG - /* - m_tables.add(m_head); - m_tables.add(m_hhea); - m_tables.add(m_maxp); - m_tables.add(m_os2); - m_tables.add(m_hmtx); - m_tables.add(m_hdmx); - m_tables.add(m_cmap); - m_tables.add(m_loca); - m_tables.add(m_glyf); - m_tables.add(m_name); - m_tables.add(m_post); - */ - - // Verdana has head, hhea, maxp, OS/2, gasp, name, cmap, loca - // LTSH, VDMX, prep, fpgm, cvt, hmtx, hdmx, glyf, post, kern, edt0, DSIG - m_tables.add(m_head); - m_tables.add(m_hhea); - m_tables.add(m_maxp); - m_tables.add(m_os2); - m_tables.add(m_name); - m_tables.add(m_cmap); - m_tables.add(m_loca); - - m_tables.add(m_hmtx); - m_tables.add(m_hdmx); - m_tables.add(m_glyf); - m_tables.add(m_post); - } - - /** - * write TrueType file to the random access file - */ - public void write() throws IOException { - m_cmap.write(); - // hmtx must be written before hhea - m_hmtx.write(); - m_hhea.write(); - - m_glyf.write(); - m_loca.write(); - - m_head.setCheckSumAdjustment(0); - m_head.write(); - m_maxp.write(); // must be written after m_glyf - m_hdmx.write(); - m_name.write(); - m_post.write(); - m_os2.write(); - - writeTableDirectory(); - byte [] tableDir = toByteArray(); - for (FontFormatWriter table: m_tables) { - m_buffer.write(table.toByteArray()); - } // for table - - long checkSum = 0xb1b0afba - (0xffffffff & getCheckSum()); - m_head.setCheckSumAdjustment(checkSum); - m_head.reset(); - m_head.write(); - - reset(); - - m_buffer.write(tableDir); - for (FontFormatWriter table: m_tables) { - m_buffer.write(table.toByteArray()); - } // for table - - m_file.write(toByteArray()); - m_file.close(); - } - - public void setAscent(int a_value) { - m_os2.setTypoAscender(a_value); - m_os2.setCapHeight(a_value); - } - - public void setDescent(int a_value) { - m_os2.setTypoDescender(-a_value); - } - - public void setXHeight(int a_value) { - m_os2.setXHeight(a_value); - } - - public void setLineGap(int a_value) { - m_os2.setTypoLineGap(a_value); - m_hhea.setLineGap(a_value); - } - - public void setFontFamilyName(String a_name) { - m_name.m_familyName = a_name; - } - - public void setCopyrightYear(String a_year) { - m_name.m_year = a_year; - } - - public void setManufacturer(String a_manufacturer) { - m_name.m_manufacturer = a_manufacturer; - } - - public void setFontVersion(String a_version) { - m_name.m_version = a_version; - } - - public void addUnicodeRange(TTUnicodeRange a_range) { - m_cmap.addUnicodeRange(a_range); - } - - /** - * http://www.microsoft.com/typography/otspec/os2.htm - * @param a_codeRange position of the bit. For example, JIS will be 17. - */ - public void setCodeRangeFlag(int a_codeRange) { - m_os2.setCodePageRangeFlag(a_codeRange); - } - - /** - * adds glyph to the 'glyf' subtable. - * @param a_glyph the glyph to be added. - * @return 'glyf' index of the added glyph. - */ - public int addGlyph(TTGlyph a_glyph) { - return m_glyf.add(a_glyph); - } - - public TTGlyph getGlyph(int a_index) { - return m_glyf.getGlyph(a_index); - } - - /** - * adds character mapping to - * @param a_unicode unicode of the character - * @param a_glyfIndex 'glyf' index obtained from #addGlyph - */ - public void addCharacterMapping(long a_unicode, long a_glyfIndex) { - m_cmap.addMapping(a_unicode, a_glyfIndex); - } - - public long getCharacterMapping(long a_unicode) { - return m_cmap.getGlyfIndex(new Long(a_unicode)); - } - - /** - * writes table directory. - * @throws IOException - */ - private void writeTableDirectory() throws IOException { - int headerLength = m_tables.size() * 16 + 16; - int tableOffset = headerLength; - for (FontFormatWriter table: m_tables) { - table.setOffset(tableOffset); - tableOffset += table.size(); - } // for table - - @SuppressWarnings("unchecked") - ArrayList tables = (ArrayList) m_tables.clone(); - Collections.sort(tables, new Comparator() { - public int compare(FontFormatWriter a_lhs, FontFormatWriter a_rhs) { - return a_lhs.getTag().compareTo(a_rhs.getTag()); - } - - public boolean equals(Object a_value) { - return false; - } - }); - - writeFixed32(1.0); - - int numOfTables = tables.size(); - writeUInt16(numOfTables); - int searchRange = getSearchRange(numOfTables); - writeUInt16(searchRange); - int entrySelector = getEntrySelector(numOfTables); - writeUInt16(entrySelector); - writeUInt16(numOfTables * 16 - searchRange); - - for (FontFormatWriter table: tables) { - writeTag(table.getTag()); - writeUInt32(table.getCheckSum()); - writeUInt32(table.getOffset()); - writeUInt32(table.size()); - } // for - - // padding is always 4 zeros - for (int i = 0; i < 4; i++) { - writeUInt8(0); - } // for i - } - - private int getSearchRange(int a_value) { - int retval - = (int) (Math.pow(2, Math.floor(Math.log(a_value) / Math.log(2)))); - return 16 * retval; - } - - private int getEntrySelector(int a_value) { - int retval - = (int) Math.floor(Math.log(a_value) / Math.log(2)); - return retval; - } -} +/* + * $Id: FontFileWriter.java,v 1.15 2004/10/04 02:25:39 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + + +package org.doubletype.ossa.truetype; + +import java.io.*; +import java.util.*; + +/** + * @author e.e + */ +public class FontFileWriter extends FontFormatWriter { + private CmapWriter m_cmap; + private GlyfWriter m_glyf; + private LocaWriter m_loca; + private HeadWriter m_head; + private HdmxWriter m_hdmx; + private HheaWriter m_hhea; + private HmtxWriter m_hmtx; + private MaxpWriter m_maxp; + private NameWriter m_name; + private PostWriter m_post; + private OS2Writer m_os2; + + protected RandomAccessFile m_file; + private ArrayList m_tables = new ArrayList<>(); + + public FontFileWriter(RandomAccessFile a_file) { + super(); + + m_file = a_file; + + m_loca = new LocaWriter(); + m_maxp = new MaxpWriter(); + m_head = new HeadWriter(); + m_hdmx = new HdmxWriter(); + m_os2 = new OS2Writer(m_head); + m_cmap = new CmapWriter(m_os2); + + m_glyf = new GlyfWriter(m_loca, m_maxp, + m_head, m_hdmx); + + m_hhea = new HheaWriter(m_glyf, m_head); + m_hmtx = new HmtxWriter(m_glyf, m_hhea); + m_name = new NameWriter(); + m_post = new PostWriter(); + + // http://www.microsoft.com/typography/otspec/recom.htm + // head, hhea, maxp, OS/2, hmtx, LTSH, VDMX, hdmx, cmap, + // fpgm, prep, cvt, loca, glyf, kern, name, post, gasp, PCLT, DSIG + /* + m_tables.add(m_head); + m_tables.add(m_hhea); + m_tables.add(m_maxp); + m_tables.add(m_os2); + m_tables.add(m_hmtx); + m_tables.add(m_hdmx); + m_tables.add(m_cmap); + m_tables.add(m_loca); + m_tables.add(m_glyf); + m_tables.add(m_name); + m_tables.add(m_post); + */ + + // Verdana has head, hhea, maxp, OS/2, gasp, name, cmap, loca + // LTSH, VDMX, prep, fpgm, cvt, hmtx, hdmx, glyf, post, kern, edt0, DSIG + m_tables.add(m_head); + m_tables.add(m_hhea); + m_tables.add(m_maxp); + m_tables.add(m_os2); + m_tables.add(m_name); + m_tables.add(m_cmap); + m_tables.add(m_loca); + + m_tables.add(m_hmtx); + m_tables.add(m_hdmx); + m_tables.add(m_glyf); + m_tables.add(m_post); + } + + /** + * write TrueType file to the random access file + */ + public void write() throws IOException { + m_cmap.write(); + // hmtx must be written before hhea + m_hmtx.write(); + m_hhea.write(); + + m_glyf.write(); + m_loca.write(); + + m_head.setCheckSumAdjustment(0); + m_head.write(); + m_maxp.write(); // must be written after m_glyf + m_hdmx.write(); + m_name.write(); + m_post.write(); + m_os2.write(); + + writeTableDirectory(); + byte [] tableDir = toByteArray(); + for (FontFormatWriter table: m_tables) { + m_buffer.write(table.toByteArray()); + } // for table + + long checkSum = 0xb1b0afba - (0xffffffff & getCheckSum()); + m_head.setCheckSumAdjustment(checkSum); + m_head.reset(); + m_head.write(); + + reset(); + + m_buffer.write(tableDir); + for (FontFormatWriter table: m_tables) { + m_buffer.write(table.toByteArray()); + } // for table + + m_file.write(toByteArray()); + m_file.close(); + } + + public void setAscent(int a_value) { + m_os2.setTypoAscender(a_value); + m_os2.setCapHeight(a_value); + } + + public void setDescent(int a_value) { + m_os2.setTypoDescender(-a_value); + } + + public void setXHeight(int a_value) { + m_os2.setXHeight(a_value); + } + + public void setLineGap(int a_value) { + m_os2.setTypoLineGap(a_value); + m_hhea.setLineGap(a_value); + } + + public void setFontFamilyName(String a_name) { + m_name.m_familyName = a_name; + } + + public void setCopyrightYear(String a_year) { + m_name.m_year = a_year; + } + + public void setManufacturer(String a_manufacturer) { + m_name.m_manufacturer = a_manufacturer; + } + + public void setFontVersion(String a_version) { + m_name.m_version = a_version; + } + + public void addUnicodeRange(TTUnicodeRange a_range) { + m_cmap.addUnicodeRange(a_range); + } + + /** + * http://www.microsoft.com/typography/otspec/os2.htm + * @param a_codeRange position of the bit. For example, JIS will be 17. + */ + public void setCodeRangeFlag(int a_codeRange) { + m_os2.setCodePageRangeFlag(a_codeRange); + } + + /** + * adds glyph to the 'glyf' subtable. + * @param a_glyph the glyph to be added. + * @return 'glyf' index of the added glyph. + */ + public int addGlyph(TTGlyph a_glyph) { + return m_glyf.add(a_glyph); + } + + public TTGlyph getGlyph(int a_index) { + return m_glyf.getGlyph(a_index); + } + + /** + * adds character mapping to + * @param a_unicode unicode of the character + * @param a_glyfIndex 'glyf' index obtained from #addGlyph + */ + public void addCharacterMapping(long a_unicode, long a_glyfIndex) { + m_cmap.addMapping(a_unicode, a_glyfIndex); + } + + public long getCharacterMapping(long a_unicode) { + return m_cmap.getGlyfIndex(new Long(a_unicode)); + } + + /** + * writes table directory. + * @throws IOException + */ + private void writeTableDirectory() throws IOException { + int headerLength = m_tables.size() * 16 + 16; + int tableOffset = headerLength; + for (FontFormatWriter table: m_tables) { + table.setOffset(tableOffset); + tableOffset += table.size(); + } // for table + + @SuppressWarnings("unchecked") + ArrayList tables = (ArrayList) m_tables.clone(); + Collections.sort(tables, new Comparator() { + public int compare(FontFormatWriter a_lhs, FontFormatWriter a_rhs) { + return a_lhs.getTag().compareTo(a_rhs.getTag()); + } + + public boolean equals(Object a_value) { + return false; + } + }); + + writeFixed32(1.0); + + int numOfTables = tables.size(); + writeUInt16(numOfTables); + int searchRange = getSearchRange(numOfTables); + writeUInt16(searchRange); + int entrySelector = getEntrySelector(numOfTables); + writeUInt16(entrySelector); + writeUInt16(numOfTables * 16 - searchRange); + + for (FontFormatWriter table: tables) { + writeTag(table.getTag()); + writeUInt32(table.getCheckSum()); + writeUInt32(table.getOffset()); + writeUInt32(table.size()); + } // for + + // padding is always 4 zeros + for (int i = 0; i < 4; i++) { + writeUInt8(0); + } // for i + } + + private int getSearchRange(int a_value) { + int retval + = (int) (Math.pow(2, Math.floor(Math.log(a_value) / Math.log(2)))); + return 16 * retval; + } + + private int getEntrySelector(int a_value) { + int retval + = (int) Math.floor(Math.log(a_value) / Math.log(2)); + return retval; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/truetype/TTUnicodeRange.java b/libsrc/ttf/src/org/doubletype/ossa/truetype/TTUnicodeRange.java index c55084c16..0437f0f36 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/truetype/TTUnicodeRange.java +++ b/libsrc/ttf/src/org/doubletype/ossa/truetype/TTUnicodeRange.java @@ -1,380 +1,380 @@ -/* - * $Id: TTUnicodeRange.java,v 1.1 2004/01/25 11:00:10 eed3si9n Exp $ - * - * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ - * $License: - * This source code is part of DoubleType. - * DoubleType is a graphical typeface designer. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * In addition, as a special exception, e.e d3si9n gives permission to - * link the code of this program with any Java Platform that is available - * to public with free of charge, including but not limited to - * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), - * and distribute linked combinations including the two. - * You must obey the GNU General Public License in all respects for all - * of the code used other than Java Platform. If you modify this file, - * you may extend this exception to your version of the file, but you are not - * obligated to do so. If you do not wish to do so, delete this exception - * statement from your version. - * $ - */ - -package org.doubletype.ossa.truetype; - -import java.util.*; - -import java.lang.Character.UnicodeBlock; - -/** - * @author e.e - */ -public class TTUnicodeRange implements Comparable { - public static final long k_notDef = 0x0001; - public static final long k_null = 0x0000; - public static final long k_cr = 0x000D; - public static final long k_space = 0x0020; - - static private boolean s_isInitialized = false; - static private ArrayList s_list = new ArrayList<>(); - static private TTUnicodeRange s_selected = null; - - static public TTUnicodeRange of(long a_unicode) { - initList(); - - TTUnicodeRange retval = null; - UnicodeBlock block = UnicodeBlock.of((int)a_unicode); - if (block == null) - return retval; - - int i; - for (i = 0; i < s_list.size(); i++) { - TTUnicodeRange range = s_list.get(i); - if (range.m_block.equals(block)) { - return range; - } // if - } // for i - - return retval; - } - - static public TTUnicodeRange getLastFound() { - return s_selected; - } - - static private void initList() { - if (s_isInitialized) - return; - - s_isInitialized = true; - - s_list.add(new TTUnicodeRange( - UnicodeBlock.BASIC_LATIN, 0x0020, 0x007F, 0, 63)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.LATIN_1_SUPPLEMENT, 0x0080, 0x00FF, 1, 0)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.LATIN_EXTENDED_A, 0x0100, 0x017f, 2)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.LATIN_EXTENDED_B, 0x0180, 0x024f, 3)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.IPA_EXTENSIONS, 0x0250, 0x02af, 4)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.SPACING_MODIFIER_LETTERS, 0x02B0, 0x02FF, 5)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.COMBINING_DIACRITICAL_MARKS, 0x0300, 0x036F, 6)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.GREEK, 0x0370, 0x03FF, 7, 3)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.CYRILLIC, 0x0400, 0x04FF, 9, 2)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.ARMENIAN, 0x0530, 0x058F, 10)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.HEBREW, 0x0590, 0x05FF, 11, 5)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.ARABIC, 0x0600, 0x06FF, 13, 6)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.SYRIAC, 0x0700, 0x074F, 71)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.THAANA, 0x0780, 0x07BF, 72)); - - s_list.add(new TTUnicodeRange( - UnicodeBlock.DEVANAGARI, 0x0900, 0x097F, 15)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.BENGALI, 0x0980, 0x09FF, 16)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.GURMUKHI, 0x0A00, 0x0A7F, 17)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.GUJARATI, 0x0A80, 0x0AFF, 18)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.ORIYA, 0x0B00, 0x0B7F, 19)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.TAMIL, 0x0B80, 0x0BFF, 20)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.TELUGU, 0x0C00, 0x0C7F, 21)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.KANNADA, 0x0C80, 0x0CFF, 22)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.MALAYALAM, 0x0D00, 0x0D7F, 23)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.SINHALA, 0x0D80, 0x0DFF, 73)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.THAI, 0x0E00, 0x0E7F, 24, 16)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.LAO, 0x0E80, 0x0EFF, 25)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.TIBETAN, 0x0F00, 0x0FFF, 70)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.MYANMAR, 0x1000, 0x109F, 74)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.GEORGIAN, 0x10A0, 0x10FF, 26)); - // TODO: wansung or johab? - s_list.add(new TTUnicodeRange( - UnicodeBlock.HANGUL_JAMO, 0x1100, 0x11FF, 28, 19)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.ETHIOPIC, 0x1200, 0x137F, 75)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.CHEROKEE, 0x13A0, 0x13FF, 76)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS, 0x1400, 0x167F, 77)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.OGHAM, 0x1680, 0x169F, 78)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.RUNIC, 0x16A0, 0x16FF, 79)); - - // TODO: tagalog, hanunoo, buhid, tagbanwa - - s_list.add(new TTUnicodeRange( - UnicodeBlock.KHMER, 0x1780, 0x17FF, 80)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.MONGOLIAN, 0x1800, 0x18AF, 81)); - - // linbu, tai le, khmer symbol, phonetic extensions, - - s_list.add(new TTUnicodeRange( - UnicodeBlock.LATIN_EXTENDED_ADDITIONAL, 0x1E00, 0x1EFF, 29)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.GREEK_EXTENDED, 0x1F00, 0x1FFF, 30)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.GENERAL_PUNCTUATION, 0x2000, 0x206F, 31)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.SUPERSCRIPTS_AND_SUBSCRIPTS, 0x2070, 0x209F, 32)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.CURRENCY_SYMBOLS, 0x20A0, 0x20CF, 33)); - - // combining diacritical marks - s_list.add(new TTUnicodeRange( - UnicodeBlock.COMBINING_MARKS_FOR_SYMBOLS, 0x20D0, 0x20FF, 34)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.LETTERLIKE_SYMBOLS, 0x2100, 0x214F, 35)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.NUMBER_FORMS, 0x2150, 0x218F, 36)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.ARROWS, 0x2190, 0x21FF, 37)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.MATHEMATICAL_OPERATORS, 0x2200, 0x22FF, 38)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.MISCELLANEOUS_TECHNICAL, 0x2300, 0x23FF, 39)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.CONTROL_PICTURES, 0x2400, 0x243F, 40)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.OPTICAL_CHARACTER_RECOGNITION, 0x2440, 0x245F, 41)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.ENCLOSED_ALPHANUMERICS, 0x2460, 0x24FF, 42)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.BOX_DRAWING, 0x2500, 0x257F, 43)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.BLOCK_ELEMENTS, 0x2580, 0x259F, 44)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.GEOMETRIC_SHAPES, 0x25A0, 0x25FF, 45)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.MISCELLANEOUS_SYMBOLS, 0x2600, 0x26FF, 46)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.DINGBATS, 0x2700, 0x27BF, 47)); - - // TODO: mics. math symbols A, supplemental arrows A - - s_list.add(new TTUnicodeRange( - UnicodeBlock.BRAILLE_PATTERNS, 0x2800, 0x28FF, 82)); - - // TODO: supplemental arrows B, mics. math symbols B, - // supplemental math op., mics. symbols and arrows - - -// CJKV supplements - s_list.add(new TTUnicodeRange( - UnicodeBlock.CJK_RADICALS_SUPPLEMENT, 0x2E80, 0x2EFF, 59)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.KANGXI_RADICALS, 0x2F00, 0x2FDF, 59)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.IDEOGRAPHIC_DESCRIPTION_CHARACTERS, 0x2FF0, 0x2FFF, 59)); - - - s_list.add(new TTUnicodeRange( - UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION, 0x3000, 0x303f, 48)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.HIRAGANA, 0x3040, 0x309f, 49, 17)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.KATAKANA, 0x30a0, 0x30ff, 50, 17)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.BOPOMOFO, 0x3100, 0x312f, 51)); - // TODO: wansung or johab? - s_list.add(new TTUnicodeRange( - UnicodeBlock.HANGUL_COMPATIBILITY_JAMO, 0x3130, 0x0318F, 52, 19)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.KANBUN, 0x3190, 0x319F, 59)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.BOPOMOFO_EXTENDED, 0x31A0, 0x31BF, 51)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.KATAKANA_PHONETIC_EXTENSIONS, 0x31F0, 0x31FF, 50, 17)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.ENCLOSED_CJK_LETTERS_AND_MONTHS, 0x3200, 0x32FF, 54)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.CJK_COMPATIBILITY, 0x3300, 0x33ff, 55)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A, 0x03400, 0x4dbf, 59)); - // TODO: yijing hex symbols - - // the kanji characters - s_list.add(new TTUnicodeRange( - UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS, 0x4e00, 0x9fff, 59, 17)); - - s_list.add(new TTUnicodeRange( - UnicodeBlock.YI_SYLLABLES, 0xA000, 0xA48F, 83)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.YI_RADICALS, 0xA490, 0xA4CF, 83)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.HANGUL_SYLLABLES, 0xAC00, 0xD7AF, 56)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.HIGH_SURROGATES, 0xD800, 0xDB7F, 0)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.HIGH_PRIVATE_USE_SURROGATES, 0xDB80, 0xDBFF, 0)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.LOW_SURROGATES, 0xDC00, 0xDFFF, 0)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.PRIVATE_USE_AREA, 0xE000, 0xF8FF, 60)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS, 0xf900, 0xfaff, 61)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.ALPHABETIC_PRESENTATION_FORMS, 0xFB00, 0xFB4F, 62)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.ARABIC_PRESENTATION_FORMS_A, 0xFB50, 0xFDFF, 62)); - - // TODO: variation selectors - - s_list.add(new TTUnicodeRange( - UnicodeBlock.COMBINING_HALF_MARKS, 0xFE20, 0xFE2F, 64)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.CJK_COMPATIBILITY_FORMS, 0xFE30, 0xFE4F, 65)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.SMALL_FORM_VARIANTS, 0xFE50, 0xFE6F, 66)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.ARABIC_PRESENTATION_FORMS_B, 0xFE70, 0xFEFF, 67)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS, 0xFF00, 0xFFEF, 68, 17)); - s_list.add(new TTUnicodeRange( - UnicodeBlock.SPECIALS, 0xFFF0, 0xFFFF, 69)); - } - - static public boolean find(String a_unicodeRange) { - initList(); - - s_selected = null; - - int i; - for (i = 0; i < s_list.size(); i++) { - TTUnicodeRange range = (TTUnicodeRange) s_list.get(i); - if (range.m_block.toString().equals(a_unicodeRange)) { - s_selected = range; - - return true; - } // if - } // for i - - return false; - } - - - private UnicodeBlock m_block = null; - private long m_start = 0; - private long m_end = 0; - - /** http://www.microsoft.com/typography/otspec/os2.htm - */ - private int m_osTwoFlag = 0; - - /** http://www.microsoft.com/typography/otspec/os2.htm - */ - private int m_codePageFlag = 0; - - public TTUnicodeRange(UnicodeBlock a_block, - long a_start, - long a_end, - int a_osTwoFlag) - { - m_block = a_block; - m_start = a_start; - m_end = a_end; - m_osTwoFlag = a_osTwoFlag; - } - - public TTUnicodeRange(UnicodeBlock a_block, - long a_start, - long a_end, - int a_osTwoFlag, - int a_codePageFlag) - { - m_block = a_block; - m_start = a_start; - m_end = a_end; - m_osTwoFlag = a_osTwoFlag; - m_codePageFlag = a_codePageFlag; - } - - public boolean equals(Object a_object) { - TTUnicodeRange object = (TTUnicodeRange) a_object; - return (m_start == object.m_start); - } - - public int compareTo(Object a_object) { - TTUnicodeRange object = (TTUnicodeRange) a_object; - if (this.m_start < object.m_start) { - return -1; - } else if (this.m_start == object.m_start) { - return 0; - } else - return 1; - } - - public String toString() { - return m_block.toString(); - } - - public long getStartCode() { - return m_start; - } - - public long getEndCode() { - return m_end; - } - - public int getOsTwoFlag() { - return m_osTwoFlag; - } - - public int getCodeRangeFlag() { - return m_codePageFlag; - } -} +/* + * $Id: TTUnicodeRange.java,v 1.1 2004/01/25 11:00:10 eed3si9n Exp $ + * + * $Copyright: copyright (c) 2003-2004, e.e d3si9n $ + * $License: + * This source code is part of DoubleType. + * DoubleType is a graphical typeface designer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, e.e d3si9n gives permission to + * link the code of this program with any Java Platform that is available + * to public with free of charge, including but not limited to + * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), + * and distribute linked combinations including the two. + * You must obey the GNU General Public License in all respects for all + * of the code used other than Java Platform. If you modify this file, + * you may extend this exception to your version of the file, but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. + * $ + */ + +package org.doubletype.ossa.truetype; + +import java.util.*; + +import java.lang.Character.UnicodeBlock; + +/** + * @author e.e + */ +public class TTUnicodeRange implements Comparable { + public static final long k_notDef = 0x0001; + public static final long k_null = 0x0000; + public static final long k_cr = 0x000D; + public static final long k_space = 0x0020; + + static private boolean s_isInitialized = false; + static private ArrayList s_list = new ArrayList<>(); + static private TTUnicodeRange s_selected = null; + + static public TTUnicodeRange of(long a_unicode) { + initList(); + + TTUnicodeRange retval = null; + UnicodeBlock block = UnicodeBlock.of((int)a_unicode); + if (block == null) + return retval; + + int i; + for (i = 0; i < s_list.size(); i++) { + TTUnicodeRange range = s_list.get(i); + if (range.m_block.equals(block)) { + return range; + } // if + } // for i + + return retval; + } + + static public TTUnicodeRange getLastFound() { + return s_selected; + } + + static private void initList() { + if (s_isInitialized) + return; + + s_isInitialized = true; + + s_list.add(new TTUnicodeRange( + UnicodeBlock.BASIC_LATIN, 0x0020, 0x007F, 0, 63)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.LATIN_1_SUPPLEMENT, 0x0080, 0x00FF, 1, 0)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.LATIN_EXTENDED_A, 0x0100, 0x017f, 2)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.LATIN_EXTENDED_B, 0x0180, 0x024f, 3)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.IPA_EXTENSIONS, 0x0250, 0x02af, 4)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.SPACING_MODIFIER_LETTERS, 0x02B0, 0x02FF, 5)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.COMBINING_DIACRITICAL_MARKS, 0x0300, 0x036F, 6)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.GREEK, 0x0370, 0x03FF, 7, 3)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.CYRILLIC, 0x0400, 0x04FF, 9, 2)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.ARMENIAN, 0x0530, 0x058F, 10)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.HEBREW, 0x0590, 0x05FF, 11, 5)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.ARABIC, 0x0600, 0x06FF, 13, 6)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.SYRIAC, 0x0700, 0x074F, 71)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.THAANA, 0x0780, 0x07BF, 72)); + + s_list.add(new TTUnicodeRange( + UnicodeBlock.DEVANAGARI, 0x0900, 0x097F, 15)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.BENGALI, 0x0980, 0x09FF, 16)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.GURMUKHI, 0x0A00, 0x0A7F, 17)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.GUJARATI, 0x0A80, 0x0AFF, 18)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.ORIYA, 0x0B00, 0x0B7F, 19)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.TAMIL, 0x0B80, 0x0BFF, 20)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.TELUGU, 0x0C00, 0x0C7F, 21)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.KANNADA, 0x0C80, 0x0CFF, 22)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.MALAYALAM, 0x0D00, 0x0D7F, 23)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.SINHALA, 0x0D80, 0x0DFF, 73)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.THAI, 0x0E00, 0x0E7F, 24, 16)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.LAO, 0x0E80, 0x0EFF, 25)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.TIBETAN, 0x0F00, 0x0FFF, 70)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.MYANMAR, 0x1000, 0x109F, 74)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.GEORGIAN, 0x10A0, 0x10FF, 26)); + // TODO: wansung or johab? + s_list.add(new TTUnicodeRange( + UnicodeBlock.HANGUL_JAMO, 0x1100, 0x11FF, 28, 19)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.ETHIOPIC, 0x1200, 0x137F, 75)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.CHEROKEE, 0x13A0, 0x13FF, 76)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS, 0x1400, 0x167F, 77)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.OGHAM, 0x1680, 0x169F, 78)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.RUNIC, 0x16A0, 0x16FF, 79)); + + // TODO: tagalog, hanunoo, buhid, tagbanwa + + s_list.add(new TTUnicodeRange( + UnicodeBlock.KHMER, 0x1780, 0x17FF, 80)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.MONGOLIAN, 0x1800, 0x18AF, 81)); + + // linbu, tai le, khmer symbol, phonetic extensions, + + s_list.add(new TTUnicodeRange( + UnicodeBlock.LATIN_EXTENDED_ADDITIONAL, 0x1E00, 0x1EFF, 29)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.GREEK_EXTENDED, 0x1F00, 0x1FFF, 30)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.GENERAL_PUNCTUATION, 0x2000, 0x206F, 31)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.SUPERSCRIPTS_AND_SUBSCRIPTS, 0x2070, 0x209F, 32)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.CURRENCY_SYMBOLS, 0x20A0, 0x20CF, 33)); + + // combining diacritical marks + s_list.add(new TTUnicodeRange( + UnicodeBlock.COMBINING_MARKS_FOR_SYMBOLS, 0x20D0, 0x20FF, 34)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.LETTERLIKE_SYMBOLS, 0x2100, 0x214F, 35)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.NUMBER_FORMS, 0x2150, 0x218F, 36)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.ARROWS, 0x2190, 0x21FF, 37)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.MATHEMATICAL_OPERATORS, 0x2200, 0x22FF, 38)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.MISCELLANEOUS_TECHNICAL, 0x2300, 0x23FF, 39)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.CONTROL_PICTURES, 0x2400, 0x243F, 40)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.OPTICAL_CHARACTER_RECOGNITION, 0x2440, 0x245F, 41)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.ENCLOSED_ALPHANUMERICS, 0x2460, 0x24FF, 42)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.BOX_DRAWING, 0x2500, 0x257F, 43)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.BLOCK_ELEMENTS, 0x2580, 0x259F, 44)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.GEOMETRIC_SHAPES, 0x25A0, 0x25FF, 45)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.MISCELLANEOUS_SYMBOLS, 0x2600, 0x26FF, 46)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.DINGBATS, 0x2700, 0x27BF, 47)); + + // TODO: mics. math symbols A, supplemental arrows A + + s_list.add(new TTUnicodeRange( + UnicodeBlock.BRAILLE_PATTERNS, 0x2800, 0x28FF, 82)); + + // TODO: supplemental arrows B, mics. math symbols B, + // supplemental math op., mics. symbols and arrows + + +// CJKV supplements + s_list.add(new TTUnicodeRange( + UnicodeBlock.CJK_RADICALS_SUPPLEMENT, 0x2E80, 0x2EFF, 59)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.KANGXI_RADICALS, 0x2F00, 0x2FDF, 59)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.IDEOGRAPHIC_DESCRIPTION_CHARACTERS, 0x2FF0, 0x2FFF, 59)); + + + s_list.add(new TTUnicodeRange( + UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION, 0x3000, 0x303f, 48)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.HIRAGANA, 0x3040, 0x309f, 49, 17)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.KATAKANA, 0x30a0, 0x30ff, 50, 17)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.BOPOMOFO, 0x3100, 0x312f, 51)); + // TODO: wansung or johab? + s_list.add(new TTUnicodeRange( + UnicodeBlock.HANGUL_COMPATIBILITY_JAMO, 0x3130, 0x0318F, 52, 19)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.KANBUN, 0x3190, 0x319F, 59)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.BOPOMOFO_EXTENDED, 0x31A0, 0x31BF, 51)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.KATAKANA_PHONETIC_EXTENSIONS, 0x31F0, 0x31FF, 50, 17)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.ENCLOSED_CJK_LETTERS_AND_MONTHS, 0x3200, 0x32FF, 54)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.CJK_COMPATIBILITY, 0x3300, 0x33ff, 55)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A, 0x03400, 0x4dbf, 59)); + // TODO: yijing hex symbols + + // the kanji characters + s_list.add(new TTUnicodeRange( + UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS, 0x4e00, 0x9fff, 59, 17)); + + s_list.add(new TTUnicodeRange( + UnicodeBlock.YI_SYLLABLES, 0xA000, 0xA48F, 83)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.YI_RADICALS, 0xA490, 0xA4CF, 83)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.HANGUL_SYLLABLES, 0xAC00, 0xD7AF, 56)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.HIGH_SURROGATES, 0xD800, 0xDB7F, 0)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.HIGH_PRIVATE_USE_SURROGATES, 0xDB80, 0xDBFF, 0)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.LOW_SURROGATES, 0xDC00, 0xDFFF, 0)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.PRIVATE_USE_AREA, 0xE000, 0xF8FF, 60)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS, 0xf900, 0xfaff, 61)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.ALPHABETIC_PRESENTATION_FORMS, 0xFB00, 0xFB4F, 62)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.ARABIC_PRESENTATION_FORMS_A, 0xFB50, 0xFDFF, 62)); + + // TODO: variation selectors + + s_list.add(new TTUnicodeRange( + UnicodeBlock.COMBINING_HALF_MARKS, 0xFE20, 0xFE2F, 64)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.CJK_COMPATIBILITY_FORMS, 0xFE30, 0xFE4F, 65)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.SMALL_FORM_VARIANTS, 0xFE50, 0xFE6F, 66)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.ARABIC_PRESENTATION_FORMS_B, 0xFE70, 0xFEFF, 67)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS, 0xFF00, 0xFFEF, 68, 17)); + s_list.add(new TTUnicodeRange( + UnicodeBlock.SPECIALS, 0xFFF0, 0xFFFF, 69)); + } + + static public boolean find(String a_unicodeRange) { + initList(); + + s_selected = null; + + int i; + for (i = 0; i < s_list.size(); i++) { + TTUnicodeRange range = (TTUnicodeRange) s_list.get(i); + if (range.m_block.toString().equals(a_unicodeRange)) { + s_selected = range; + + return true; + } // if + } // for i + + return false; + } + + + private UnicodeBlock m_block = null; + private long m_start = 0; + private long m_end = 0; + + /** http://www.microsoft.com/typography/otspec/os2.htm + */ + private int m_osTwoFlag = 0; + + /** http://www.microsoft.com/typography/otspec/os2.htm + */ + private int m_codePageFlag = 0; + + public TTUnicodeRange(UnicodeBlock a_block, + long a_start, + long a_end, + int a_osTwoFlag) + { + m_block = a_block; + m_start = a_start; + m_end = a_end; + m_osTwoFlag = a_osTwoFlag; + } + + public TTUnicodeRange(UnicodeBlock a_block, + long a_start, + long a_end, + int a_osTwoFlag, + int a_codePageFlag) + { + m_block = a_block; + m_start = a_start; + m_end = a_end; + m_osTwoFlag = a_osTwoFlag; + m_codePageFlag = a_codePageFlag; + } + + public boolean equals(Object a_object) { + TTUnicodeRange object = (TTUnicodeRange) a_object; + return (m_start == object.m_start); + } + + public int compareTo(TTUnicodeRange a_object) { + TTUnicodeRange object = a_object; + if (this.m_start < object.m_start) { + return -1; + } else if (this.m_start == object.m_start) { + return 0; + } else + return 1; + } + + public String toString() { + return m_block.toString(); + } + + public long getStartCode() { + return m_start; + } + + public long getEndCode() { + return m_end; + } + + public int getOsTwoFlag() { + return m_osTwoFlag; + } + + public int getCodeRangeFlag() { + return m_codePageFlag; + } +} diff --git a/libsrc/ttf/src/org/doubletype/ossa/xml/RInterleave.java b/libsrc/ttf/src/org/doubletype/ossa/xml/RInterleave.java index 5abbc2c00..2c158592a 100644 --- a/libsrc/ttf/src/org/doubletype/ossa/xml/RInterleave.java +++ b/libsrc/ttf/src/org/doubletype/ossa/xml/RInterleave.java @@ -1,757 +1,753 @@ -/* - * The Relaxer artifact - * Copyright (c) 2000-2004, ASAMI Tomoharu, All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package org.doubletype.ossa.xml; - -import java.util.*; -import java.net.URL; -import java.math.*; -import java.lang.reflect.*; -import java.sql.Time; -import java.sql.Timestamp; -import org.w3c.dom.*; - -/** - * RInterleave - * - * @since May. 13, 2002 - * @version Oct. 22, 2003 - * @author ASAMI, Tomoharu (asami@relaxer.org) - */ -@SuppressWarnings("all") -public final class RInterleave { - private RStack rstack_; - private List entries_ = new ArrayList<>(); - private Map entryByStateClass_ = new HashMap<>(); - private Map entryByElementName_ = new HashMap<>(); - private Boolean isMatch_ = null; - - public RInterleave(RStack rstack) { - rstack_ = rstack; - } - - public Object getProperty(Class stateClass) { - StateClassEntry entry = _getEntryByStateClass(stateClass); - return (entry.getObject()); - } - - public Object[] getPropertyList(Class stateClass) { - StateClassEntry entry = _getEntryByStateClass(stateClass); - return (entry.getObjects()); - } - - public String getElementPropertyAsString(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsString(element)); - } - - public boolean getElementPropertyAsBoolean(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (false); - } - return (URelaxer.getElementPropertyAsBoolean(element)); - } - - public Boolean getElementPropertyAsBooleanObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsBooleanObject(element)); - } - - public byte getElementPropertyAsByte(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (-1); - } - return (URelaxer.getElementPropertyAsByte(element)); - } - - public Byte getElementPropertyAsByteObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsByteObject(element)); - } - - public short getElementPropertyAsShort(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (-1); - } - return (URelaxer.getElementPropertyAsShort(element)); - } - - public Short getElementPropertyAsShortObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsShortObject(element)); - } - - public int getElementPropertyAsInt(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (-1); - } - return (URelaxer.getElementPropertyAsInt(element)); - } - - public Integer getElementPropertyAsIntObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsIntObject(element)); - } - - public long getElementPropertyAsLong(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (-1); - } - return (URelaxer.getElementPropertyAsLong(element)); - } - - public Long getElementPropertyAsLongObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsLongObject(element)); - } - - public float getElementPropertyAsFloat(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (Float.NaN); - } - return (URelaxer.getElementPropertyAsFloat(element)); - } - - public Float getElementPropertyAsFloatObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsFloatObject(element)); - } - - public double getElementPropertyAsDouble(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (Double.NaN); - } - return (URelaxer.getElementPropertyAsDouble(element)); - } - - public Double getElementPropertyAsDoubleObject(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsDoubleObject(element)); - } - - public BigDecimal getElementPropertyAsBigDecimal(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsBigDecimal(element)); - } - - public BigInteger getElementPropertyAsBigInteger(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsBigInteger(element)); - } - - public Date getElementPropertyAsDate(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsDate(element)); - } - - public Locale getElementPropertyAsLocale(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsLocale(element)); - } - - public URL getElementPropertyAsURL(String elementName) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsURL(element)); - } - - public java.sql.Timestamp getElementPropertyAsSQLTimestamp( - String elementName - ) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsSQLTimestamp(element)); - } - - public java.sql.Time getElementPropertyAsSQLTime( - String elementName - ) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsSQLTime(element)); - } - - public java.sql.Date getElementPropertyAsSQLDate( - String elementName - ) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsSQLDate(element)); - } - - public byte[] getElementPropertyAsBinaryBASE64( - String elementName - ) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsBinaryBASE64(element)); - } - - public byte[] getElementPropertyAsBinaryHEX( - String elementName - ) { - Element element = _getElementByElementName(elementName); - if (element == null) { - return (null); - } - return (URelaxer.getElementPropertyAsBinaryHEX(element)); - } - - public List getElementPropertyAsStringList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsString(element)); - } - return (result); - } - - public List getElementPropertyAsBooleanList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsBooleanObject(element)); - } - return (result); - } - - public List getElementPropertyAsByteList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsByteObject(element)); - } - return (result); - } - - public List getElementPropertyAsShortList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsShortObject(element)); - } - return (result); - } - - public List getElementPropertyAsIntList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsIntObject(element)); - } - return (result); - } - - public List getElementPropertyAsLongList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsLongObject(element)); - } - return (result); - } - - public List getElementPropertyAsFloatList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsFloatObject(element)); - } - return (result); - } - - public List getElementPropertyAsDoubleList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsDoubleObject(element)); - } - return (result); - } - - public List getElementPropertyAsBigDecimalList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsBigDecimal(element)); - } - return (result); - } - - public List getElementPropertyAsBigIntegerList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsBigInteger(element)); - } - return (result); - } - - public List getElementPropertyAsDateList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsDate(element)); - } - return (result); - } - - public List getElementPropertyAsLocaleList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsLocale(element)); - } - return (result); - } - - public List getElementPropertyAsURLList(String elementName) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsURL(element)); - } - return (result); - } - - public List getElementPropertyAsSQLTimestampList( - String elementName - ) { - List list = _getElementListByElementName(elementName); - int size = list.size(); - List result = new ArrayList<>(); - for (int i = 0;i < size;i++) { - Element element = (Element)list.get(i); - result.add(URelaxer.getElementPropertyAsSQLTimestamp(element)); - } - return (result); - } - - public List