public static void Preprocess(string originalFile, string outputFile, string game, ILog messageLog) { EACodeLanguage eaCodeLanguage = Program.Languages [game]; using (IPreprocessor preprocessor = (IPreprocessor) new Preprocessor(messageLog)) { preprocessor.AddReserved(eaCodeLanguage.GetCodeNames()); preprocessor.AddDefined(new string[] { "_" + game + "_", "_EA_" }); using (StreamReader streamReader = File.OpenText(originalFile)) { using (IInputStream inputStream = (IInputStream) new PreprocessingInputStream((TextReader)streamReader, preprocessor)) { StringWriter stringWriter = new StringWriter(); while (true) { string str = inputStream.ReadLine(); if (str != null) { stringWriter.WriteLine(str); } else { break; } } messageLog.AddMessage("Processed code:\n" + stringWriter.ToString() + "\nEnd processed code"); } } } }
/** * <summary>Parses the character-code-to-unicode mapping [PDF:1.6:5.9.1].</summary> */ public Dictionary <ByteArray, int> Parse( ) { Dictionary <ByteArray, int> codes = new Dictionary <ByteArray, int>(); string line; Regex linePattern = new Regex("(\\S+)\\s+(.+)"); while ((line = stream.ReadLine()) != null) { MatchCollection lineMatches = linePattern.Matches(line); if (lineMatches.Count < 1) { continue; } Match lineMatch = lineMatches[0]; string key = lineMatch.Groups[1].Value; if (key.Equals("/Encoding")) { // Skip to the encoding array entries! stream.ReadLine(); string encodingLine; Regex encodingLinePattern = new Regex("dup (\\S+) (\\S+) put"); while ((encodingLine = stream.ReadLine()) != null) { MatchCollection encodingLineMatches = encodingLinePattern.Matches(encodingLine); if (encodingLineMatches.Count < 1) { break; } Match encodingLineMatch = encodingLineMatches[0]; byte[] inputCode = new byte[] { (byte)Int32.Parse(encodingLineMatch.Groups[1].Value) }; string name = encodingLineMatch.Groups[2].Value.Substring(1); codes[new ByteArray(inputCode)] = GlyphMapping.NameToCode(name).Value; } break; } } return(codes); }
/** * <summary>Loads the font header [AFM:4.1:3,4.1-4.4].</summary> */ private void LoadFontHeader( ) { string line; Regex linePattern = new Regex("(\\S+)\\s+(.+)"); while ((line = FontData.ReadLine()) != null) { MatchCollection lineMatches = linePattern.Matches(line); if (lineMatches.Count < 1) { continue; } Match lineMatch = lineMatches[0]; string key = lineMatch.Groups[1].Value; if (key.Equals("Ascender")) { Metrics.Ascender = ConvertUtils.ParseAsIntInvariant(lineMatch.Groups[2].Value); } else if (key.Equals("CapHeight")) { Metrics.CapHeight = ConvertUtils.ParseAsIntInvariant(lineMatch.Groups[2].Value); } else if (key.Equals("Descender")) { Metrics.Descender = ConvertUtils.ParseAsIntInvariant(lineMatch.Groups[2].Value); } else if (key.Equals("EncodingScheme")) { Metrics.IsCustomEncoding = lineMatch.Groups[2].Value.Equals("FontSpecific"); } else if (key.Equals("FontBBox")) { string[] coordinates = Regex.Split(lineMatch.Groups[2].Value, "\\s+"); Metrics.XMin = ConvertUtils.ParseAsIntInvariant(coordinates[0]); Metrics.YMin = ConvertUtils.ParseAsIntInvariant(coordinates[1]); Metrics.XMax = ConvertUtils.ParseAsIntInvariant(coordinates[2]); Metrics.YMax = ConvertUtils.ParseAsIntInvariant(coordinates[3]); } else if (key.Equals("FontName")) { Metrics.FontName = lineMatch.Groups[2].Value; } else if (key.Equals("IsFixedPitch")) { Metrics.IsFixedPitch = Boolean.Parse(lineMatch.Groups[2].Value); } else if (key.Equals("ItalicAngle")) { Metrics.ItalicAngle = ConvertUtils.ParseFloatInvariant(lineMatch.Groups[2].Value); } else if (key.Equals("StdHW")) { Metrics.StemH = ConvertUtils.ParseAsIntInvariant(lineMatch.Groups[2].Value); } else if (key.Equals("StdVW")) { Metrics.StemV = ConvertUtils.ParseAsIntInvariant(lineMatch.Groups[2].Value); } else if (key.Equals("UnderlinePosition")) { Metrics.UnderlinePosition = ConvertUtils.ParseAsIntInvariant(lineMatch.Groups[2].Value); } else if (key.Equals("UnderlineThickness")) { Metrics.UnderlineThickness = ConvertUtils.ParseAsIntInvariant(lineMatch.Groups[2].Value); } else if (key.Equals("Weight")) { Metrics.Weight = lineMatch.Groups[2].Value; } else if (key.Equals("XHeight")) { Metrics.XHeight = ConvertUtils.ParseAsIntInvariant(lineMatch.Groups[2].Value); } else if (key.Equals("StartCharMetrics")) { break; } } if (Metrics.Ascender == 0) { Metrics.Ascender = Metrics.YMax; } if (Metrics.Descender == 0) { Metrics.Descender = Metrics.YMin; } }
/** * <summary>Loads the font header [AFM:4.1:3,4,4.1,4.2].</summary> */ private void LoadFontHeader( ) { string line; Regex linePattern = new Regex("(\\S+)\\s+(.+)"); while ((line = FontData.ReadLine()) != null) { MatchCollection lineMatches = linePattern.Matches(line); if (lineMatches.Count < 1) { continue; } Match lineMatch = lineMatches[0]; string key = lineMatch.Groups[1].Value; switch (key) { case "FontName": Metrics.FontName = lineMatch.Groups[2].Value; break; case "Weight": Metrics.Weight = lineMatch.Groups[2].Value; break; case "ItalicAngle": Metrics.ItalicAngle = Single.Parse(lineMatch.Groups[2].Value); break; case "IsFixedPitch": Metrics.IsFixedPitch = lineMatch.Groups[2].Value.Equals("true"); break; case "FontBBox": { string[] coordinates = Regex.Split(lineMatch.Groups[2].Value, "\\s+"); Metrics.XMin = Int16.Parse(coordinates[0]); Metrics.YMin = Int16.Parse(coordinates[1]); Metrics.XMax = Int16.Parse(coordinates[2]); Metrics.YMax = Int16.Parse(coordinates[3]); } break; case "UnderlinePosition": Metrics.UnderlinePosition = Int16.Parse(lineMatch.Groups[2].Value); break; case "UnderlineThickness": Metrics.UnderlineThickness = Int16.Parse(lineMatch.Groups[2].Value); break; case "EncodingScheme": Metrics.IsCustomEncoding = lineMatch.Groups[2].Value.Equals("FontSpecific"); break; case "CapHeight": Metrics.CapHeight = Int16.Parse(lineMatch.Groups[2].Value); break; case "XHeight": Metrics.XHeight = Int16.Parse(lineMatch.Groups[2].Value); break; case "Ascender": Metrics.Ascender = Int16.Parse(lineMatch.Groups[2].Value); break; case "Descender": Metrics.Descender = Int16.Parse(lineMatch.Groups[2].Value); break; case "StdHW": Metrics.StemH = Int16.Parse(lineMatch.Groups[2].Value); break; case "StdVW": Metrics.StemV = Int16.Parse(lineMatch.Groups[2].Value); break; case "StartCharMetrics": goto endParsing; } } endParsing: if (Metrics.Ascender == 0) { Metrics.Ascender = Metrics.YMax; } if (Metrics.Descender == 0) { Metrics.Descender = Metrics.YMin; } }