Beispiel #1
0
    public static byte[] Encode(Bitmap bitmap)
    {
        WriteStream outStream = new WriteStream();

        PNGHeader header = new PNGHeader {
            Signature = PNGSignature,
        };

        outStream.Write(header, true);
        WriteChunk(outStream, "IHDR", new PNGIHDR {
            Width             = bitmap.Width,
            Height            = bitmap.Height,
            BitDepth          = 8,
            ColorType         = 6,
            CompressionMethod = 0,
            FilterMethod      = 0,
            InterlaceMethod   = 0,
        }.ToBytes(true));

        byte[] scanlines    = new byte[bitmap.Width * bitmap.Height * 4 + bitmap.Height];
        int    scanlineSize = bitmap.Width * 4;

        for (int scanline = 0; scanline < bitmap.Height; scanline++)
        {
            int offset = scanline * scanlineSize;
            Array.Copy(bitmap.Pixels, offset, scanlines, offset + scanline + 1, scanlineSize);
        }

        using (MemoryStream idatStream = new MemoryStream()) {
            idatStream.Write(new PNGIDATHeader()
            {
                ZLibMethodFlags = 0x78,
                AdditionalFlags = 0x1,
            }.ToBytes(true));

            using (DeflateStream compressionStream = new DeflateStream(idatStream, CompressionMode.Compress, true))
                compressionStream.Write(scanlines);

            idatStream.Write(new PNGIDATFooter()
            {
                CheckValue = Alder32(scanlines),
            }.ToBytes(true));

            WriteChunk(outStream, "IDAT", idatStream.ToArray());
        }

        WriteChunk(outStream, "IEND", new byte[0]);

        return(outStream.ToArray());
    }
