示例#1
0
        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;
        }
示例#2
0
 public CFFCharString()
 {
     stack   = new List <int>();
     stream  = new CFFStream();
     value   = new CSValue();
     point   = new Point();
     random  = new Random();
     storage = new int[MaxStorageSize];
 }
示例#3
0
        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());
        }