コード例 #1
0
ファイル: CrdxDecoder.cs プロジェクト: hisahi/Cardfile.NET
        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;
        }
コード例 #2
0
ファイル: CrdDecoder.cs プロジェクト: hisahi/Cardfile.NET
        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);
            }
        }
コード例 #3
0
ファイル: CrdDecoder.cs プロジェクト: hisahi/Cardfile.NET
        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);
            }
        }