private void ReadData(Cardfile file, SeekableBinaryReader reader) { uint cardCount = reader.ReadUInt32(); uint cardIndex = reader.ReadUInt32(); reader.Skip(20); if (cardIndex > cardCount) { throw new ArgumentException("Not a valid .CRDX file!"); } else if (cardIndex == cardCount) { file.FrontIndex = -1; } for (int i = 0; i < cardCount; ++i) { long textOffset = reader.ReadInt64(); long fileOffset = reader.ReadInt64(); reader.Skip(12); uint indexLength = reader.ReadUInt32(); string index = encoding.GetString(reader.ReadBytes((int)indexLength)); long oldPosition = reader.Position; Card newCard = new Card(index); reader.Seek(textOffset, SeekOrigin.Begin); ulong textLength = reader.ReadUInt64(); byte[] buffer = reader.ReadBytes((int)textLength); newCard.Contents = encoding.GetString(buffer); if (fileOffset >= 0) { reader.Seek(fileOffset, SeekOrigin.Begin); uint nameLength = reader.ReadUInt32(); byte[] nameData = reader.ReadBytes((int)nameLength); uint mimeLength = reader.ReadUInt32(); byte[] mimeData = reader.ReadBytes((int)mimeLength); ulong attachmentLength = reader.ReadUInt64(); byte[] attachmentData = reader.ReadBytes((int)textLength); AttachmentFile attachment = new AttachmentFile(encoding.GetString(nameData), encoding.GetString(mimeData), attachmentData); newCard.Attachment = attachment; } file.AddCard(newCard); reader.Seek(oldPosition, SeekOrigin.Begin); } file.FrontIndex = (int)cardIndex; }
private void ReadMGC(Cardfile file, BinaryReader reader) { ushort cardCount = reader.ReadUInt16(); long oldPosition; for (int i = 0; i < cardCount; ++i) { reader.BaseStream.Seek(6, SeekOrigin.Current); // read card info uint pos = reader.ReadUInt32(); byte flags = reader.ReadByte(); byte[] titleRaw = reader.ReadBytes(41); string index = ReadNullTerminated8String(titleRaw); oldPosition = reader.BaseStream.Position; // read card reader.BaseStream.Seek(pos, SeekOrigin.Begin); ushort bitmapLength = reader.ReadUInt16(); AttachmentFile attachment = null; if (bitmapLength != 0) { // has graphic ushort width = reader.ReadUInt16(); ushort height = reader.ReadUInt16(); ushort x = reader.ReadUInt16(); ushort y = reader.ReadUInt16(); byte[] bitmap = reader.ReadBytes(bitmapLength); Rectangle dstRect = new Rectangle(0, 0, 320, 160); Rectangle srcRect = new Rectangle(x, y, width, height); if (!dstRect.Contains(srcRect)) { dstRect = new Rectangle(0, 0, Math.Max(x + width, dstRect.Width), Math.Max(y + height, dstRect.Height)); } Bitmap result = new Bitmap(dstRect.Width, dstRect.Height, PixelFormat.Format24bppRgb); Bitmap target = new Bitmap(dstRect.Width, dstRect.Height, System.Drawing.Imaging.PixelFormat.Format1bppIndexed); target.Palette.Entries[0] = Color.FromArgb(0, 0, 0); target.Palette.Entries[1] = Color.FromArgb(255, 255, 255); BitmapData targetData = target.LockBits(dstRect, ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed); for (int column = 0; column < dstRect.Height; ++column) { FillMemory(targetData.Scan0 + targetData.Stride * column, (byte)255, targetData.Stride); } target.UnlockBits(targetData); targetData = target.LockBits(srcRect, ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed); int srcStride = (width + 7) / 8; if ((srcStride & 1) == 1) { srcStride += 1; } for (int column = 0; column < height; ++column) { Marshal.Copy(bitmap, srcStride * column, targetData.Scan0 + targetData.Stride * column, srcStride); } target.UnlockBits(targetData); using (Graphics g = Graphics.FromImage(result)) g.DrawImage(target, 0, 0); using (MemoryStream mem = new MemoryStream()) { result.Save(mem, ImageFormat.Bmp); mem.Flush(); attachment = new AttachmentFile("IMAGE.BMP", "image/bmp", mem.ToArray()); } } ushort textlen = reader.ReadUInt16(); byte[] textRaw = reader.ReadBytes(textlen); string text = ReadNullTerminated8String(textRaw); reader.BaseStream.Seek(oldPosition, SeekOrigin.Begin); Card card = new Card(index, text); if (attachment != null) { card.Attachment = attachment; } file.AddCard(card); } }
private void ReadDKO(Cardfile file, BinaryReader reader) { uint nextObjectID = reader.ReadUInt32(); ushort cardCount = reader.ReadUInt16(); long oldPosition; for (int i = 0; i < cardCount; ++i) { reader.BaseStream.Seek(6, SeekOrigin.Current); // read card info uint pos = reader.ReadUInt32(); byte flags = reader.ReadByte(); byte[] titleRaw = reader.ReadBytes(82); string index = ReadNullTerminated16String(titleRaw); oldPosition = reader.BaseStream.Position; // read card reader.BaseStream.Seek(pos, SeekOrigin.Begin); ushort objectFlags = reader.ReadUInt16(); AttachmentFile attachment = null; if (objectFlags != 0) { // contains OLE object uint objectId = reader.ReadUInt32(); // get length of OLE object by skipping over it long beforeObj = reader.BaseStream.Position; OleObject obj = ReadOLE(reader); long oleObjLen = reader.BaseStream.Position - beforeObj; reader.BaseStream.Seek(beforeObj, SeekOrigin.Begin); obj.Data = reader.ReadBytes((int)oleObjLen); bool customAttachment = false; if (obj.Format == OleType.Static || obj.Format == OleType.Embedded) { customAttachment = TryParseOleAttachment(obj, ref attachment); } if (!customAttachment) { attachment = new AttachmentFile("OBJECT.OLE", "application/octet-stream", obj.Data); } // then skip other attributes /*ushort charWidth =*/ reader.ReadUInt16(); /*ushort charHeight =*/ reader.ReadUInt16(); /*ushort rectLeft =*/ reader.ReadUInt16(); /*ushort rectTop =*/ reader.ReadUInt16(); /*ushort rectRight =*/ reader.ReadUInt16(); /*ushort rectBottom =*/ reader.ReadUInt16(); /*ushort objectType =*/ reader.ReadUInt16(); } ushort textlen = reader.ReadUInt16(); byte[] textRaw = reader.ReadBytes(textlen * 2 + 3); string text = ReadNullTerminated16String(textRaw); reader.BaseStream.Seek(oldPosition, SeekOrigin.Begin); Card card = new Card(index, text); if (attachment != null) { card.Attachment = attachment; } file.AddCard(card); } }