protected static void ReadValue(CFFStream stream, CSValue value, int stemCount) { short v = stream.ReadByte(); switch (v) { case 12: value.isOperator = true; value.value = 12; value.op = stream.ReadByte(); return; case 19: case 20: value.isOperator = true; value.value = v; int count = (int)Math.Ceiling((double)stemCount / 8); if (count == 0) { count = 1; } value.trails = stream.ReadBytes(count); break; case 28: value.isOperator = false; value.value = stream.ReadInt16(); return; case 247: case 248: case 249: case 250: value.isOperator = false; value.value = (v - 247) * 256 + stream.ReadByte() + 108; return; case 251: case 252: case 253: case 254: value.isOperator = false; value.value = -((v - 251) * 256) - stream.ReadByte() - 108; return; case 255: value.isOperator = false; value.value = stream.ReadInt32(); return; } if (v >= 32 && v <= 246) { value.isOperator = false; value.value = v - 139; return; } value.isOperator = true; value.value = v; }
public CFFCharString() { stack = new List <int>(); stream = new CFFStream(); value = new CSValue(); point = new Point(); random = new Random(); storage = new int[MaxStorageSize]; }
public static string Decode(byte[] data) { if (data == null || data.Length <= 0) { return(""); } //MemoryStream stream = new MemoryStream(data); //BinaryReaderFont reader = new BinaryReaderFont(stream); CFFStream stream = new CFFStream(); stream.Push(data); CSValue value = new CSValue(); int stackCount = 0; int stemCount = 0; int length = data.Length; StringBuilder builder = new StringBuilder(); while (stream.Position < length) { ReadValue(stream, value, stemCount); if (value.isOperator) { string name = ToOperatorName(value); if (name.Contains("stem")) { stemCount += stackCount / 2; } builder.Append(name); if (name.Contains("mask")) { stemCount += stackCount / 2; for (int i = 0; i < value.trails.Length; i++) { builder.AppendFormat(" 0x{0:X2}", value.trails[i]); } } builder.AppendLine(); stackCount = 0; continue; } stackCount++; builder.AppendFormat("{0} ", value.value); } //reader.Close(); //stream.Close(); //reader.Dispose(); //stream.Dispose(); return(builder.ToString()); }