public PathInfo(ImageResource imgRes) : base(imgRes) { BinaryPSDReader reader = imgRes.GetDataReader(); this.PathNum = this.ID - 2000; this.ID = 2000; ushort numKnots = 0; int cnt = 0; this.Commands = new List <object>(); while (reader.BytesToEnd > 0) { RecordType rtype = (RecordType)(int)reader.ReadUInt16(); //Should always start with PathFill (0) if (cnt == 0 && rtype != RecordType.PathFill) { throw new Exception("PathInfo start error!"); } switch (rtype) { case RecordType.InitialFill: reader.BaseStream.Position += 1; bool allPixelStart = reader.ReadBoolean(); reader.BaseStream.Position += 22; break; case RecordType.PathFill: if (cnt != 0) { throw new Exception("Path fill?!?"); } reader.BaseStream.Position += 24; break; case RecordType.Clipboard: ERectangleF rct = new ERectangleF(); rct.Top = reader.ReadPSDSingle(); rct.Left = reader.ReadPSDSingle(); rct.Bottom = reader.ReadPSDSingle(); rct.Right = reader.ReadPSDSingle(); Clipboard clp = new Clipboard(); clp.Rectangle = rct; clp.Scale = reader.ReadPSDSingle(); reader.BaseStream.Position += 4; this.Commands.Add(clp); break; case RecordType.ClosedPathLength: case RecordType.OpenPathLength: numKnots = reader.ReadUInt16(); reader.BaseStream.Position += 22; NewPath np = new NewPath(); np.Open = (rtype == RecordType.OpenPathLength); this.Commands.Add(np); break; case RecordType.ClosedPathBezierKnotLinked: case RecordType.ClosedPathBezierKnotUnlinked: case RecordType.OpenPathBezierKnotLinked: case RecordType.OpenPathBezierKnotUnlinked: BezierKnot bz = new BezierKnot(); EPointF[] pts = new EPointF[3]; for (int i = 0; i < 3; i++) { float y = reader.ReadPSDFixedSingle(); //y comes first... pts[i] = new EPointF(reader.ReadPSDFixedSingle(), y) / 256; } bz.Control1 = pts[0]; bz.Anchor = pts[1]; bz.Control2 = pts[2]; bz.Linked = (rtype == RecordType.ClosedPathBezierKnotLinked || rtype == RecordType.OpenPathBezierKnotLinked); //bz.Open = (rtype == RecordType.OpenPathBezierKnotLinked || rtype == RecordType.OpenPathBezierKnotUnlinked); this.Commands.Add(bz); numKnots--; break; } cnt++; } reader.Close(); }