1 /* 2 ******************************************************************************* 3 * Copyright (C) 1998-2015, International Business Machines Corporation and 4 * others. All Rights Reserved. 5 ******************************************************************************* 6 */ 7 package com.ibm.icu.dev.tool.layout; 8 9 import com.ibm.icu.lang.UScript; 10 11 public class ScriptTagModuleWriter extends ScriptModuleWriter 12 { 13 public ScriptTagModuleWriter(ScriptData theScriptData, LanguageData theLanguageData) 14 { 15 super(theScriptData, theLanguageData); 16 } 17 18 private void writeTagValueHeader(TagValueData data, String kind) 19 { 20 int min = data.getMinValue(); 21 int max = data.getMaxValue(); 22 23 for (int value = min; value <= max; value += 1) { 24 output.print("const LETag "); 25 output.print(data.getTagLabel(value)); 26 output.print(kind); 27 output.print("Tag = "); 28 output.print(data.makeTag(value)); 29 output.print("; /* '"); 30 output.print(data.getTag(value)); 31 output.print("' ("); 32 output.print(data.getName(value)); 33 output.println(") */"); 34 if(kind.equals("Script")) { 35 switch(value) { 36 case UScript.BENGALI: 37 output.println("const LETag bng2ScriptTag = 0x626E6732; /* 'bng2' (BENGALI v.2) (manually added) */"); 38 break; 39 case UScript.DEVANAGARI: 40 output.println("const LETag dev2ScriptTag = 0x64657632; /* 'dev2' (DEVANAGARI v.2) (manually added) */"); 41 break; 42 case UScript.GUJARATI: 43 output.println("const LETag gjr2ScriptTag = 0x676A7232; /* 'gjr2' (GUJARATI v.2) (manually added) */"); 44 break; 45 case UScript.GURMUKHI: 46 output.println("const LETag gur2ScriptTag = 0x67757232; /* 'gur2' (GURMUKHI v.2) (manually added) */"); 47 break; 48 case UScript.KANNADA: 49 output.println("const LETag knd2ScriptTag = 0x6B6E6432; /* 'knd2' (KANNADA v.2) (manually added) */"); 50 break; 51 case UScript.MALAYALAM: 52 output.println("const LETag mlm2ScriptTag = 0x6D6C6D32; /* 'mlm2' (MALAYALAM v.2) (manually added) */"); 53 break; 54 case UScript.ORIYA: 55 output.println("const LETag ory2ScriptTag = 0x6F727932; /* 'ory2' (ORIYA v.2) (manually added) */"); 56 break; 57 case UScript.TAMIL: 58 output.println("const LETag tml2ScriptTag = 0x746D6C32; /* 'tml2' (TAMIL v.2) (manually added) */"); 59 break; 60 case UScript.TELUGU: 61 output.println("const LETag tel2ScriptTag = 0x74656C32; /* 'tel2' (TELUGU v.2) (manually added) */"); 62 break; 63 default: 64 break; 65 } 66 } 67 } 68 } 69 70 public void writeHeaderFile(String fileName) 71 { 72 openFile(fileName); 73 writeHeader("__SCRIPTANDLANGUAGES_H", hIncludes, hPreamble); 74 75 writeTagValueHeader(scriptData, "Script"); 76 77 output.println(hScriptPostamble); 78 79 writeTagValueHeader(languageData, "Language"); 80 81 output.println(hPostamble); 82 closeFile(); 83 } 84 85 private void writeTagValueCPP(TagValueData data, String kind) 86 { 87 int min = data.getMinValue(); 88 int max = data.getMaxValue(); 89 90 for (int value = min; value <= max; value += 1) { 91 output.print(" "); 92 output.print(data.getTagLabel(value)); 93 output.print(kind); 94 output.print("Tag"); 95 output.print((value == max? " " : ",")); 96 output.print(" /* '"); 97 output.print(data.getTag(value)); 98 output.print("' ("); 99 output.print(data.getName(value)); 100 output.println(") */"); 101 } 102 } 103 104 public void writeCPPFile(String fileName) 105 { 106 openFile(fileName); 107 writeHeader(null, cppIncludes); 108 output.println(cppPreamble); 109 110 writeTagValueCPP(scriptData, "Script"); 111 112 output.println(cppScriptPostamble); 113 114 writeTagValueCPP(languageData, "Language"); 115 116 output.println(cppPostamble); 117 118 writeTrailer(); 119 closeFile(); 120 } 121 122 public void writeScriptTags(String fileName) 123 { 124 writeHeaderFile(fileName + ".h"); 125 writeCPPFile(fileName + ".cpp"); 126 } 127 128 private static final String[] hIncludes = {"LETypes.h"}; 129 130 private static final String hPreamble = 131 "/**\n" + 132 " * \\file\n" + 133 " * \\internal\n" + 134 " */\n" + 135 "\n"; 136 137 private static final String hScriptPostamble = 138 "\n" + 139 "const LETag nullScriptTag = 0x00000000; /* '' (NULL) */\n" + 140 "\n"; 141 142 private static final String hPostamble = 143 "\n" + 144 "\n" + 145 "U_NAMESPACE_END\n" + 146 "#endif"; 147 148 private static final String[] cppIncludes = 149 {"LETypes.h", "ScriptAndLanguageTags.h", "OpenTypeLayoutEngine.h"}; 150 151 private static final String cppPreamble = 152 "const LETag OpenTypeLayoutEngine::scriptTags[] = {"; 153 154 private static final String cppScriptPostamble = 155 "};\n" + 156 "\n" + 157 "const LETag OpenTypeLayoutEngine::languageTags[] = {"; 158 159 private static final String cppPostamble = 160 "};\n"; 161 }