//----------------------------------------------------------------------------------------------------x /// <summary></summary> /// <param name="sLine"></param> /// <param name="type1FontData"></param> internal CharMetrics(String sLine, Type1FontData type1FontData) { String[] asLineToken = sLine.Split(Type1FontData.acDelimiterSemicolon, 10); if (asLineToken.Length <= 2) { throw new ReportException("Invalid character metrics definition in AFM file: " + type1FontData.sFontName); } for (Int32 iExpr = 0; iExpr < asLineToken.Length; iExpr++) { if (asLineToken[iExpr].Length == 0) { continue; } String[] asToken = asLineToken[iExpr].Trim().Split(acDelimiterToken, 5); switch (asToken[0]) { case "C": { iCharacterCode = Int32.Parse(asToken[1]); break; } case "CH": { iCharacterCode = Int32.Parse(asToken[1], System.Globalization.NumberStyles.HexNumber); break; } case "WX": case "W0X": { fWidthX = Single.Parse(asToken[1]); break; } case "N": { sName = asToken[1]; break; } case "B": { fBBox_llx = Single.Parse(asToken[1]); fBBox_lly = Single.Parse(asToken[2]); fBBox_urx = Single.Parse(asToken[3]); fBBox_ury = Single.Parse(asToken[4]); break; } case "L": { if (al_Ligature == null) { al_Ligature = new ArrayList(10); } al_Ligature.Add(new Ligature(asToken[1], asToken[2])); break; } default: { Debug.Fail("Unknown token [" + asToken[0] + "] in AFM file: " + type1FontData.sFontName); break; } } } // find index Int32 iIndex = iCharacterCode; if (type1FontData.sFontName != "Symbol" && type1FontData.sFontName != "ZapfDingbats") { switch (iIndex) { case 39: iIndex = 0; break; // quoteright case 96: iIndex = 0; break; // quoteleft case 127: iIndex = -1; break; // does not exist! case 128: iIndex = -1; break; // does not exist! case 129: iIndex = -1; break; // does not exist! case 130: iIndex = -1; break; // does not exist! case 131: iIndex = -1; break; // does not exist! case 132: iIndex = -1; break; // does not exist! case 133: iIndex = -1; break; // does not exist! case 134: iIndex = -1; break; // does not exist! case 135: iIndex = -1; break; // does not exist! case 136: iIndex = -1; break; // does not exist! case 137: iIndex = -1; break; // does not exist! case 138: iIndex = -1; break; // does not exist! case 139: iIndex = -1; break; // does not exist! case 140: iIndex = -1; break; // does not exist! case 141: iIndex = -1; break; // does not exist! case 142: iIndex = -1; break; // does not exist! case 143: iIndex = -1; break; // does not exist! case 144: iIndex = -1; break; // does not exist! case 145: iIndex = -1; break; // does not exist! case 146: iIndex = -1; break; // does not exist! case 147: iIndex = -1; break; // does not exist! case 148: iIndex = -1; break; // does not exist! case 149: iIndex = -1; break; // does not exist! case 150: iIndex = -1; break; // does not exist! case 151: iIndex = -1; break; // does not exist! case 152: iIndex = -1; break; // does not exist! case 153: iIndex = -1; break; // does not exist! case 154: iIndex = -1; break; // does not exist! case 155: iIndex = -1; break; // does not exist! case 156: iIndex = -1; break; // does not exist! case 157: iIndex = -1; break; // does not exist! case 158: iIndex = -1; break; // does not exist! case 159: iIndex = -1; break; // does not exist! case 160: iIndex = -1; break; // does not exist! case 164: iIndex = 0; break; // fraction "/" case 166: iIndex = 0; break; // florin case 168: iIndex = 164; break; // currency "¤" case 169: iIndex = 39; break; // quotesingle "'" case 170: iIndex = 0; break; // quotedblleft case 172: iIndex = 0; break; // guilsinglleft case 173: iIndex = 0; break; // guilsinglright case 174: iIndex = 0; break; // fi case 175: iIndex = 0; break; // fl case 176: iIndex = -1; break; // does not exist! case 177: iIndex = 0; break; // endash "-" case 178: iIndex = 0; break; // dagger case 179: iIndex = 0; break; // daggerdbl case 180: iIndex = 183; break; // periodcentered case 183: iIndex = 0; break; // bullet case 184: iIndex = 0; break; // quotesinglbase case 185: iIndex = 0; break; // quotedblbase case 186: iIndex = 0; break; // quotedblright case 188: iIndex = 0; break; // ellipsis case 189: iIndex = 0; break; // perthousand case 190: iIndex = -1; break; // does not exist! case 192: iIndex = -1; break; // does not exist! case 193: iIndex = 96; break; // grave "`" case 194: iIndex = 180; break; // acute "´" case 195: iIndex = 0; break; // circumflex "^" case 196: iIndex = 0; break; // tilde "~" case 197: iIndex = 175; break; // macron case 198: iIndex = 0; break; // breve case 199: iIndex = 0; break; // dotaccent case 200: iIndex = 168; break; // dieresis "¨" case 201: iIndex = -1; break; // does not exist! case 202: iIndex = 0; break; // ring case 203: iIndex = 184; break; // cedilla "¨" case 204: iIndex = -1; break; // does not exist! case 205: iIndex = 0; break; // hungarumlaut case 206: iIndex = 0; break; // ogonek case 207: iIndex = 0; break; // caron case 208: iIndex = 0; break; // emdash case 209: iIndex = -1; break; // does not exist! case 210: iIndex = -1; break; // does not exist! case 211: iIndex = -1; break; // does not exist! case 212: iIndex = -1; break; // does not exist! case 213: iIndex = -1; break; // does not exist! case 214: iIndex = -1; break; // does not exist! case 215: iIndex = -1; break; // does not exist! case 216: iIndex = -1; break; // does not exist! case 217: iIndex = -1; break; // does not exist! case 218: iIndex = -1; break; // does not exist! case 219: iIndex = -1; break; // does not exist! case 220: iIndex = -1; break; // does not exist! case 221: iIndex = -1; break; // does not exist! case 222: iIndex = -1; break; // does not exist! case 223: iIndex = -1; break; // does not exist! case 224: iIndex = -1; break; // does not exist! case 225: iIndex = 198; break; // AE case 226: iIndex = -1; break; // does not exist! case 227: iIndex = 170; break; // ordfeminine case 228: iIndex = -1; break; // does not exist! case 229: iIndex = -1; break; // does not exist! case 230: iIndex = -1; break; // does not exist! case 231: iIndex = -1; break; // does not exist! case 232: iIndex = 0; break; // Lslash case 233: iIndex = 216; break; // Oslash case 234: iIndex = 0; break; // OE case 235: iIndex = 186; break; // ordmasculine case 236: iIndex = -1; break; // does not exist! case 237: iIndex = -1; break; // does not exist! case 238: iIndex = -1; break; // does not exist! case 239: iIndex = -1; break; // does not exist! case 240: iIndex = -1; break; // does not exist! case 241: iIndex = 230; break; // ae case 242: iIndex = -1; break; // does not exist! case 243: iIndex = -1; break; // does not exist! case 244: iIndex = -1; break; // does not exist! case 245: iIndex = 0; break; // dotlessi case 246: iIndex = -1; break; // does not exist! case 247: iIndex = -1; break; // does not exist! case 248: iIndex = 0; break; // lslash case 249: iIndex = 248; break; // oslash case 250: iIndex = 0; break; // oe case 251: iIndex = 223; break; // germandbls case -1: { switch (sName) { case "brokenbar": iIndex = 166; break; case "copyright": iIndex = 169; break; case "logicalnot": iIndex = 172; break; case "registered": iIndex = 174; break; case "degree": iIndex = 176; break; case "plusminus": iIndex = 177; break; case "twosuperior": iIndex = 178; break; case "threesuperior": iIndex = 179; break; case "mu": iIndex = 181; break; case "onesuperior": iIndex = 185; break; case "onequarter": iIndex = 188; break; case "onehalf": iIndex = 189; break; case "threequarters": iIndex = 190; break; case "Agrave": iIndex = 192; break; case "Aacute": iIndex = 193; break; case "Acircumflex": iIndex = 194; break; case "Atilde": iIndex = 195; break; case "Adieresis": iIndex = 196; break; case "Aring": iIndex = 197; break; case "Ccedilla": iIndex = 199; break; case "Egrave": iIndex = 200; break; case "Eacute": iIndex = 201; break; case "Ecircumflex": iIndex = 202; break; case "Edieresis": iIndex = 203; break; case "Igrave": iIndex = 204; break; case "Iacute": iIndex = 205; break; case "Icircumflex": iIndex = 206; break; case "Idieresis": iIndex = 207; break; case "Eth": iIndex = 208; break; case "Ntilde": iIndex = 209; break; case "Ograve": iIndex = 210; break; case "Oacute": iIndex = 211; break; case "Ocircumflex": iIndex = 212; break; case "Otilde": iIndex = 213; break; case "Odieresis": iIndex = 214; break; case "multiply": iIndex = 215; break; case "Ugrave": iIndex = 217; break; case "Uacute": iIndex = 218; break; case "Ucircumflex": iIndex = 219; break; case "Udieresis": iIndex = 220; break; case "Yacute": iIndex = 221; break; case "Thorn": iIndex = 222; break; case "agrave": iIndex = 224; break; case "aacute": iIndex = 225; break; case "acircumflex": iIndex = 226; break; case "atilde": iIndex = 227; break; case "adieresis": iIndex = 228; break; case "aring": iIndex = 229; break; case "ccedilla": iIndex = 231; break; case "egrave": iIndex = 232; break; case "eacute": iIndex = 233; break; case "ecircumflex": iIndex = 234; break; case "edieresis": iIndex = 235; break; case "igrave": iIndex = 236; break; case "iacute": iIndex = 237; break; case "icircumflex": iIndex = 238; break; case "idieresis": iIndex = 239; break; case "eth": iIndex = 240; break; case "ntilde": iIndex = 241; break; case "ograve": iIndex = 242; break; case "oacute": iIndex = 243; break; case "ocircumflex": iIndex = 244; break; case "otilde": iIndex = 245; break; case "odieresis": iIndex = 246; break; case "divide": iIndex = 247; break; case "ugrave": iIndex = 249; break; case "uacute": iIndex = 250; break; case "ucircumflex": iIndex = 251; break; case "udieresis": iIndex = 252; break; case "yacute": iIndex = 253; break; case "thorn": iIndex = 254; break; case "ydieresis": iIndex = 255; break; case "Amacron": iIndex = 256; break; case "Abreve": iIndex = 258; break; case "abreve": iIndex = 259; break; case "Aogonek": iIndex = 260; break; case "aogonek": iIndex = 261; break; case "Cacute": iIndex = 262; break; case "cacute": iIndex = 263; break; case "Ccaron": iIndex = 268; break; case "ccaron": iIndex = 269; break; case "Dcaron": iIndex = 270; break; case "dcaron": iIndex = 271; break; case "Dcroat": iIndex = 272; break; case "dcroat": iIndex = 273; break; case "Emacron": iIndex = 274; break; case "emacron": iIndex = 275; break; case "Edotaccent": iIndex = 278; break; case "edotaccent": iIndex = 279; break; case "Eogonek": iIndex = 280; break; case "eogonek": iIndex = 281; break; case "Ecaron": iIndex = 282; break; case "ecaron": iIndex = 283; break; case "Gbreve": iIndex = 286; break; case "gbreve": iIndex = 287; break; case "Gcommaaccent": iIndex = 290; break; case "gcommaaccent": iIndex = 291; break; case "Imacron": iIndex = 298; break; case "imacron": iIndex = 299; break; case "Euro": iIndex = 128; break; default: { iIndex = 0; break; } } break; } } } if (iIndex > 0) { type1FontData.aCharMetrics[iIndex] = this; } }
//----------------------------------------------------------------------------------------------------x /// <summary></summary> /// <param name="sKey"></param> /// <param name="afm"></param> public PdfFontPropData(String sKey, Type1FontData afm) { this.sKey = sKey; this.afm = afm; Init(); }