Beispiel #2
0
    public byte[] ToBuffer()
    {
        WriteStream data = new WriteStream();

        data.u24be(0xff0201);
        data.u24be(SnapShot.Length); data.Write(SnapShot);
        data.Write("a"); data.u24be(sizeof(byte)); data.u8(A);
        data.Write("b"); data.u24be(sizeof(byte)); data.u8(B);
        data.Write("bgatrb"); data.u24be(sizeof(byte)); data.u8(BgAttrib);
        data.Write("bgnatrb"); data.u24be(sizeof(byte)); data.u8(BgnAttrib);
        data.Write("bgntw"); data.u24be(sizeof(ushort)); data.u16be(BgnTileWord);
        data.Write("bgp"); data.u24be(ObjPaletteData.Length); data.Write(BgPaletteData);
        data.Write("bgtw"); data.u24be(sizeof(ushort)); data.u16be(BgTileWord);
        data.Write("bios"); data.u24be(sizeof(bool)); data.boolean(BiosMode);
        data.Write("c"); data.u24be(sizeof(byte)); data.u8(C);
        data.Write("c1mastr"); data.u24be(sizeof(bool)); data.boolean(Ch1Master);
        data.Write("c2mastr"); data.u24be(sizeof(bool)); data.boolean(Ch2Master);
        data.Write("c3mastr"); data.u24be(sizeof(bool)); data.boolean(Ch3Master);
        data.Write("c4mastr"); data.u24be(sizeof(bool)); data.boolean(Ch4Master);
        data.Write("cc"); data.u24be(sizeof(uint)); data.u32be(CycleCounter);
        data.Write("csprite"); data.u24be(sizeof(byte)); data.u8(CurrentSprite);
        data.Write("d"); data.u24be(sizeof(byte)); data.u8(D);
        data.Write("dmadst"); data.u24be(sizeof(ushort)); data.u16be(DmaDestination);
        data.Write("dmasrc"); data.u24be(sizeof(ushort)); data.u16be(DmaSource);
        data.Write("dmgcols"); data.u24be(DmgColorsBgr15.Length * 2); data.Write(DmgColorsBgr15);
        data.Write("dut1ctr"); data.u24be(sizeof(uint)); data.u32be(Duty1NextPosUpdate);
        data.Write("dut1hi"); data.u24be(sizeof(bool)); data.boolean(Duty1High);
        data.Write("dut1pos"); data.u24be(sizeof(byte)); data.u8(Duty1Pos);
        data.Write("dut2ctr"); data.u24be(sizeof(uint)); data.u32be(Duty2NextPosUpdate);
        data.Write("dut2hi"); data.u24be(sizeof(bool)); data.boolean(Duty2High);
        data.Write("dut2pos"); data.u24be(sizeof(byte)); data.u8(Duty2Pos);
        data.Write("e"); data.u24be(sizeof(byte)); data.u8(E);
        data.Write("edM0tim"); data.u24be(sizeof(uint)); data.u32be(EnableDisplayM0Time);
        data.Write("endx"); data.u24be(sizeof(byte)); data.u8(EndX);
        data.Write("env1ctr"); data.u24be(sizeof(uint)); data.u32be(Env1Counter);
        data.Write("env1vol"); data.u24be(sizeof(byte)); data.u8(Env1Volume);
        data.Write("env2ctr"); data.u24be(sizeof(uint)); data.u32be(Env2Counter);
        data.Write("env2vol"); data.u24be(sizeof(byte)); data.u8(Env2Volume);
        data.Write("env4ctr"); data.u24be(sizeof(uint)); data.u32be(Env4Counter);
        data.Write("env4vol"); data.u24be(sizeof(byte)); data.u8(Env4Volume);
        data.Write("f"); data.u24be(sizeof(byte)); data.u8(F);
        data.Write("fetched"); data.u24be(sizeof(bool)); data.boolean(Fetched);
        data.Write("h"); data.u24be(sizeof(byte)); data.u8(H);
        data.Write("h3datat"); data.u24be(sizeof(uint)); data.u32be(HuC3DataTime);
        data.Write("h3halt"); data.u24be(sizeof(bool)); data.boolean(HuC3Halted);
        data.Write("h3haltt"); data.u24be(sizeof(uint)); data.u32be(HuC3HaltTime);
        data.Write("h3irac"); data.u24be(sizeof(bool)); data.boolean(HuC3IrReceivingPulse);
        data.Write("h3ircy"); data.u24be(sizeof(uint)); data.u32be(HuC3IrBaseCycle);
        data.Write("h3mf"); data.u24be(sizeof(byte)); data.u8(HuC3ModeFlag);
        data.Write("h3rv"); data.u24be(sizeof(byte)); data.u8(HuC3RamValue);
        data.Write("h3shft"); data.u24be(sizeof(byte)); data.u8(HuC3Shift);
        data.Write("h3writt"); data.u24be(sizeof(uint)); data.u32be(HuC3WritingTime);
        data.Write("halt"); data.u24be(sizeof(bool)); data.boolean(Halted);
        data.Write("hdma"); data.u24be(sizeof(bool)); data.boolean(HdmaTransfer);
        data.Write("hlthdma"); data.u24be(sizeof(byte)); data.u8(HaltHdmaState);
        data.Write("hram"); data.u24be(HRAM.Length); data.Write(HRAM);
        data.Write("huc3ram"); data.u24be(sizeof(byte)); data.u8(Huc3RAMFlag);
        data.Write("ime"); data.u24be(sizeof(bool)); data.boolean(IME);
        data.Write("iscgb"); data.u24be(sizeof(bool)); data.boolean(IsCgb);
        data.Write("l"); data.u24be(sizeof(byte)); data.u8(L);
        data.Write("lcdsirq"); data.u24be(sizeof(bool)); data.boolean(PendingLcdstatIrq);
        data.Write("ldivup"); data.u24be(sizeof(uint)); data.u32be(DivLastUpdate);
        data.Write("len1ctr"); data.u24be(sizeof(uint)); data.u32be(Len1Counter);
        data.Write("len1val"); data.u24be(sizeof(ushort)); data.u16be(Len1LengthCounter);
        data.Write("len2ctr"); data.u24be(sizeof(uint)); data.u32be(Len2Counter);
        data.Write("len2val"); data.u24be(sizeof(ushort)); data.u16be(Len2LengthCounter);
        data.Write("len3ctr"); data.u24be(sizeof(uint)); data.u32be(Len3Counter);
        data.Write("len3val"); data.u24be(sizeof(ushort)); data.u16be(Len3LengthCounter);
        data.Write("len4ctr"); data.u24be(sizeof(uint)); data.u32be(Len4Counter);
        data.Write("len4val"); data.u24be(sizeof(ushort)); data.u16be(Len4LengthCounter);
        data.Write("lfsrctr"); data.u24be(sizeof(uint)); data.u32be(LFSRCounter);
        data.Write("lfsrreg"); data.u24be(sizeof(ushort)); data.u16be(LFSRReg);
        data.Write("lodmaup"); data.u24be(sizeof(uint)); data.u32be(LastOamDmaUpdate);
        data.Write("ltimaup"); data.u24be(sizeof(uint)); data.u32be(TimaLastUpdate);
        data.Write("lwavrdt"); data.u24be(sizeof(uint)); data.u32be(WaveLastReadTime);
        data.Write("lyc"); data.u24be(sizeof(byte)); data.u8(LYC);
        data.Write("m0lyc"); data.u24be(sizeof(byte)); data.u8(M0LYC);
        data.Write("m0time"); data.u24be(sizeof(ushort)); data.u16be(LastM0Time);
        data.Write("mbclock"); data.u24be(sizeof(bool)); data.boolean(MbcLockup);
        data.Write("minintt"); data.u24be(sizeof(uint)); data.u32be(MinIntTime);
        data.Write("nm0irq"); data.u24be(sizeof(ushort)); data.u16be(NextM0Irq);
        data.Write("nr10"); data.u24be(sizeof(byte)); data.u8(Nr10);
        data.Write("nr13"); data.u24be(sizeof(byte)); data.u8(Nr13);
        data.Write("nr14"); data.u24be(sizeof(byte)); data.u8(Nr14);
        data.Write("nr23"); data.u24be(sizeof(byte)); data.u8(Nr23);
        data.Write("nr24"); data.u24be(sizeof(byte)); data.u8(Nr24);
        data.Write("nr33"); data.u24be(sizeof(byte)); data.u8(Nr33);
        data.Write("nr34"); data.u24be(sizeof(byte)); data.u8(Nr34);
        data.Write("nr44"); data.u24be(sizeof(byte)); data.u8(Nr44);
        data.Write("nsprite"); data.u24be(sizeof(byte)); data.u8(NextSprite);
        data.Write("objp"); data.u24be(ObjPaletteData.Length); data.Write(ObjPaletteData);
        data.Write("odmapos"); data.u24be(sizeof(byte)); data.u8(OamDmaPos);
        data.Write("oldwy"); data.u24be(sizeof(byte)); data.u8(OldWy);
        data.Write("op"); data.u24be(sizeof(byte)); data.u8(Opcode);
        data.Write("pc"); data.u24be(sizeof(ushort)); data.u16be(PC);
        data.Write("ppur0"); data.u24be(sizeof(byte)); data.u8(PPUReg0);
        data.Write("ppur1"); data.u24be(sizeof(byte)); data.u8(PPUReg1);
        data.Write("ppustat"); data.u24be(sizeof(byte)); data.u8(PPUState);
        data.Write("rambank"); data.u24be(sizeof(byte)); data.u8(RamBank);
        data.Write("rambmod"); data.u24be(sizeof(byte)); data.u8(RamBankMode);
        data.Write("rombank"); data.u24be(sizeof(ushort)); data.u16be(RomBank);
        data.Write("rtcdh"); data.u24be(sizeof(byte)); data.u8(RTCDataDh);
        data.Write("rtcdl"); data.u24be(sizeof(byte)); data.u8(RTCDataDl);
        data.Write("rtch"); data.u24be(sizeof(byte)); data.u8(RTCDataH);
        data.Write("rtchalt"); data.u24be(sizeof(uint)); data.u32be(RTCHaltTime);
        data.Write("rtclld"); data.u24be(sizeof(bool)); data.boolean(RTCLastLatchData);
        data.Write("rtcm"); data.u24be(sizeof(byte)); data.u8(RTCDataM);
        data.Write("rtcs"); data.u24be(sizeof(byte)); data.u8(RTCDataS);
        data.Write("serialt"); data.u24be(sizeof(uint)); data.u32be(NextSerialTime);
        data.Write("sgbattr"); data.u24be(SgbAttributes.Length); data.Write(SgbAttributes);
        data.Write("sgbcmd"); data.u24be(SgbCommand.Length); data.Write(SgbCommand);
        data.Write("sgbcmdi"); data.u24be(sizeof(byte)); data.u8(SgbCommandIndex);
        data.Write("sgbcols"); data.u24be(SgbColors.Length * 2); data.Write(SgbColors);
        data.Write("sgbjoyi"); data.u24be(sizeof(byte)); data.u8(SgbJoypadIndex);
        data.Write("sgbjoym"); data.u24be(sizeof(byte)); data.u8(SgbJoypadMask);
        data.Write("sgbmask"); data.u24be(sizeof(byte)); data.u8(SgbMask);
        data.Write("sgbpc"); data.u24be(sizeof(byte)); data.u8(SgbPendingCount);
        data.Write("sgbpend"); data.u24be(sizeof(byte)); data.u8(SgbPending);
        data.Write("sgbpkt"); data.u24be(SgbPacket.Length); data.Write(SgbPacket);
        data.Write("sgbsys"); data.u24be(SgbSystemColors.Length * 2); data.Write(SgbSystemColors);
        data.Write("sgbxfer"); data.u24be(sizeof(byte)); data.u8(SgbTransfer);
        data.Write("skip"); data.u24be(sizeof(bool)); data.boolean(Skip);
        data.Write("sp"); data.u24be(sizeof(ushort)); data.u16be(SP);
        data.Write("spattr"); data.u24be(SpAttribList.Length); data.Write(SpAttribList);
        data.Write("spbyte0"); data.u24be(SpByte0List.Length); data.Write(SpByte0List);
        data.Write("spbyte1"); data.u24be(SpByte1List.Length); data.Write(SpByte1List);
        data.Write("sposbuf"); data.u24be(OamReaderBuffer.Length); data.Write(OamReaderBuffer);
        data.Write("spszbuf"); data.u24be(OamReaderSzBuffer.Length); data.Write(OamReaderSzBuffer);
        data.Write("spucntl"); data.u24be(sizeof(byte)); data.u8(SPULastUpdate);
        data.Write("spucntr"); data.u24be(sizeof(uint)); data.u32be(SPUCycleCounter);
        data.Write("sram"); data.u24be(SRAM.Length); data.Write(SRAM);
        data.Write("sramon"); data.u24be(sizeof(bool)); data.boolean(EnableRam);
        data.Write("stopped"); data.u24be(sizeof(bool)); data.boolean(Stopped);
        data.Write("swpcntr"); data.u24be(sizeof(uint)); data.u32be(SweepCounter);
        data.Write("swpneg"); data.u24be(sizeof(bool)); data.boolean(SweepNeg);
        data.Write("swpshdw"); data.u24be(sizeof(ushort)); data.u16be(SweepShadow);
        data.Write("timelc"); data.u24be(sizeof(uint)); data.u32be(LastCycles);
        data.Write("timelts"); data.u24be(sizeof(uint)); data.u32be(LastTimeSec);
        data.Write("timeltu"); data.u24be(sizeof(uint)); data.u32be(LastTimeUSec);
        data.Write("timesec"); data.u24be(sizeof(uint)); data.u32be(Seconds);
        data.Write("tmatime"); data.u24be(sizeof(uint)); data.u32be(TmaTime);
        data.Write("unhaltt"); data.u24be(sizeof(uint)); data.u32be(UnhaltTime);
        data.Write("vcycles"); data.u24be(sizeof(uint)); data.u32be(VideoCycles);
        data.Write("vram"); data.u24be(VRAM.Length); data.Write(VRAM);
        data.Write("wavectr"); data.u24be(sizeof(uint)); data.u32be(WaveCounter);
        data.Write("wavepos"); data.u24be(sizeof(byte)); data.u8(WavePos);
        data.Write("waveram"); data.u24be(WaveRAM.Length); data.Write(WaveRAM);
        data.Write("wavsmpl"); data.u24be(sizeof(byte)); data.u8(WaveSampleBuffer);
        data.Write("wemastr"); data.u24be(sizeof(bool)); data.boolean(weMaster);
        data.Write("windraw"); data.u24be(sizeof(byte)); data.u8(WinDrawState);
        data.Write("winypos"); data.u24be(sizeof(byte)); data.u8(WinYPos);
        data.Write("wram"); data.u24be(WRAM.Length); data.Write(WRAM);
        data.Write("wscx"); data.u24be(sizeof(byte)); data.u8(wSCX);
        data.Write("xpos"); data.u24be(sizeof(byte)); data.u8(XPos);

        return(data.ToArray());
    }