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()); }
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()); }