Ejemplo n.º 1
0
        private static void UpdateDataProperties(TrackObjectShape shapeData, byte[] data, int readFrom)
        {
            shapeData.Offset1 = BitConverter.ToInt16(new[] { data[4], data[5] }, 0);
            shapeData.Offset2 = BitConverter.ToInt16(new[] { data[8], data[9] }, 0);
            shapeData.Offset3 = BitConverter.ToInt16(new[] { data[12], data[13] }, 0);
            shapeData.Offset4 = BitConverter.ToInt16(new[] { data[16], data[17] }, 0);
            shapeData.Offset5 = BitConverter.ToInt16(new[] { data[20], data[21] }, 0);
            shapeData.Offset6 = BitConverter.ToInt16(new[] { data[24], data[25] }, 0);
            shapeData.Offset7 = BitConverter.ToInt16(new[] { data[28], data[29] }, 0);

            int data0Length = shapeData.Offset2 - shapeData.Offset1;
            int data1Length = shapeData.Offset3 - shapeData.Offset2;
            int data2Length = shapeData.Offset6 - shapeData.Offset3;
            int data3Length = shapeData.Offset4 - shapeData.Offset6;
            int data4Length = shapeData.Offset5 - shapeData.Offset4;
            int data5Length = shapeData.Offset7 - shapeData.Offset5;

            int data0Start = 78;
            int data1Start = data0Start + data0Length;
            int data2Start = data1Start + data1Length;
            int data3Start = data2Start + data2Length;
            int data4Start = data3Start + data3Length;
            int data5Start = data4Start + data4Length;

            int pointsStart  = data4Start;
            int pointsLength = data4Length;

            int vectorsStart  = data5Start;
            int vectorsLength = data5Length;

            //1 15638    4
            //2 15642    4
            //3 15646   28
            //6 15674    8
            //4 15682   32  (points?)
            //5 15714   20  (vectors)
            //7 15734   96
            //  15830
            //  15830

            var scaleValues = GetScaleValues(data, data0Start);

            shapeData.ScaleValues = scaleValues;

            byte[] pointData = new byte[pointsLength];
            Array.Copy(data, pointsStart, pointData, 0, pointsLength);

            var points = GetPoints(pointData);

            shapeData.RawPoints.AddRange(points.Item1);
            //shapeData.PointsAdditionalBytes = points.Item2;
            shapeData.UpdatePoints();

            byte[] vectorData = new byte[vectorsLength];
            Array.Copy(data, vectorsStart, vectorData, 0, vectorsLength);

            var vectors = GetVectors(vectorData);

            shapeData.Vectors.AddRange(vectors);
        }
Ejemplo n.º 2
0
        public static List <TrackObjectShape> Read(BinaryReader reader, int trackOffset)
        {
            reader.BaseStream.Position = 4124;

            short count = reader.ReadInt16();

            reader.BaseStream.Position += 2;

            var offsets = new List <int>();

            // list of offsets
            for (int i = 0; i < count; i++)
            {
                int offset = reader.ReadInt32();
                offsets.Add(offset);
            }

            var objects = new List <TrackObjectShape>();

            var startPos = 4128;

            var sortedOffsets = new List <int>();

            foreach (var offset in offsets)
            {
                sortedOffsets.Add(offset);
            }

            sortedOffsets.Sort();

            // foreach offset, read data between offset location and next offset location
            for (int headerIndex = 0; headerIndex < offsets.Count; headerIndex++)
            {
                var loopOffset = offsets[headerIndex];

                int nextOffset;

                if (offsets.Any(of => of > loopOffset))
                {
                    nextOffset = offsets.Where(of => of > loopOffset).ToList().Min();
                }
                else
                {
                    nextOffset = trackOffset - startPos;
                }

                var readFrom     = startPos + loopOffset;
                var lengthToRead = nextOffset - loopOffset;

                reader.BaseStream.Position = readFrom;
                byte[] data = reader.ReadBytes(lengthToRead);

                var dataIndex = sortedOffsets.IndexOf(loopOffset);

                var shape = new TrackObjectShape(headerIndex, dataIndex);
                shape.AllData = data;

                UpdateDataProperties(shape, data, readFrom);

                objects.Add(shape);
            }

            return(objects);
        }