/* * $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.lang.Character.UnicodeBlock; import java.util.ArrayList; /** * @author e.e */ public class TTUnicodeRange implements Comparable<TTUnicodeRange> { 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<TTUnicodeRange> 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; } } 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; } } 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; } }